Task01 线性回归

这篇博客详细介绍了线性回归的基本概念,包括原理、损失函数、代价函数和目标函数,探讨了优化方法如梯度下降法,并讨论了线性回归的评估指标。此外,还讲解了如何使用sklearn进行线性回归的实践操作。

1、线性回归的原理

2、线性回归损失函数、代价函数、目标函数

3、优化方法(梯度下降法、牛顿法、拟牛顿法等)

4、线性回归的评估指标

5、sklearn参数详解

一、线性回归的原理

二、线性回归损失函数、代价函数、目标函数

  • 损失函数(Loss Function):度量单样本预测的错误程度,损失函数值越小,模型就越好。
  • 代价函数(Cost Function):度量全部样本集的平均误差。
  • 目标函数(Object Function):代价函数和正则化函数,最终要优化的函数。


    常用的损失函数包括:0-1损失函数、平方损失函数、绝对损失函数、对数损失函数等;
    常用的代价函数包括:均方误差、均方根误差、平均绝对误差等。

思考题:既然代价函数已经可以度量样本集的平均误差,为什么还要设定目标函数?

当模型复杂度增加时,有可能对训练集可以模拟的很好,但是预测测试集的效果不好,出现过拟合现象,这就出现了所谓的“结构化风险”。结构风险最小化即为了防止过拟合而提出来的策略,定义模型复杂度为J(F),目标函数可表示为:

三、优化方法(梯度下降法、牛顿法、拟牛顿法等)

这个算法称为随机梯度下降法,随机梯度下降法的好处是,当数据点很多时,运行效率更高;缺点是,因为每次只针对一个样本更新参数,未必找到最快路径达到最优值,甚至有时候会出现参数在最小值附近徘徊而不是立即收敛。但当数据量很大的时候,随机梯度下降法经常优于批梯度下降法。

当J为凸函数时,梯度下降法相当于让参数不断向J的最小值位置移动

梯度下降法的缺陷:如果函数为非凸函数,有可能找到的并非全局最优值,而是局部最优值。

四、线性回归的评估指标

五、sklearn.linear_model参数详解

参考https://blog.youkuaiyun.com/weixin_39175124/article/details/79465558

 

生成数据

#生成数据
import numpy as np
#生成随机数
np.random.seed(1234)
x = np.random.rand(500,3)
#构建映射关系,模拟真实的数据待预测值,映射关系为y = 4.2 + 5.7*x1 + 10.8*x2,可自行设置值进行尝试
y = x.dot(np.array([4.2,5.7,10.8]))

1、先尝试调用sklearn的线性回归模型训练数据

import numpy as np
from sklearn.linear_model import LinearRegression
import matplotlib.pyplot as plt
%matplotlib inline

# 调用模型
lr = LinearRegression(fit_intercept=True)
# 训练模型
lr.fit(x,y)
print("估计的参数值为:%s" %(lr.coef_))
# 计算R平方
print('R2:%s' %(lr.score(x,y)))
# 任意设定变量,预测目标值
x_test = np.array([2,4,5]).reshape(1,-1)
y_hat = lr.predict(x_test)
print("预测值为: %s" %(y_hat))
估计的参数值为:[ 4.2  5.7 10.8]
R2:1.0
预测值为: [85.2]

2、最小二乘法的矩阵求解

class LR_LS():
    def __init__(self):
        self.w = None      
    def fit(self, X, y):
        # 最小二乘法矩阵求解
        #============================= show me your code =======================
        self.w = np.linalg.inv(X.T.dot(X)).dot(X.T).dot(y)
        #============================= show me your code =======================
    def predict(self, X):
        # 用已经拟合的参数值预测新自变量
        #============================= show me your code =======================
        y_pred = X.dot(self.w)
        #============================= show me your code =======================
        return y_pred

if __name__ == "__main__":
    lr_ls = LR_LS()
    lr_ls.fit(x,y)
    print("估计的参数值:%s" %(lr_ls.w))
    x_test = np.array([2,4,5]).reshape(1,-1)
    print("预测值为: %s" %(lr_ls.predict(x_test)))

 

估计的参数值:[ 4.2 5.7 10.8]

预测值为: [85.2]

3、梯度下降法

class LR_GD():
    def __init__(self):
        self.w = None     
    def fit(self,X,y,alpha=0.02,loss = 1e-10): # 设定步长为0.002,判断是否收敛的条件为1e-10
        y = y.reshape(-1,1) #重塑y值的维度以便矩阵运算
        [m,d] = np.shape(X) #自变量的维度
        self.w = np.zeros((d)) #将参数的初始值定为0
        tol = 1e5
        #============================= show me your code =======================
        while tol > loss:
            h_f = X.dot(self.w).reshape(-1,1) 
            theta = self.w + alpha*np.mean(X*(y - h_f),axis=0) #计算迭代的参数值
            tol = np.sum(np.abs(theta - self.w))
            self.w = theta
        #============================= show me your code =======================
    def predict(self, X):
        # 用已经拟合的参数值预测新自变量
        y_pred = X.dot(self.w)
        return y_pred  

if __name__ == "__main__":
    lr_gd = LR_GD()
    lr_gd.fit(x,y)
    print("估计的参数值为:%s" %(lr_gd.w))
    x_test = np.array([2,4,5]).reshape(1,-1)
    print("预测值为:%s" %(lr_gd.predict(x_test)))

 

估计的参数值为:[ 4.20000001 5.70000003 10.79999997]

预测值为:[85.19999995]

 

参考

吴恩达 CS229课程

周志华 《机器学习》

李航 《统计学习方法》

https://hangzhou.anjuke.com/

https://www.jianshu.com/p/e0eb4f4ccf3e

https://blog.youkuaiyun.com/qq_28448117/article/details/79199835

https://blog.youkuaiyun.com/weixin_39175124/article/details/79465558

模拟线性回归有多种方法,以下为几种常见的实现方式: - **使用matplotlib模拟线性回归**:结合相关代码,可得到线性回归的运行示意图。该图是动态展示的,当重复次数足够大时,损失函数会变少,得到的直线(曲线)会更加拟合区间上的离散点。理论知识可参考:https://blog.youkuaiyun.com/qq_45771939/article/details/119800382?ops_request_misc=&request_id=&biz_id=102&utm_term=%E7%BA%BF%E6%80%A7%E5%9B%9E%E5%BD%92&utm_medium=distribute.pc_search_result.none-task-blog-2~all~sobaiduweb~default-3-119800382.142v32pc_rank_34,185v2control&spm=1018.2226.3001.4187 [^1]。 - **使用Pytorch模拟线性回归**:可以直接使用pytorch封装好的神经网络模型来完成一个初步的线性回归问题。示例代码如下: ```python import numpy as np import torch from torch.utils import data from d2l import torch as d2l true_w = torch.tensor([2, -3.4]) true_b = 4.2 features, labels = d2l.synthetic_data(true_w, true_b, 1000) # 使用d2l,生成参数值为w,b的数据1000个 ``` 上述代码生成了数据集 [^2]。 - **使用keras模拟线性回归**:要求安装keras库,步骤如下: 1. 搭建模型,做一个简单的线性回归预测。目标是使得网络模型拟合一条 `y = 2*x + 1` 的函数图像。 2. 首先在 `y = 2*x + 1` 附近生成一些点,其中的x作为输入数据,y作为输出数据。 3. 训练一个神经网络模型,包括100个神经元的全连接层和最终1个神经元的输出层。 4. 训练大概1万次左右,即更新一万次参数。最后随机给出几个x,预测是否符合 `y = 2*x + 1` 的标准。 5. 给该模型做一个keras的可视化分析 [^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值