XXX研究了好几天的单线性回归,终于有些明白了,但是其中很多原理(公式)的东西还是不太懂。这里做下总结,希望能让刚开始学习机器学习的小伙伴少走些弯路吧。下面开始!!!
先从一个臭了大街的公式开始吧
Y = a + bX
没错就是它,此处略过10000个草泥马。
好这里先说一下这个公式的作用,就是根据把X带入单线性回归的公式求出Y的坐标。
Y是什么?X是什么?a是什么?b又是什么?我相信很多数学不好的小伙伴和我一样开始都是一脸懵逼。
Y是坐标系上y的值,是结果
X是坐标系上x的值,是我们自己给的数(参数)
a是截距(在这里就是线的起点)
b是回归系数(我在网上查了一下,就是线角度的正切值)
那么a,b是哪来的?这TM两个值是算出来的,当然向python里面的很多库提供方法很方便,但是我这里主要说的是这两个值是在没算出来的。
这里我们使用用最小二乘法来计算
来吧,说下最重要的运算步骤了。
这里需要两组数据,我这里把这两组数据分别转成矩阵用表示xx和yy吧,它们分别对应x和y的值,同时它们都是n*1的矩阵(n行1列),这里为了好理解所以使用1列的矩阵。
1、我们先需要把xx这个从n*1的矩阵转成n*2的矩阵(n行2列的矩阵),第一列全部都是“1”,新的矩阵我们用mx来代表吧。
mx = np.mat(np.ones((n,2)) //转成n*2的矩阵
for i in range(n): mx[i,1] = Xi[i] //第一列全部都是“1”
2、我们将mx这个n*2的矩阵做转置,这里用mx.T表示,转置后的矩阵变成2*n(2行n列),现在用 mx.T * mx(mx.T乘以mx),2*n * n*2 会生成一个2*2的矩阵 xmx(这里不懂的可以自己查一下矩阵的乘法)。
xmx = mx.T*mx
3、这一步可以不做,这里只是提一下,验证xmx矩阵是否有效,用矩阵行列式求出xmx的值是否等于0,不等于0就继续。
np.linalg.det(xTx) != 0.0
4、再把xmx矩阵求逆,这里用xmx.I表示(逆矩阵就是:a矩阵乘b矩阵=单元矩阵,那么b就是a的逆矩阵,这里不知道说的对不对,哈)。
5、还记得yy这个n*1的矩阵(向量)吧。ws = xmx.I * (xm.T * yy.T)。
注:xmx的逆矩阵 * (xm的转置矩阵 * yy的转置矩阵),现在就是:2 x n矩阵 * 1 x n矩阵(向量) = 2x1的矩阵zz,再用 xmx.I这个2x2的矩阵 * 2x1的zz = 2x1的矩阵ws。
ws = xmx.I * (mx.T*yy.T)
6、ws是个2行1列的矩阵,第一行第一列的值就是b(截距),第二行第一列的值就是a(回归系数)
好了到这里Y = a + bX的公式完整了。
第一次写肯定会有不对的地方,希望说的不对的地方大家帮我改正。