参考:《机器学习实战》
源码地址以及数据:https://github.com/JieruZhang/MachineLearninginAction_src
1. 标准线性回归(LR)
y = X w + b \mathbf{y} = \mathbf{X}w + b y=Xw+b
平 方 误 差 : ∑ i = 1 N ( y i − x i T w ) 2 平方误差:\sum_{i=1}^N (y_i - x_i^Tw)^2 平方误差:i=1∑N(yi−xiTw)2
导 数 为 零 求 得 : w ^ = ( X T X ) − 1 X T y 导数为零求得:\hat{w} = (\mathbf{X}^T\mathbf{X})^{-1}\mathbf{X}^Ty 导数为零求得:w^=(XTX)−1XTy
目标:最小平方误差。
注意,需要先判断矩阵是否可逆,判断方法:行列式不为零。
from numpy import *
import matplotlib.pyplot as plt
#读取数据
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
#标准线性回归函数
def standRegres(xArr, yArr):
xMat = mat(xArr)
yMat = mat(yArr).T
xTx = xMat.T * xMat
#判断行列式为零,则无法求逆
if linalg.det(xTx) == 0:
print('the matrix is singular, cannot do inverse')
return
ws = (xTx).I * (xMat.T*yMat)
return ws
#拟合数据
xArr, yArr = loadDataSet('ex0.txt')
ws = standRegres(xArr, yArr)
xMat = mat(xArr)
yMat = mat(yArr)
yHat = xMat*ws
fig = plt.figure()
ax = fig.add_subplot(111)
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.show()
计算 y ^ \hat{y} y^ 和 y y y 之间的相关系数,用来判断预测值和实际值的匹配程度。
yHat = xMat*ws
corrcoef(yHat.T, yMat)
array([[1. , 0.97223133],
[0.97223133, 1. ]])
2. 局部加权线性回归(LWLR)
标准线性回归依据最小均方误差(MSE),则可能会导致欠拟合。因此可以在估计中加入偏差,降低预测的均方误差。
局部加权线性回归:给待遇测点附近每个点赋予一定的权重,然后继续进行最小均方差回归。设置一个权重矩阵 W W W,给每个数据点赋予一个权重。可以使用 核 来给附近的点赋予更大的权值,常用的是高斯核:
w ( i , i ) = e x p ( ∣ x ( i ) − x ∣ − 2 k 2 ) w(i,i) = exp(\frac{|x^(i) - x|}{-2k^2}) w(i,i)=exp(