📜  使用Python 的局部加权线性回归(1)

📅  最后修改于: 2023-12-03 15:36:36.169000             🧑  作者: Mango

使用Python的局部加权线性回归

简介

局部加权线性回归(Locally Weighted Linear Regression)是一种非参数的回归算法,其基本思想是:对于每一个测试样本点,选取一些训练数据做回归,但是不同的数据点对回归结果的贡献不同,加大对与预测样本接近的训练点的相对权重,从而得到更加准确的预测结果。

实现步骤
加载数据

本例使用线性数据,在代码中生成。

import numpy as np

# 生成数据
def generate_data():
    np.random.seed(42)
    X = np.sort(5 * np.random.rand(100, 1), axis=0)
    y = np.sin(X).ravel()
    y[::5] += 3 * (0.5 - np.random.rand(20))

    return X, y

X, y = generate_data()
局部加权线性回归

使用scikit-learn实现局部加权线性回归,需要使用sklearn.neighbors.KNeighborsRegressor

from sklearn.linear_model import LinearRegression
from sklearn.neighbors import KNeighborsRegressor

def locally_weighted_linear_regression(X_train, y_train, x, k=5):
    # 训练集和测试集大小相同时可以不用knn回归器,直接用线性回归。
    if len(X_train) == k:
        model = LinearRegression()
        model.fit(X_train, y_train)
        return model.predict(x.reshape(1, -1))

    knn = KNeighborsRegressor(n_neighbors=k, p=1)
    knn.fit(X_train, y_train)
    weights = np.exp(-knn.kneighbors(x.reshape(1, -1))[0] ** 2 / 2)
    weights /= np.sum(weights)

    model = LinearRegression()
    model.fit(X_train, y_train, sample_weight=weights)
    return model.predict(x.reshape(1, -1))
实现预测

遍历测试集上的每一项数据,使用上述函数计算估计值。

def predict(X_train, y_train, X_test, k=5):
    y_pred = []
    for x in X_test:
        pred = locally_weighted_linear_regression(X_train, y_train, x, k)
        y_pred.append(pred)

    return y_pred

X_test = np.linspace(0, 5, 100).reshape(-1, 1)
y_pred = predict(X, y, X_test, k=5)
可视化

最后,我们可以将实际数据和估计值进行可视化比较。

import matplotlib.pyplot as plt

plt.figure(figsize=(8, 6))
plt.scatter(X, y, c="k", label="actual")
plt.plot(X_test, y_pred, c="r", label="prediction")
plt.legend()
plt.show()
总结

局部加权线性回归是一种非参数的回归算法,其实现基本流程可分为数据加载、局部加权线性回归、预测和可视化四个步骤。在实际应用中,需要调整参数以获得更好的预测效果。