线性回归中的数学原理

线性回归

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

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

适用数据类型:数值型和标称型
基本步骤:

  1. 收集数据
  2. 准备数据
  3. 分析数据
  4. 训练算法
  5. 测试算法
  6. 使用算法



平方误差的计算公式:

sum1,m=(yixiT×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(|xix|)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时会出错。因为特征比样本点还多,则输入矩阵不是满执矩阵,其行列式为零,因此无法求解。

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

岭回归

简单来说,岭回归就是在矩阵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回归没有讲到,据说该算法较为复杂,我自己也还没有掌握,在这里就不多说了。

你可能感兴趣的:(machine,learning,python)