`
zzhonghe
  • 浏览: 243693 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

Python机器学习快速入门系列4: 线性回归

阅读更多
网上找的机器学习的资料对于新手来说往往很难, 经常一上来就甩你一堆像外星文一样的公式方程,然后就把你满腔的学习热情给无情浇灭, 让你觉得是不是该回去学下数学再好好做人。笔者也是一样屡屡被虐,才略有领悟, 回过头来看,发现其实机器学习入门本来可以不这么艰难。 Python机器学习快速入门系列文章,希望能够以简单易懂、通俗而有趣的方式,把大家带入Machine Learning的世界。关注微信公众号“Tunky的实用主义”, 一边学习,一边分享。
 
 
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 *x* y
 
至于为什么公式是这么写的, 我们不需要操心, 就像计算圆形的面积是是( πr)一样不需要我们再推导一遍。
 
通俗翻译过来就是:(下面这段话看不懂赶紧复习系列2)
  • x矩阵的转置乘以x矩阵
  • 对这个新矩阵的结果取逆矩阵
  • 逆矩阵再乘以x矩阵的转置
  • 最后乘以y矩阵。
 
 
4. 回归系数的Python实现
这堆数学概念看起来超复杂, 但是用python来实现, so easy!
 环境搭建参见系列1文章
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 ]
])

#实现公式: 详细解释参见系列2文章
w=(xMatrix.T * xMatrix).I * (xMatrix.T * yMatrix)
 
 
5. 使用回归系统进行预测
 
把需要预测的值整理成矩阵
newxMatrix=np.mat([
   [6,    15   ],
   [6.1  16   ] 
])
 
#用回归系数计算
predictYMatrix=newxMatrix * w
 
print predictYMatrix
 
得到结果: 47.71369295 ,  56.79128631   就是那2个猜出来的y值
 
 
6. 绘图查看数据分布和预测结果
 绘图详细介绍参见系列3文章
import matplotlib.pyplot as plt
 
newxMatrix=np.mat([
   [0.5, 1   ],
   [1.4, 3   ],
   [3.7, 8   ],
   [4,   9   ] ,
   [6   ,  15   ],
   [6.1 ,  16   ]
])
 
#红色为预测值
newyMatrix=np.mat([
   [2  ],
   [6.3],
   [15 ],
   [21 ],
   [47.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)     #画线   
 

 
(图中不是直线,是因为把二维矩阵合并成了一维来绘图了)
 
 
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 ]
])
 
#预测输入xp矩阵
xpMatrix=np.mat([
   [6   ,  15   ],
   [6.1 ,  16   ]
])
classifier=LinearRegression()
classifier.fit(xMatrix,yMatrix)

yPredict=classifier.predict(xpMatrix)
print yPredict
 
计算得出   51.66894737  ,   62.92736842   , 虽然和我们自己实现预测的值47 和 56 有些差异, 但大方向是基本一致, 也算相互验证。
 
 
  • 大小: 19.2 KB
  • 大小: 9.2 KB
分享到:
评论
发表评论

文章已被作者锁定,不允许评论。

相关推荐

Global site tag (gtag.js) - Google Analytics