玩不转scikit-learn(一):LinearRegression

来源:互联网 发布:橱柜设计软件 编辑:程序博客网 时间:2024/05/22 05:08

为了能更好的掌握机器学习,自己边学习边自己写一写算法。

为了验证自己算法实现的准确性,我会和scikit-learn的对应算法进行对比。恩,水平有限,尽力分析下为什么scikit-learn的对应算法会比自己实现的朴素算法好。

希望可以对于算法本身和scikit-learn的实现有一定的深度理解。。希望吧

代码用Python3在jupyter notebook(ipython notebook)上写的。代码+图的完整实现我放在GitHub上了:地址如下

https://github.com/lixintong1992/Machine_Learning

求求各位在GitHub上star我。。。


线性回归

用最简单的最小二乘(Least Squares)作为开始吧

线性回归形式

回归就是预测一个数,线性回归就是用输出值的线性组合预测这个数,公式如下:

如果只有一个输入w,那么再加上一个偏置 bxi 的回归结果f(xi)如下

f(xi)=wxi+b

这就是线性回归的最简单形式,如何衡量预测结果的准确性?我们需要一个loss function来定义预测结果的准确性。


最小二乘

最直观的衡量方法,就是预测值与实际值的差的平方。这个就是最小二乘,形式如下

(f(xi)yi)2

机器学习的过程就是通过调整参数减小loss function来确定参数。


求解

给你m个训练样本,loss function如下所示:

E(w,b)=i=1m(yiwxib)2

如何通过调整w,b的值来求E(w,b)的最小值,分别对w,b求偏导,当导数为0的时候就是啦(因为是凸函数的说,导数为0就是最小值了)

E(w,b)w=2(wi=1mx2ii=1m(yib)xi)=0

E(w,b)w=2(mbi=1m(yiwxi))=0

结果是这样子的

w=mi=1yi(xix¯)mi=1x2i1m(mi=1xi)2

b=1mi=1m(yiwxi)

x¯=1mi=1mxi

很难得的解,因为他是闭式(closed-form)解,就是可以直接用公式求出来的解。以上是只有一个输入变量情况下的线性回归,下面考虑下多面量输入,嘛,也向量化(vectorized)下。


多元线性回归

如果是输入d的变量,预测一个变量,公式如下

f(x)=w1x1+w2x2+w3x3+...+wdxd+b

x=(x1,x2,...,xd)

都向量化了外面飘一个b肯定不合适,我们把b放进去:w^=(w;b)

同时,我们用X表示有m个样本的训练集

X=x11x21xm1x12x22xm2x1dx2dxmd111

这样子损失函数就是
Ew^=(yXw^)T(yXw^)

老样子求导为0

Ew^w^=2XT(Xw^y)

Ew^w^=0

解下面的式子就成了

XTXw^=XTy

结果如下

f(xiˆ)=xiˆT(XTX)1XTy

其实也就是求

(XTX)1XT


实现

朴素人工版

X = np.insert(X,X.shape[1],values=1,axis=1)  #For constant termy = y[:,np.newaxis]

这个是在X中加入1的列,以及把y的维数搞好

if np.linalg.det(X.T.dot(X)) == 0:    print("singular error!")else:    w = np.linalg.inv(X.T.dot(X)).dot(X.T).dot(y)

因为要求(XTX)1XT,要求逆矩阵,这里通过np.linalg.det求行列式,行列式为0的矩阵没有逆矩阵

np.linalg.inv就可以求逆矩阵了

结果如下(完整代码https://github.com/lixintong1992/Machine_Learning)
这里写图片描述

scikit-learn高端版

scikit-learn算法实现

model = linear_model.LinearRegression()model.fit(X, y)

调包真是安逸啊,就两句话。结果如下
这里写图片描述

一样的,成功~

scikit-learn实现分析

其实scikit-learn是通过scipy.linalg.lstsq来实现的
这里写图片描述

因为逆矩阵有可能不存在,一般都用SVD奇异值分解,对不起大家这个我不太懂······不细说了
通过上面的代码发现scipy.linalg.lstsq会返回四个值,第一个就是解啦。后面的依次是Sums of residues;Effective rank of matrix;Singular values of matrix
有需要可以直接查看,如下图:
这里写图片描述
需要注意的是Sums of residues要被移除了,反正都很少用到就是了

这里有个可有可无的小知识:
numpy.linalg.lstsqscipy.linalg.lstsq是不一样的(Numpy 1.8.2, Scipy 0.14.1 )
numpy.linalg.lstsq() 用的是LAPACK 惯例的xGELSD ,scipy.linalg.lstsq()用的是xGELSS,翻译成人话就是Numpy的速度更快但需要更多内存


LinearRegression分析

scikit-learn上的相关叙述

普通最小二乘的系数估计依赖于模型的独立性(就是特征间的独立性)。如果特征之间是相关的,就是说X的列与列之间近似线性相关,那么矩阵就会近似奇异(singular)。那么,最小二乘估计会对随机噪音敏感,就是模型的方差会很大(variance)。这个特征之间是相关的情况叫多元共线性(multicollinearity)

通俗的理解:当线性回归模型中存在多个相关变量时,它们的系数确定性变差并呈现高方差。比如说,在一个变量上的一个很大的正系数可能被在其相关变量上的类似大小的负系数抵消

上边的方差,应该就是机器学习模型中的泛化误差里边的

=bias2+var+ϵ

bias就是偏差,var是方差,ϵ是噪声

补充下,多重共线性使参数估计值的方差增大,可以用杜宾-瓦特森(DW)检验,计量经济,统计分析中常用的一种检验序列一阶 自相关 最常用的方法。

算法复杂度主要集中在奇异值分解(SVD),X为大小为(n,p)的矩阵,复杂度是O(np2),np


结尾

https://github.com/lixintong1992/Machine_Learning

GitHub上求star~写blog不容易呀~

公式大部分来自《机器学习》周志华

2 0
原创粉丝点击