回归的目的是预测数值型的目标值。
最直接的办法是依据输入写出一个目标值的计算公式。
1. 标准回归
# 读取文件
def loadDataSet(filename):
numFeat = len(open(filename).readline().split('\t'))-1
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
# 求w
def standReares(xArr,yArr):
xMat = mat(xArr);yMat=mat(yArr).T
xTx = xMat.T*xMat
if linalg.det(xTx) ==0.0:
print "No answer"
return
ws = xTx.I*(xMat.T*yMat)
return ws
2. 局部加权线性回归
# 读入并创建所需矩阵,之后创建对角权重矩阵weights,阶数等于样本个数
#随着样本点与待预测点距离的增加,权重以指数级衰减。k控制衰减的速度
def lwlr(testPoint,xArr,yArr,k=1.0):
xMat=mat(xArr);yMat=mat(yArr).T;
m=shape(xMat)[0]
weights=mat(eye((m)))
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 "No answer"
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
3. 岭回归
当样本个数小于特征个数时,采用岭回归
公式为:
def ridgeRegres(xMat,yMat,lam=0.2):
xTx=xMat.T*xMat
denom=xTx+eye(shape(xMat)[1])*lam
if linalg.det(denom) == 0.0:
print "No answer"
return
ws = denom.I * (xMat.T * yMat)
return ws
def ridgeTest(xArr,yArr):
# 对特征进行标准化处理:所有特征减去各自的均值并处以方差
xMat = mat(xArr);yMat=mat(yArr).T
yMean =mean(yMat,0)
yMat=yMat-yMean
xMeans=mean(xMat,0)
# var 取0求样本方差的无偏估计值
xVar = var(xMat,0)
xMat =(xMat-xMeans)/xVar
numTeatPts=30
wMat=zeros((numTeatPts,shape(xMat)[1]))
for i in range(numTeatPts):
ws = ridgeRegres(xMat,yMat,exp(i-10))
wMat[i,:]=ws.T
return wMat
4. Lasso缩减
在增加如下约束时,普通的最小二乘法回归会得到与岭回归一样的公式:
与岭回归类似,lasso缩减方法也对回归系数做了限定,对应的约束条件为:
在足够小的时候,一些系数会因此被迫缩减到0。
5.前向逐步回归
逐步回归是一种变量选择的方法。
随机梯度上升(下降)是一种拟合模型的数值优化方法。
逐步回归试图解决“放哪些变量在模型里最好”这个问题。
随机梯度上升试图解决“确定了哪些变量在模型里,如何求得参数值”这个问题。