首页 > 编程知识 正文

python实现最小二乘法的线性回归,非线性回归 最小二乘法

时间:2023-05-03 06:59:35 阅读:260276 作者:1115

线性回归是确定两种及两种以上变量的相互依赖关系。在数据分析中,线性回归是最简单且最有效的分析方法。举个简单的例子,某商品的利润在售价为2元、5元、10元时分别为4元、10元、20元,我们很容易得出商品的利润与售价的关系符合直线:.在上面这个简单的一元线性回归方程中,我们称“2”为回归系数,即斜率为其回归系数,回归系数表示商品的售价(x)每变动一个单位,其利润(y)与之对应的变动关系。

1.线性回归

                                                    

如上图所示,上图为一个简单的一元线性回归示意图,线性回归表示这些离散的点总体上“最逼近”哪条直线。同理,在二元线性回归中,离散的点在空间中最逼近哪个平面。其它多元线性回归亦是如此。线性回归在数据量化分析,数据预测方面有着重要应用。

2.最小二乘法

同样是上图,那这些离散的点总体上“最逼近”哪条直线呢,这需要一个量化。对于同一x,实际数据为y,回归方程的推断数据为ax,则误差d=y-ax。最小二乘法定义为,当,D最小时,回归方程的拟合度最高,根据求出a即可,对最小二乘法的定义方程进行微分求极值即可得出a。

对于多元变量,设

                                        ,    ,    

其回归方程为Y=Xa。同理,现在我们要求矩阵a的值,使得

                                                               

取最小值即可。对上式进行微分求解(具体求解步骤可参考线性代数相关知识),可得

                                                                              

如果该矩阵满秩,则

                                                                           

上述便为最小二乘法的基本思想。

3.python实现

一元线性回归测试:

from numpy.linalg import inv # 矩阵求逆from numpy import dot # 矩阵点乘from numpy import mat # 二维矩阵X = mat([1, 2, 3]).reshape(3, 1) # x为1,2,3Y = mat([5, 10, 15]).reshape(3, 1) # y为5,10,15a = dot(dot(inv(dot(X.T, X)), X.T), Y) # 最小二乘法公式print(a)

首先,这里推荐一个公式的代码实现技巧,代码从内向外写,即X的转置与X点乘,再求逆, 再与X的转置点乘,再与Y点乘,一层层加括号即可。

由上述代码不难看出,y与x的关系为y=5x,下面我们看测试结果是否为5:

测试结果正确。

实战:

这里准备了一组数据,数据示例截图如下:

 

上述数据为某一商品的销售量与售价、服务投资和其它投资的对应关系,即我们要求出:

                                                     ,    ,      

中,矩阵a。

代码如下:

import numpy as npimport pandas as pdfrom numpy.linalg import inv # 矩阵求逆from numpy import dot # 矩阵点乘dataset = pd.read_csv('C:\Users\57105\Desktop\data.csv') # 读入数据X = dataset.iloc[:, 2: 5] # x为所有行,2到4列Y = dataset.iloc[:, 1] # y为所有行,第1列a = dot(dot(inv(np.dot(X.T, X)), X.T), Y) # 最小二乘法求解公式print(a)

测试结果:

即,对于单条数据,即,该回归方程反应了商品销售量与售价、服务投资和其它投资的关系。

上述便为线性回归的最小二乘法求解方式,关于线性回归的另一种求解方式—梯度下降法可见笔者相关文章。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。