今天下午又补充学习了其他几个基本的线性回归算法
原理较为简单:
def lwlr(testPoint, xArr, yArr, k=1.0):#高斯核权重调整局部加权线性回归
xMat = mat(xArr); yMat = mat(yArr).T
m = shape(xMat)[0]
weights = mat(eye((m)))#返回m*m,对角线元素为1,其余元素为0的矩阵
for j in range(m):
diffMat = testPoint - xMat[j:]
weights[j,j] = exp(diffMat*diffMat.T/-2.0*k**2)#k值大小决定了中心点附件所占据权重的大小
xTx = xMat.T*(weights*xMat)
if linalg.det(xTx) == 0.0:
print("This matrix is singular, cannot do inverse")
return
we = xTx.I*(xMat.T*(weights*yMat))
return testpoint * ws
def ridgeRegres(xMat,yMat,lam=0.2):#当特征较多时,可以使用岭回归,也可规避奇怪的点导致的过拟合,lasso方法
xTx = xMat.T*xMat
denom = xTx + eye(shape(xMat)[1])*lam
if linalg.det(denom) == 0.0:
print("This matrix is singular, cannot do inverse")
return
ws = denom.I * (xMat.T*yMat)
return ws
def stageWise(xArr,yArr,eps=0.01,numIt=100):#逐步回归算法。每次改变一步长的系数。
xMat = mat(xArr); yMat = mat(yArr).T
yMean = mean(yMat,0)
yMat = yMat - yMean
xMat = regularize(xMat)
m,n = shape(xMat)
returnMat = zeros((numIt,n))
ws = zeros((n,1)); wsTest = ws.copy(); wsMax = ws.copy()
for i in range(numIt):
print (ws.T)
lowestError = inf;
for j in range(n):
for sign in [-1,1]:
weTest = ws.copy()
wsTest[j] += eps*sign
yTest = xMat*wsTest
rssE = rssError(yMat.A,yTest.A)
if rssE < lowestError:
lowestError = rssE
wsMax = wsTest
ws = wssMax.copy()
returnMat[i,:]=ws.T
return returnMat