8. 预测数值型数据:回归
8.1 用线性回归找到最佳拟合直线
线性回归
- 优点:结果易于理解,计算不复杂
- 对非线性数据拟合不好
- 适用数据类型:数值型和标称型数据
回归的一般方法
- 收集数据
- 准备数据:需要数值型数据,标称型数据会被转化成二值型数据
- 分析数据:在回归前把数据展示在二维图上有助于加深对数据的理解,在求得回归系数后,再把拟合线也绘制在图上。
- 训练算法:找到回归系数
- 测试算法:使用R2或者预测值和数据的你和杜,来分析模型的效果
- 使用算法:对模型给定一个输入,可以预测一个数值;此时得到的是一个连续型数据而不仅仅是离散的类别标签。
通过最小化平方误差拟合回归曲线(即OLS,普通最小二乘法)
-
平方误差: Σ i = 1 m ( y i − x i T w ) 2 \Sigma^m_{i=1}(y_i-x_i^{T}w)^2 Σi=1m(yi−xiTw)2
-
平方误差的矩阵表示: ( y − X w ) T ( y − X w ) (y-Xw)^T(y-Xw) (y−Xw)T(y−Xw),对w求导并令其等于零可得:
w ^ = ( X T X ) − 1 X T y \hat{w} = (X^TX)^{-1}X^Ty w^=(XTX)−1XTy,其中 w ^ \hat{w} w^表示其估计最优解
算法实现
def standRegres(xArr, yArr):
"""
基于普通最小二乘法线性回归
"""
xMat = np.mat(xArr)
yMat = np.mat(yArr).T
xTx = xMat.T * xMat
if np.linalg.det(xTx) == 0.0: # 若行列式为0,则可计算逆矩阵
print "This matrix is singular, cannot do inverse"
return
ws = xTx.I * (xMat.T * yMat)
return ws
xArr, yArr = loadDataSet("./machinelearninginaction/Ch08/ex0.txt")
ws = standRegres(xArr, yArr)
xMat = np.mat(xArr)
yMat = np.mat(yArr)
yHat = xMat * ws
# 画图查看回归效果
import matplotlib.pyplot as plt
fig = plt.figure()
ax = fig.add_subplot(111)
ax.scatter(xMat[:, 1].flatten().A[0], yMat.T[:, 0].flatten().A[0], s=8)
xCopy = xMat.copy()
xCopy.sort(0)
yHat = xCopy * ws
ax.plot(xCopy[:, 1], yHat, color="r")
plt.show()
print np.corrcoef((xMat*ws).T, yMat) # 计算预测值和真实值的相关系数
8.2 局部加权线性回归
- 使用最小均方误差的无偏估计时,线性回归容易出现欠拟合现象。可考虑在估计中引入一些偏差,从而降低预测的均方误差。
- 局部加权线性回归(Locally Weighted Linear Regression,LWLR)
- 每次预测前先选出对应的数据子集
- 计算回归系数w: w ^ = ( X T W X ) − 1 X T W y \hat{w} = (X^TWX)^{-1}X^TWy w^=(XTWX)−1XTWy
- W为权重矩阵,为数据集中每个点赋予权重
- LWLR核函数通常用高斯核: w ( i , i ) = e