线性回归

线性回归
线性回归原理

线性回归本质上是数学上的线性逻辑关系。线性回归适用于X和y之间存在线性关系的数据集,可以使用计算机辅助画出散点图来观察是否存在线性关系。例如我们假设房屋价格和房屋面积之间存在某种线性关系。
线性回归得出的模型不一定是一条直线,在只有一个变量的时候,模型是平面中的一条直线;有两个变量的时候,模型是空间中的一个平面;有更多变量时,模型将是更高维的。

线性回归一般形式

线性回归可以被看做是样本点的最佳拟合直线。
在这里插入图片描述
这条最佳拟合线也被称为回归线(regression line),回归线与样本点之间的垂直连线即所谓的偏移(offset)或残差(residual)——预测的误差。
在只有一个解释变量的特殊情况下,线性回归也称为简单线性回归(simple linear regression)
当然,我们可以将线性回归模型扩展为多个解释变量。此时,即为所谓的多元线性回归(multiple linear regression)。如下图所示即为二元线性回归,一个回归平面来拟合样本点。
在这里插入图片描述
而均方误差是线性回归中经常使用的性能度量,即:
在这里插入图片描述
而我们之所以使用均方误差作为性能度量,可以通过概率论中的极大似然估计角度来证明:
我们可以把目标值和变量写成如下等式:
在这里插入图片描述
ϵ表示我们未观测到的变量的印象,即随机噪音。我们假定ϵ是独立同分布,服从高斯分布。(根据中心极限定理)
在这里插入图片描述
因此,
在这里插入图片描述

我们建立极大似然函数,即描述数据遵从当前样本分布的概率分布函数。由于样本的数据集独立同分布,因此可以写成
在这里插入图片描述

选择θ,使得似然函数最大化,这就是极大似然估计的思想。
为了方便计算,我们计算时通常对对数似然函数求最大值:
在这里插入图片描述
这一结果即均方误差,因此用这个值作为代价函数来优化模型在统计学的角度是合理的。

线性回归的优化方法
1、梯度下降法

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

2、最小二乘法矩阵求解

于矩阵求导来计算的,它的计算方式更加简洁高效,不需要大量迭代,只需解一个正规方程组。
推导过程:https://www.cnblogs.com/qianxiayi/p/9025400.html

3、牛顿法

可参考吴恩达CS229

4、拟牛顿法

拟牛顿法的思路是用一个矩阵替代计算复杂的海森矩阵H,因此要找到符合H性质的矩阵。
推导过程可见:
https://www.cnblogs.com/liuwu265/p/4714396.html

编程题目:

1、首先尝试调用sklearn的线性回归函数进行训练
2、用最小二乘法的矩阵求解法训练数据
3、用梯度下降法训练数据
4、比较各方法得出的结果是否一致

#生成数据
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 numpty 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))

2、使用最小二乘法矩阵求解

class LR_LS():
    def __init__(self):
        self.w = None      
    def fit(self, X, y):
        # 最小二乘法矩阵求解
        #============================= show me your code =======================
        self.w = 
        #============================= show me your code =======================
    def predict(self, X):
    # 用已经拟合的参数值预测新自变量
        #============================= show me your code =======================
        y_pred = 
        #============================= 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)))


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:
            # here
            
        #============================= 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)))

参考文献:
1、https://www.cnblogs.com/ai-developer/p/10282120.html
2、https://www.cnblogs.com/aviator999/p/9966533.html
3、https://blog.csdn.net/pengchengliu/article/details/80932232
4、https://www.cnblogs.com/qianxiayi/p/9025400.html
5、https://www.cnblogs.com/liuwu265/p/4714396.html

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值