哔哩哔哩视频地址 https://www.bilibili.com/video/BV1Ap4y1i73i
局部线性回归 python 实现
import numpy as np
import matplotlib.pyplot as plt
"""
implementation of Locally weighted linear regression in http://cs229.stanford.edu/notes/cs229-notes1.pdf
"""
# 局部线性回归 思想:预测一个点的值时,选择与这个点相近的一些点而不是所有的点做线性回归,有点微元 、以直代曲的思想
class LocallyWeightedLinearRegression:
def __init__(self,tau):
self.tau = tau # tau 为波长参数,它控制了权值随距离下降的速率 我理解的就是用周围相近的 f(tau )个点对这个点做线性回归
self.w = None
"""
功能:返回对当前点 checkpoint_x 的预测值
"""
def fit_predict(self,X,y,checkpoint_x): # checkpoint_x 是代表对checkpoint_x这个点做线性回归 X样本集,y标签集
m = X.shape[0]
self.n_features = X.shape[1]
extra = np.ones((m,))
X = np.c_[X, extra]
checkpoint_x = np.r_[checkpoint_x,1]
self.X, self.y, self.checkpoint_x = X, y, checkpoint_x
weight = np.zeros((m,)) # 权重矩阵,指的是不同样本对checkpoint_x的影响程度,并不是我们模型的那个参数
for i in range(m):
weight[i] = np.exp(-(X[i]-checkpoint_x).dot((X[i]-checkpoint_x).T)/(2*(self.tau**2)))
weight_matrix = np.diag(weight) # 扩展成对角阵,array是一个1维数组时,结果形成一个以一维数组为对角线元素的矩阵, array是一个二维矩阵时,结果输出矩阵的对角线元素
self.w = np.linalg.inv(X.T.dot(weight_matrix).dot(X)).dot(X.T).dot(weight_matrix).dot(y) # 模型参数w 计算
return checkpoint_x.dot(self.w) # 返回对当前点 checkpoint_x 的预测值
def fit_transform(self,X,y,checkArray):
m = len(y)
preds=[] # 预测结果列表
for i in range(m):
preds.append(self.fit_predict(X, y, checkArray[i]))
return np.array(preds)
if __name__=='__main__':
X = np.linspace(0,30,100)
y = X**2+2*X+2
X = X.reshape(-1,1)
lr = LocallyWeightedLinearRegression(tau=3)
y_pred = lr.fit_transform(X,y,X)
plt.plot(X,y,label='original') #画图并设置标签
plt.plot(X,y_pred,label='predict')
plt.legend() #初步理解成显示图例
plt.show()
机器学习 局部线性回归