机器学习 局部线性回归

哔哩哔哩视频地址 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()

机器学习 局部线性回归

猜你喜欢

转载自blog.csdn.net/qq_43657442/article/details/108038831