您的位置:首页 > 编程语言 > Python开发

线性回归中的数学原理

2015-10-07 21:18 387 查看

线性回归

优点:结果易于理解,计算上不复杂

缺点:对非线性的数据拟合不好

适用数据类型:数值型和标称型

基本步骤:

收集数据

准备数据

分析数据

训练算法

测试算法

使用算法

平方误差的计算公式:

sum[1,m]=(yi−xiT×W)2 ( .T在这里代表矩阵的转置,是python中常用的语法)

W最优解公式:

w最优=(XT×X)−1×XT×y(.I同样是python中的语法,表示对矩阵求逆)

具体的训练实现代码比较简单,在这里略过,但有一点需要说明,即X.T*X的行列式应当不为零,原因如下:

设有矩阵A,由行列式定理可知,A.I=1/|A|*A^*,即A的逆等于A的行列式分之伴随矩阵,故矩阵A行列式不可以为零。矩阵行列式可直接调用python内linalg.det()进行计算。


最佳拟合直线方法将数据视为直线进行建模,具有十分不错的表现。但问题是很可能会出现欠拟合的现象。由此我们引入局部加权线性回归。

局部加权线性回归

在该算法中,我们给预测点附近的每个点赋予一定的权重,在这个子集上基于最小均方差来进行普通的回归。公式如下:

W最优=(x.T×W×X)I×XT×W×y

其中的W是一个矩阵,来给每个数据点赋予权重。

我们使用“核”来对附近的点赋予更高的权重。核的类型可以自由选择,最常用的核就是高斯核,公式如下:

W(i,i)=exp(|xi−x|)−2×k2

公式中的k由使用者决定,K越大,则有更多的数据用于训练回归。反之则越少。

下面给出局部加权线性回归函数实现的代码:

“`

def lwlr(testPoint,xArr,yArr,k=1.0):
xMat = mat(xArr) ; yMat=mat(yArr).T
m = shape(xMat)[0]
for j in range(m):
diffMat=testPoint-xMat[j,:]
weights[j,j]      =exp(diffMat*diffMat.T/(-2,0*k**2)
xTx=xMat.T*(weights*xMat)
if linalg.det(xTx) == 0.0:
print "This matrix is singular, cannot do
inverse"
return
ws = xTx.I * (xMat.T * (weights * yMat))

return testPoint * ws
```

def lwlrTest(testArr,xArr,yArr,k=1.0):
m = shape(testArr)[0]
yHat = zeros(m)
for i in range(m):
yHat[i] = lwlr(testArr[i],xArr,yArr,k)
return yHat

局部加权线性回归存在的问题是计算量,因为它对每个点做预测时都必须使用整个数据集。


缩减系数来“理解”数据

如果数据的特征比样本点还多怎么办?是否还可以使用线性回归和之前的方法来做预测?答案是否定的,即不能再使用前面介绍的方法。这是因为在计算(X.T*X).I时会出错。因为特征比样本点还多,则输入矩阵不是满执矩阵,其行列式为零,因此无法求解。

为了解决这个问题,在这里引入岭回归的概念。

岭回归

b448
简单来说,岭回归就是在矩阵X^T* X

上加一个lambada* x从而使得矩阵非奇异,进而能求逆。其中矩阵x式一个m\times m的单位矩阵,对角线上元素全为1,其他元素全为0。此时,回归系数的计算公式将变为:

w最优=(XT×X+lambda×I)−1×XT×y

岭回归最先用来处理特征数多于样本数的情况,现在也用于在估计中加入偏差,从而得到更好的估计。这里用过引入lambda来限制了所有w之和,通过引入该惩罚项,能够减少不重要的参数,这个技术在统计学中也叫缩减。


岭回归的代码和普通线性回归代码类似,在这里就不赘述了。

向前逐步回归

向前逐步回归算法可以得到与lasso差不多的效果,但更加简单。它属于一种贪心算法,即每一步都尽可能地减少误差。一开始,所有的权重都设为1,然后每一步所做的决策是对某个权重增加或者减少一个很小的值。

该算法的为代码如下所示:

数据标准化,使其分布满足0均值和单位方差
在每轮迭代过程中:
设置当前最小误差lowestError为正无穷
对每个特征:
增大或减小得到一个新的W
计算新W下的误差
如果误差Error小于当前最小误差:
设置Wbest等于当前W
将W设置为新的Wbest


小结

以上就是线性回归的基本内容了,其中还有lasso回归没有讲到,据说该算法较为复杂,我自己也还没有掌握,在这里就不多说了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  python 数学 算法