1,用线性回归找到最佳拟合直线
回归的目的是预测数值型的目标值。
回归方程(regression equation)主要是求回归系数,一旦有了回归系数,在给定输入,做预测就是用回归系数乘以输入值,在将结果全部加在一起,就得到了预测值。(因为回归系数是一个向量,输入也是向量,这些运算就是求出二者的内积)
回归的一般方法:
1)收集数据:采用任意方法收集数据
2)准备数据:回归需要数值型数据,标称型数据将被转换为二值型数据
3)分析数据,二维图
4)训练算法:找到回归系数
5)测试算法:使用或者预测值和数据的拟合度,来分析模型的效果
6)使用算法:使用回归,在给定的时候预测出一个数值
求回归方程:
假定输入数据存放在矩阵X中,而回归系数存放在向量w中。那么对于给定的数据,预测结果将会通过
给出。通过x,y数据找到回归系数向量w,一个常用的方法是找出误差最小的w。这里的误差是指预测值和真实值之间的差值。避免正差值和负差值之间相互抵消,因此采用平方误差。
平方误差可以写作
用矩阵表示还可以写作,如果对w求导,得到
,令其等于零,解出w
w上方的小标记表示,这事当前可以估计出的w的最优解,从现有数据上估计出的w可能并不是数据中的真实值,所以这里使用了一个"帽"符号来表示是w的一个最佳估计。注意:公式中包含,也就是需要对矩阵求逆,代码中需要判断矩阵的逆到底存不存在
另外还可以使用NumPy库中的矩阵方法,该方法叫OLS,意思是“普通最小二乘法”(ordinary least squares)
from numpy import *
#加载数据
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 standRegres(xArr,yArr):
xMat = mat(xArr); yMat = mat(yArr).T
xTx = xMat.T*xMat
if linalg.det(xTx) == 0.0:# det判断行列式
print ("This matrix is singular, cannot do inverse")
return
ws = xTx.I * (xMat.T*yMat)
return ws
import matplotlib.pyplot as plt
xmat=mat(xarr)
ymat=mat(yarr)
yhat=xmat*ws
fig=plt.figure()
ax=fig.add_subplot(111)
#a是个矩阵或者数组,a.flatten()就是把a降到一维,默认是按横的方向降
# 此时的a是个矩阵,降维后还是个矩阵,矩阵.A(等效于矩阵.getA())变成了数组,A[0]就是数组里的第一个元素
ax.scatter(xmat[:,1].flatten().A[0],ymat.T[:,0].flatten().A[0])
xCopy=xmat.copy()
xCopy.sort(0)
yhat=xCopy*ws
ax.plot(xCopy[:,1],yhat)
plt.savefig("2.png")
plt.show()