📅  最后修改于: 2023-12-03 15:36:36.169000             🧑  作者: Mango
局部加权线性回归(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()
局部加权线性回归是一种非参数的回归算法,其实现基本流程可分为数据加载、局部加权线性回归、预测和可视化四个步骤。在实际应用中,需要调整参数以获得更好的预测效果。