Python中的局部加权回归实例
更新时间:2023-11-24Python中的局部加权回归实例
介绍
局部加权回归算法(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()
执行以上代码,将得到以下预测结果:
总结
局部加权回归算法是一种非参数的回归方法,其优点是无需对函数形式进行假设,能够拟合高度非线性的数据,并且在处理多维数据时也非常有效。但其缺点是计算成本较高,需要对每个新的自变量进行局部加权计算。