Python机器学习快速入门系列4: 线性回归
网上找的机器学习的资料对于新手来说往往很难, 经常一上来就甩你一堆像外星文一样的公式方程,然后就把你满腔的学习热情给无情浇灭, 让你觉得是不是该回去学下数学再好好做人。笔者也是一样屡屡被虐,才略有领悟, 回过头来看,发现其实机器学习入门本来可以不这么艰难。 Python机器学习快速入门系列文章,希望能够以简单易懂、通俗而有趣的方式,把大家带入Machine Learning的世界。
1.猜数游戏
x= 1 , 3, 8, 9, 15 16
y= 2, 6.3, 15, 21, ? ?
依据X和Y的关系, 我们猜x=15, y可能会对应30左右, x=16,y可能会对应32左右
但我们会什么不会猜100, 或者其他更大的数, 因为肉眼判断的Y大概是X的2倍, 虽然有点误差, 但是整体方向上应该错不了。
y=2*x
这就是一个简单的线性回归, 你找到了一个系数2, 对于任何要预测的目标值, 你用输入值乘以系数2, 得到预测的结果。
2. 升级猜数游戏
现在我们加大猜数的难度, 把x这组数据替换成二维的数组, 也就是说, x=[0.5,1] 对应y是1, 求x=[6,15] 对应的y取值
0.5 1.4 3.7 4 6 6.1
x= 1 , 3, 8, 9, 15 16
y= 2, 6.3, 15, 21, ? ?
这就是典型的线性回归问题, 我们先暂时不回答, 相信看到后面就能解答。
3. 线性回归数学定义
在点阵里面找1条直线, 计算所有点到这条直线的距离, 如果距离之和最短, 那么这条直线就是需要的结果。对于需要预测的y的值, 找到x在直线上所对应的y值, y=x * w 就是预测结果(w就是直线)
因此, 如果需要解答猜数游戏, 那么首先就要找到 w 的值。
这种场景下, 计算w的值, 前辈们已经推导出了公式:
假设x和y都是矩阵, 那么这个系数w叫做回归系数, 取值为:
w = (xT * x)-1 *xT * y
至于为什么公式是这么写的, 我们不需要操心, 就像计算圆形的面积是是( πr2 )一样不需要我们再推导一遍。
通俗翻译过来就是:(下面这段话看不懂赶紧复习系列2)
- x矩阵的转置乘以x矩阵
- 对这个新矩阵的结果取逆矩阵
- 逆矩阵再乘以x矩阵的转置
- 最后乘以y矩阵。
4. 回归系数的Python实现
这堆数学概念看起来超复杂, 但是用python来实现, so easy!
import numpy as np
#x矩阵
xMatrix=np.mat([
[0.5, 1 ],
[1.4 3 ],
[3.7, 8 ],
[4, 9 ]
] )
#y矩阵
yMatirx=np.mat([
[2 ],
[6.3],
[15 ],
[21 ]
])
[0.5, 1 ],
[1.4 3 ],
[3.7, 8 ],
[4, 9 ]
] )
#y矩阵
yMatirx=np.mat([
[2 ],
[6.3],
[15 ],
[21 ]
])
#实现公式
w=(xMatrix.T * xMatrix).I * (xMatrix.T * yMatrix)
5. 使用回归系统进行预测
把需要预测的值整理成矩阵
newxMatrix=np.mat([
[6, 15 ],
[6.1 16 ]
[6.1 16 ]
])
#用回归系数计算
predictYMatrix=newxMatrix * w
print predictYMatrix
得到结果: 47.71369295 , 56.79128631 就是那2个猜出来的y值
6. 绘图查看数据分布和预测结果
import matplotlib.pyplot as plt
newxMatrix=np.mat([
[0.5, 1 ],
[1.4, 3 ],
[3.7, 8 ],
[4, 9 ] ,
[6 , 15 ],
[6.1 , 16 ]
])
[0.5, 1 ],
[1.4, 3 ],
[3.7, 8 ],
[4, 9 ] ,
[6 , 15 ],
[6.1 , 16 ]
])
#红色为预测值
newyMatrix=np.mat([
[2 ],
[6.3],
[15 ],
[21 ],
[2 ],
[6.3],
[15 ],
[21 ],
[47.7 ],
[56.7 ],
[56.7 ],
])
#把newxMatrix转换成一维数组, 每个值除以该列的平均值(绘图表现方便,无其他意义)
xMeanMatrix= (newxMatrix[:,0]/newxMatrix[:,0].mean() + newxMatrix[:,1]/newxMatrix[:,1].mean())
plt.figure() #创建图表
x=xMeanMatrix[:,0].flatten().A[0]
y=newyMatrix[:,0].flatten().A[0]
plt.scatter(x,y) #画点
plt.plot(x,y) #画线
x=xMeanMatrix[:,0].flatten().A[0]
y=newyMatrix[:,0].flatten().A[0]
plt.scatter(x,y) #画点
plt.plot(x,y) #画线
(图中不是直线,是因为把二维矩阵合并成了一维来绘图了)
7. SKLearn无脑实现线性回归
sklearn是个机器学习非常好的包, 好到使用者根本不需要了解什么算法, 算法特性,公式等。 上手直接预测:
步骤:
- 输入x, y数据训练
- 输入newX, 输出预测的newY值
import sklearn
#x矩阵
xMatrix=np.mat([
[0.5, 1 ],
[1.4 3 ],
[3.7, 8 ],
[4, 9 ]
] )
#y矩阵
yMatirx=np.mat([
[2 ],
[6.3],
[15 ],
[21 ]
])
[0.5, 1 ],
[1.4 3 ],
[3.7, 8 ],
[4, 9 ]
] )
#y矩阵
yMatirx=np.mat([
[2 ],
[6.3],
[15 ],
[21 ]
])
#预测输入xp矩阵
xpMatrix=np.mat([
[6 , 15 ],
[6.1 , 16 ]
])
classifier=LinearRegression()
classifier.fit(xMatrix,yMatrix)
yPredict=classifier.predict(xpMatrix)
print yPredict
[6 , 15 ],
[6.1 , 16 ]
])
classifier=LinearRegression()
classifier.fit(xMatrix,yMatrix)
yPredict=classifier.predict(xpMatrix)
print yPredict
计算得出 51.66894737 , 62.92736842 , 虽然和我们自己实现预测的值47 和 56 有些差异, 但大方向是基本一致, 也算相互验证。