c语言编程笔录

首页 >   > 笔记大全

笔记大全

Python中的局部加权回归实例

更新时间:2023-11-24

Python中的局部加权回归实例

介绍

局部加权回归算法(Locally Weighted Regression,简称LWR)是一个非参数的回归方法,无需事先假定一个函数的形式,而是在每个新点上进行一次局部的计算。

算法原理

LWR算法的目标是在给定训练数据集X和响应变量y的情况下,对于新的自变量x,求出对应的响应变量y。假设训练数据集的大小为m,自变量x的维度为n,则算法的主要步骤如下:

1. 根据自变量x与训练数据集X之间的距离计算出权重w

    import numpy as np

    def weight(x, X, tau):
        m=X.shape[0]
        w=np.zeros((m, m))
        for i in range(m):
            xi=X[i]
            w[i, i]=np.exp(-np.dot((xi - x), (xi - x).T) / (2 * tau ** 2))
        return w
    

其中,tau是一个参数,用于控制权重的衰减速度。

2. 根据权重w和训练数据集X计算出局部线性回归的系数

    def local_regression(x, X, y, tau):
        m, n=X.shape
        w=weight(x, X, tau)
        theta=np.linalg.inv(X.T @ (w @ X)) @ (X.T @ (w @ y))
        return theta
    

3. 在新的自变量x处,根据步骤2得到的系数预测响应变量y

    def y_hat(x, X, y, tau):
        theta=local_regression(x, X, y, tau)
        return x @ theta
    

示例

以下是一个使用LWR算法拟合sin函数的示例:

    import matplotlib.pyplot as plt

    # 生成训练数据
    X=np.linspace(-10, 10, 100)[:, None]
    y=np.sin(X) + np.random.normal(0, 0.1, X.shape)

    # 定义参数
    tau=0.1

    # 预测新的自变量x处的响应变量y
    x=np.array([1.0])
    y_pred=y_hat(x, X, y, tau)

    # 绘制预测结果和原始数据
    plt.scatter(X, y, c='r')
    plt.plot(x, y_pred, 'bo', markersize=10)
    plt.xlabel('X')
    plt.ylabel('y')
    plt.show()
    

执行以上代码,将得到以下预测结果:

LWR预测结果

总结

局部加权回归算法是一种非参数的回归方法,其优点是无需对函数形式进行假设,能够拟合高度非线性的数据,并且在处理多维数据时也非常有效。但其缺点是计算成本较高,需要对每个新的自变量进行局部加权计算。