- 线性回归
线性回归的方法为最小二乘法。用Y=X.Tw表示拟合结果,其中X.T表示X的转置,w为回归系数。其损失函数为残差的平方和:
为了求损失函数的极小值,对w求偏导,并另偏导=0,得到回归系数的计算公式:
- 局部加权线性回归
局部加权回归为待测点附近的每个点赋予一定的权重,回归系数w可以表为:
其中W为权重,是一个对角矩阵。类似于核函数,选择高斯核函数权重可计算为:
与测试点距离越近,其权重就会越大。k为一个参数,k越大,W中对角线上的非0点就越多,反之,非0点只集中在测试点xi附近。所以,k越大越容易欠拟合,而k越小,越容易过拟合。其phython代码如下:
def lwlr4Vec (textPoint, xArr, yArr, k = 1.0):
xMat = mat(xArr); yMat = mat(yArr).T
N = shape(xMat)[0]
W = mat(eye(N))
for i in range(N):
diff = textPoint - xMat[i]
W[i,i] = exp(diff * diff.T / (-2.0 * k ** 2))
xtx = xMat.T * W * xMat
if(linalg.det(xtx) == 0):
print "Wrong!"
return
return textPoint * (xtx.I * xMat.T * W * yMat)
- 岭回归(Ridge)
最小二乘法是一种无偏差估计,对训练数据集中的实例其预测近似误差很小,但当①矩阵X中的存在多重共线性(即某几个特征具有线性相关),②X中特征数大于样本数(使不能列满秩),会导致|X.TX|趋近于0,使其逆矩阵的对角元很大,造成矩阵不稳定。所以,岭回归为它的损失函数加一项L2正则项作为惩罚函数,将回归系数拉低:
其中t为lambda的函数,lambda越大t越小。通过对损失函数求偏导,再另偏导=0,可得:
可以理解为,lambda的引入使求逆的项非奇异,同时限制w的大小,减小不重要的参数,称之为缩减。
lanmda很小,对X.TX的约束不够;lambda较大时,回归系数会被拉低,降低多重共线性的影响。但lambda太大会使所有回归系数趋近于0,导致欠拟合。岭回归不可以筛选特征,所有不能提出相关性强的特征。
- Lasso回归
lasso回归同样为有偏估计,可以筛选数据,擅长处理共线性数据。它的损失函数为最小二乘的损失函数后加一个L1正则项;
L1正则项的加入会使一些wj=0,达到筛选特征的目的。但lasso回归的损失函数中有绝对值运算,导致不可以对它求偏导,使用二次规划法计算又非常复杂。所以可以用前向逐步回归来得到与lasso回归类似的效果:
def fStepWise (xArr, yArr, eps = 0.01, num = 100):
xMat = mat(xArr); yMat = mat(yArr).T
yMat = yMat - mean(yMat, 0)
xMat = regularize(xMat)
k = shape(xMat)[1]
WMat = zeros((num, k))
wOrig = zeros((k,1)) ; wTest = wOrig. copy(); wBest = wOrig.copy()
for i in range(num):
print wOrig.T
minError = inf
for j in range(k):
for sign in [-1, 1]:
wTest = wOrig.copy()
wTest[j] += eps * sign
rssE = rss(yMat.A, (xMat * wTest).A)
if(rssE < minError):
minError = rssE; wBest = wTest
wOrig = wBest.copy(); WMat[i, :] = wBest.T
return WMat
在求解前首先要对数据进行标准化处理,使它们均值为0,方差为1:(每一维特征值-该维的平均值)/该维的方差
- 弹性回归(ElasticNet)
对损失函数引入L1正则和L2正则的混合项:
当特征非常多,甚至大于样本数量时,引入正则项可以免于过拟合,减小一些特征的权重,但会保留所有特征。模型太复杂会导致方差大,引入正则项可以降低复杂度(通过减小一些特征的权重),减小预测方差,但同时引入了偏差。