Sklearn+numpy实现线性回归预测
一 本节课程介绍
1.1 知识点
1、线性回归基本介绍;
2、numpy实现线性回归计算;
3、sklearn实现线性回归拟合;
二 课程内容
2.1 线性回归基本介绍
线性回归是指利用线性方程y=ax+b实现对自变量和因变量之间的关系回归预测,其变量之间是相互独立的,且要求其变量符合正态分布,常用在数据预测上。
举个例子,比如你的智力为10,体力为8,思考灵活度为6,此时考试可以得分85分。那么多个这种数据输入模型,可以使用线性回归预测智力为9,思考灵活度为9,体力为9时的考试得分 。
线性回归又分为一元线性回归和多元线性回归。一元线性回归其方程式为y=wx+b;多元线性回归为y=w1x1+w2x2+w3x3……,其按照矩阵形式可以统一写为y=WTX。其中y和X为变量,即我们需要求解的参数即为W。
2.1.1 最小二乘法求解线性回归
最小二乘法是一种数据拟合方法,其本质是利用最小误差平方来求解数据最佳匹配参数。假设其线性表达式为y=w*x+b,设置其预测值与真实值差值的平方和作为损失值Q,为了使得损失值最小,需要分别对参数W和B求其偏导,最终求得其需求解的公式。
np.linalg.inv(x.T.dot(x)).dot(x.T).dot(y)
。其中inv为逆矩阵,x.T为x的转置,dot函数为点乘。
2.1.2 梯度下降法拟合线性回归
梯度下降法是指通过计算函数梯度,按照y(t+1)=y(t)-g*l。其中g为梯度,l为设置的固定值,用来帮助计算每步走的长度。需要使得函数为最优值,即需要满足模型快速收敛到最优解,需要满足梯度g为其个参数偏导取负值,即为其梯度的相反方向可以使得模型最快拟合最优值。
思想:
1:随机初始化参数确定模型a0 、a1,得到一个损失函数值。
2:使用梯度减少的更新方法更新参数a0 、a1,使得每一次所对应的损失函数的值越来越小。
3:直到更新参数损失函数的值变化波动不大,表示斜率到达最平稳处参数不变化进而损失函数不变化,找到损失函数最小值,此时对应的参数为最优解。
三 实验测试
3.1 numpy实现最小二乘法拟合线性回归
首先要导入库:
import numpy as np
import matplotlib.pyplot as plt
(1)设置X参数值随机生成的200行一列的均匀分布数据乘以5。
X = 5 * np.random.rand(200, 1)
(2)设置y与x之间的关系式如下,其中np.random.randn(200, 1)作为噪声项,3和8是我们需要求解的值,即最终求解的矩阵为[[3],[8]]为最完整的答案:
y = 3 + 8 * X + np.random.randn(200, 1)
(3)设置x参数要加上一个偏置项,即y=w*x+b,其中b是乘以1的,故需要生成200行一列的1用来求解b。:
x=np.c_[np.ones((200, 1)), X]#作为求解偏置项,即偏置项需要乘以1,而不是x
(4)根据公式求解参数矩阵:
theta_best = np.linalg.inv(x.T.dot(x)).dot(x.T).dot(y)
最终模型运行后值为:
(5)构建需要预测的x值,按照上面的方式一样:
X_test = np.array([[0],[5]])
X_pred=np.c_[np.ones((2, 1)), X_test]#作为求解偏置项,即偏置项需要乘以1,而不是x
(6)预测值为其点乘参数y=WT*X:
y_predict = X_pred.dot(theta_best)
(7)绘制图可视化,为折线图和散点图
plt.plot(X_test, y_predict, 'r-')
plt.plot(X, y, 'b.')
最终可查看拟合效果:
3.2 sklearn实现线性回归预测
首先要导入库:
import numpy as np
import matplotlib.pyplot as plt
from sklearn.linear_model import LinearRegression
(1)设置X参数值随机生成的200行一列的均匀分布数据乘以5。
X = 5 * np.random.rand(200, 1)
(2)设置y与x之间的关系式如下,其中np.random.randn(200, 1)作为噪声项,3和8是我们需要求解的值,即最终求解的矩阵为[[3],[8]]为最完整的答案:
y = 3 + 8 * X + np.random.randn(200, 1)
(3)使用sklearn中的线性回归梯度下降法拟合:
lin_reg = LinearRegression()
lin_reg.fit(X, y)
最终模型运行后值为:
(4)构建需要预测的x值,按照上面的方式一样:
X_test = np.array([[0],[5]])
(5)使用sklearn预测:
y_predict =lin_reg.predict(X_test)
(6)绘制图可视化,为折线图和散点图
plt.plot(X_test, y_predict, 'r-')
plt.plot(X, y, 'b.')
最终可查看拟合效果:
四 思考与作业
(1)尝试更多数据预测
是否可以将X的维度扩充为300行3列,修改实例。
(2)是否可以尝试使用numpy实现梯度下降拟合线性回归