线性回归(Linear Regression)是利用数理统计中回归分析,来确定两种或两种以上变量间相互依赖的定量关系的一种统计分析方法。
1、问题描述
回归分析中,只包括一个自变量和一个因变量,且二者的关系可用一条直线近似表示,这种回归分析称为一元线性回归分析,一元线性模型描述如下:
如果回归分析中包括两个或两个以上的自变量,且因变量与自变量之间是线性关系,则称为多元线性回归分析,多元线性模型描述如下:
不失一般性,线性回归问题可描述为:利用样本数据点
求取线性模型参数
使得实际y值与预测值之间的平方和误差最小,即线性回归损失函数为:
最小。
2、算法原理
将上述平方和误差整理成矩阵形式为:
根据微积分内容,对上式相对于W求导,可得:
令上式等于0,可以求得W估计值:
值得注意的是,上式需要求逆矩阵。如果矩阵不可逆,可以采用以下两种方法:
1)岭回归思路
引入lambda:
当lambda不为0时,
的逆矩阵一定存在。
2)梯度下降法
损失函数 J 对 wi 求偏导,可得:
在上式中梯度大小实际上是和样本数量m相关,m越大,累加之和越大,这是不合理的。为了使与m无关,对损失函数 J 除以m,那么损失函数变为:
那么偏导数为:
写成矩阵形式,偏导数改写为:
其中,
3、代码实现
1)岭回归思想代码实现
代码实现如下:
import numpy as np
from sklearn import datasets
def LRegression(x, y, lm):
ones_v = np.ones(np.shape(x)[0])
ones_x = np.column_stack((ones_v,x))
x_matrix = np.mat(ones_x).T
y_matrix = np.mat(y)
xT_x = x_matrix * x_matrix.T
xT_x_I = xT_x + np.eye(np.shape(x_matrix)[0])*lm
if np.linalg.det(xT_x_I) == 0.0:
print("矩阵不可逆!")
return
w = xT_x_I.I * (x_matrix * y_matrix.T)
return w
if __name__ == '__main__':
diabetes = datasets.load_diabetes()
x = diabetes.data
y = diabetes.target
w = LRegression(x, y, 0.1)
print(w)
利用diabetes数据集,可以计算出w0~w10如下:
[[ 152.09907261]
[ 1.30734895]
[-207.19481363]
[ 489.69108009]
[ 301.76943732]
[ -83.46607377]
[ -70.82809551]
[-188.68016351]
[ 115.7127025 ]
[ 443.81405412]
[ 86.74853944]]
2)梯度下降法代码实现
待添加。。。