在这篇文章中,将探讨如何使用k-最近邻算法来解决回归问题,并通过barycenter和常数权重对目标值进行插值。k-最近邻算法是一种基于实例的学习,它通过查找数据集中与新数据点最近的k个实例来预测新数据点的输出值。在回归问题中,这些最近邻的输出值将被用来估计新数据点的输出值。
首先,需要生成一些用于训练模型的数据点。此外,还会生成整个训练数据范围内的数据,以便可视化模型在整个区域的反应。
import matplotlib.pyplot as plt
import numpy as np
from sklearn import neighbors
# 设置随机数种子以确保结果的可重复性
rng = np.random.RandomState(0)
# 生成训练数据
X_train = np.sort(5 * rng.rand(40, 1), axis=0)
# 生成测试数据
X_test = np.linspace(0, 5, 500)[:, np.newaxis]
# 计算训练数据的正弦值作为目标值
y = np.sin(X_train).ravel()
# 为目标值添加噪声
y[::5] += 1 * (0.5 - np.random.rand(8))
接下来,将训练一个模型,并可视化在预测中使用均匀和距离权重对预测值的影响。
n_neighbors = 5
# 遍历不同的权重类型
for i, weights in enumerate(["uniform", "distance"]):
# 创建k-最近邻回归模型
knn = neighbors.KNeighborsRegressor(n_neighbors, weights=weights)
# 拟合模型并进行预测
y_ = knn.fit(X_train, y).predict(X_test)
# 绘制训练数据和预测结果
plt.subplot(2, 1, i + 1)
plt.scatter(X_train, y, color="darkorange", label="数据")
plt.plot(X_test, y_, color="navy", label="预测")
plt.axis("tight")
plt.legend()
plt.title("KNeighborsRegressor (k=%i, weights='%s')" % (n_neighbors, weights))
plt.tight_layout()
plt.show()
通过上述代码,可以看到k-最近邻回归模型是如何根据训练数据预测新数据点的输出值的。在第一个子图中,使用了均匀权重,而在第二个子图中,使用了距离权重。这两种权重方法在预测时会有不同的表现,均匀权重会给所有最近邻相同的权重,而距离权重则会根据距离的远近给予不同的权重。
整个脚本的运行时间大约为0.216秒。可以通过以下链接下载Jupyter笔记本、Python源代码或压缩包:
如果对k-最近邻算法在分类问题中的应用感兴趣,或者想了解如何结合邻域成分分析来提高k-最近邻算法的性能,可以查看以下相关示例: