使误差平方和最小
标准线性回归当样本数据不成线性时,可能会出现欠拟合的现象。可以通过局部加权线性回归解决,给待测电附近的每个点赋予一定的权重,然后在通过最小均方差的方法计算,每次预测均需要遍历所有样本数据集。通过核函数,来给待测点附近的点赋予较高的权重,常用高斯核
如果数据的特征比样本还要多,则数据的矩阵x不是列满秩,则没有逆,无法求取权值。可以理解为提供的数据量不足以说明特征关系。还有一种解释是,岭回归可以让估计的权值参数波动的范围变小,可以理解为有两个特征a,b,但是a,b高度相关,所以w1,w2之间可能相互抵消, y=w1a+w2b ,当把 w1 变得很大时,将 w2 变成绝对值很大的复数,则可能对结果影响非常小。这会导致不同样本拟合出的 w1,w2 差距很大,模型的可解释性不高。通过岭回归,可以限制 w1,w2 的范围。
岭回归的数学公式可以写为:
岭回归限定了回归系数平方和不能大于 λ 。使用普通的最小二乘法在当两个特征相关时,可能会出现一个很大的正系数以及一个很大的负系数,通过上述限制可以很好的避免这个问题。与岭回归类似,另一个缩减方法lasso也对回归系数做了限定。
前向逐步回归可以得到与lasso差不多的效果,但是更加简单,易于实现。属于一种贪心算法,每一步都尽可能的减小误差。一开始,所有的权重都为1,然后每一步所做的决策是对每个权重增加或者减少一个很小的值。逐步线性回归的优点在于它可以帮助人们理解现有的模型并作出改进,当构建了一个模型后,可以运行该算法找出重要的特征,这样就可能及时停止对那些不重要特征的收集。
伪代码如下:
数据标准化,使其分布满足0均值和单位方差
每次迭代:(每一次迭代只改变一个参数的大小)
设置当前最小误差lowestError为正无穷
对每个特征:
增大或者减小:
改变一个系数得到一个新的W
计算新W下的误差
如果误差Error小于当前最小误差lowestError:设置Wbest等于当前的W
将W设置为新的Wbest
代码
import numpy as np
from numpy import *
def regularize(xMat):#regularize by columns
inMat = xMat.copy()
inMeans = np.mean(inMat,0) #calc mean then subtract it off
inVar = np.var(inMat,0) #calc variance of Xi then divide by it
inMat = (inMat - inMeans)/inVar
return inMat
def loadDataSet(fileName): #general function to parse tab -delimited floats
numFeat = len(open(fileName).readline().split('\t')) - 1 #get number of fields
dataMat = []; labelMat = []
fr = open(fileName)
for line in fr.readlines():
lineArr =[]
curLine = line.strip().split('\t')
for i in range(numFeat):
lineArr.append(float(curLine[i]))
dataMat.append(lineArr)
labelMat.append(float(curLine[-1]))
return dataMat,labelMat
def rssError(yArr,yHatArr):
return (yArr-yHatArr).T*(yArr-yHatArr)
def stageWise(xArr,yArr,eps=0.001,numIt=5000):
xMat = np.mat(xArr)
yMat = np.mat(yArr).T
yMean = np.mean(yMat,0)
yMat = yMat - yMean
xMat = regularize(xMat)
m,n = np.shape(xMat)
ws = np.zeros((n,1))
returnMat = np.zeros((numIt,n))
for i in range(numIt):
lowestError = np.inf
for j in range(n):
for sign in [-1,1]:
wsTest = ws.copy()
wsTest[j] += + sign*eps
yTest = xMat * wsTest
rssE = float(rssError(yMat,yTest))
if rssE < lowestError:
wsMax = wsTest.copy()
lowestError = rssE
ws = wsMax.copy()
returnMat[i,:] = ws.T
return returnMat
data,label = loadDataSet('abalone.txt')
returnMatrix = stageWise(data,label)
print(returnMatrix)
偏差:描述的是预测值(估计值)的期望与真实值之间的差距。偏差越大,越偏离真实数据。
方差:多次采用不同样本集训练,使用不同模型预测同一点的偏差。也有文献说是,多次训练模型的系数的差异大小。
方差与偏差的权衡