假设我们有许多样本数据{x(i),y(i)},其中x(i)是第i个样本变量,y(i)是第i个变量的类别,对于每个样本变量都有许多特征
feature(x)=X=x1,x2,…xn
,现在我们建立判别函数
hθ(x)=θ1x1+…θnxn
,线性回归的目标是找到判别函数的最佳系数,尽量让判别函数对待测试数据的分类结果正确。
为了让判别函数与真实结果尽量一致,我们要让判别函数的结果与真实分类结果的差的绝对值最小。但是绝对值是不好计算的,因此我们把差的绝对值换成差的平方,写成:
J(θ)=12∑i=1s(hθ(x(i))−y(i))2
这里添加1/2系数是为了方便求导的时候去掉常数系数,因为常数项并不影响求解;s是样本个数。这个函数称为损失函数。
求解这个方程常用的有最小二乘法、梯度下降法。
(1)最小二乘法经常用来最小化误差的平方和来拟合数据。这个方法刚好就适用于现在的问题,我们将x看做自变量,y看做因变量,现在x-y函数坐标系中有很多(x,y)点,现在就是求解一条拟合曲线来适合数据,使得所有的(x,y)点离拟合曲线的距离之和最短。在《矩阵论》中,最小二乘法可以简单的通过一个矩阵来求解。令
X=⎡⎣⎢⎢x11...xm1.........x1n...xmn⎤⎦⎥⎥Y=[y1,...ym]T
,判别函数系数
β=[θ1,...θn]T
,则对于所有的数据有
Xβ=Y
最小二乘法是最小化误差,误差为
δ=12(Xβ−Y)2
由于是二次函数,因此极值点肯定在导数为0的位置,对误差函数的系数求导得到:
XTXβ−XTY=0β=(XTX)−1XTY
这样就求出了判别函数项。
(2)梯度下降法能求出极值的原理可以参照牛顿下降法。梯度下降法最终也是收敛到导函数为0的地方。对于误差函数J(q),我现在有一个判别函数系数初始值q0,那么不断更新qk+1=qk+aÑ J(q),其中a是步长,是一个经验值,Ñ表示求导,这里是对q求导。如此迭代下去直到q收敛,就是最终的判别函数系数。
来看一个例子。现在我给定一组区间为[-5.0,9.0]的数据,计算公式为 y=12x2+3x+5+noise 。显然这不是一批线性数据,而是二次型数据,然而如果我们把特征看做
f=⎡⎣⎢⎢⎢x2x1⎤⎦⎥⎥⎥
那么这就等价于线性模型,也就是高维线性模型。python代码如下
import numpy as np
from matplotlib import pyplot as plt
X = np.arange(-5.,9.,0.1)
X=np.random.permutation(X)
b=5.
y=0.5 * X ** 2.0 +3. * X + b + np.random.random(X.shape)* 10.
X_ = np.mat(X).T
X_ = np.hstack((np.square(X_) , X_))
X_ = np.hstack((X_, np.mat(np.ones(len(X))).T))
A=(X_.T*X_).I*X_.T * np.mat(y).T
y_ = X_ * A
plt.hold(True)
plt.plot(X,y,'r.',fillstyle='none')
plt.plot(X,y_,'bo',fillstyle='none')
plt.show()
原来的线性回归博客不是markdown写的,现在更新一下。
正则化详细例子参见贝叶斯线性回归
https://github.com/artzers/MachineLearning.git LineaRegression