为何要学习回归?机器学习实战做者说‘回归能够任何事情’。python
假设有以下方程,就是一个回归方程,系数wi为回归系数,求回归系数的过程被称为回归算法
线性回归意味着能够将输入项分别乘以一些常量,再将结果加起来获得输出,那么怎样求回归系数呢?app
至此线性回归推到已完成,接下来介绍线性回归的实现步骤机器学习
——————————————————————————————————————————————————学习
from numpy import * import matplotlib.pyplot as plt def loadDataSet(fileName): #general function to parse tab -delimited floats dataMat = [] labelMat=[] fr = open(fileName) for line in fr.readlines(): curLine = line.strip().split('\t') dataMat.append([float(curLine[0]),float(curLine[1])]) labelMat.append(float(curLine[2])) print shape(dataMat) print shape(labelMat) return dataMat,labelMat #最佳拟合直线方法将数据视为直线进行建模 def standRegres(xArr,yArr): xMat = mat(xArr) yMat = mat(yArr).T xTx = xMat.T*xMat if linalg.det(xTx) == 0.0: print "This matrix is singular, cannot do inverse"#行列式的值为0,无逆矩阵 return '行列式为0' ws = xTx.I * (xMat.T*yMat) # ws=linalg.solve(xTx, xMat.T*yMat) print ws return ws # def show(dataMat,labelMat,ws): xMat = mat(dataMat) yMat = mat(labelMat) yHat=xMat*ws fig=plt.figure() ax=fig.add_subplot(111) ax.scatter(xMat[:,1],yMat.T[:,0]) # ax.scatter(xMat[:,0].flatten().A[0],yMat.T[:,0].flatten().A[0]) ax.plot(xMat[:,1],yHat) # xcopy=xMat.copy() # xcopy.sort(0) # yHat=xcopy*ws # ax.plot(xcopy[:,1],yHat) plt.show() corr=corrcoef(yHat.T,yMat) print corr return corr
结果以下图所示,
spa
为改进线性回归算法的准确率,有很过改进的算法,其中有局部加权线性回归,以下是各展现3d
分别在K=1,K=0.1,K=0.01,K=0.003,当K=1为普通的线性回归,当K=0.1变化不明显,当K=0.01是拟合效果较好,当K=0.03时出现过拟合现象code
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): #next 2 lines create weights matrix 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 "This matrix is singular, cannot do inverse" return ws = xTx.I * (xMat.T * (weights * yMat)) return testPoint * ws
此外,若是数据的特征比样本点还多应该怎么办?统计学家引入岭回归、Lasso、前向逐步回归来解决这个问题,有兴趣的同窗能够自行研究blog