机器学习 - K 近邻 (KNN)
在本页,W3schools.com 与 NYC Data Science Academy 合作,为我们的学生提供数字培训内容。
KNN
KNN 是一种简单、监督的机器学习 (ML) 算法,可用于分类或回归任务,也经常用于缺失值插补。它基于这样的理念:最靠近给定数据点的观测值是在数据集中最 "相似" 的观测值,因此我们可以根据最靠近的现有点的值对不可预测的点进行分类。通过选择 *K*,用户可以选择在算法中使用的附近观测值的个数。
在这里,我们将向您展示如何实现用于分类的 KNN 算法,并展示不同的 *K* 值如何影响结果。
它是如何工作的?
*K* 是要使用的最近邻的个数。对于分类,使用多数投票来确定新观测值应该属于哪个类别。较大的 *K* 值通常对异常值更稳健,并且比非常小的值产生更稳定的决策边界(*K=3* 比 *K=1* 更好,后者可能会产生不可取的结果)。
例子
首先可视化一些数据点
import matplotlib.pyplot as plt
x = [4, 5, 10, 4, 3, 11, 14 , 8, 10, 12]
y = [21, 19, 24, 17, 16, 25, 24, 22, 21, 21]
classes = [0, 0, 1, 0, 0, 1, 1, 0, 1, 1]
plt.scatter(x, y, c=classes)
plt.show()
结果
运行例子 »广告
现在我们用 K=1 拟合 KNN 算法
from sklearn.neighbors import KNeighborsClassifier
data = list(zip(x, y))
knn = KNeighborsClassifier(n_neighbors=1)
knn.fit(data, classes)
并用它对一个新的数据点进行分类
例子
new_x = 8
new_y = 21
new_point = [(new_x, new_y)]
prediction = knn.predict(new_point)
plt.scatter(x + [new_x], y + [new_y], c=classes + [prediction[0]])
plt.text(x=new_x-1.7, y=new_y-0.7, s=f"new point, class: {prediction[0]}")
plt.show()
结果
运行例子 »现在我们做同样的事情,但是使用更高的 K 值,这会改变预测结果
例子
knn = KNeighborsClassifier(n_neighbors=5)
knn.fit(data, classes)
prediction = knn.predict(new_point)
plt.scatter(x + [new_x], y + [new_y], c=classes + [prediction[0]])
plt.text(x=new_x-1.7, y=new_y-0.7, s=f"new point, class: {prediction[0]}")
plt.show()
结果
运行例子 »例子解释
导入您需要的模块。
您可以在我们的 "Matplotlib 教程 中了解 Matplotlib 模块。
scikit-learn 是 Python 中一个流行的机器学习库。
import matplotlib.pyplot as plt
from sklearn.neighbors import KNeighborsClassifier
创建类似于数据集变量的数组。我们有两个输入特征(x
和 y
),然后是一个目标类别(class
)。预先标记了目标类别的输入特征将用于预测新数据的类别。注意,虽然我们这里只使用了两个输入特征,但此方法适用于任何数量的变量。
x = [4, 5, 10, 4, 3, 11, 14 , 8, 10, 12]
y = [21, 19, 24, 17, 16, 25, 24, 22, 21, 21]
classes = [0, 0, 1, 0, 0, 1, 1, 0, 1, 1]
将输入特征转换为一组点。
data = list(zip(x, y))
print(data)
结果
[(4, 21), (5, 19), (10, 24), (4, 17), (3, 16), (11, 25), (14, 24), (8, 22), (10, 21), (12, 21)]
使用输入特征和目标类别,我们在模型上使用 1 个最近邻拟合 KNN 模型。
knn = KNeighborsClassifier(n_neighbors=1)
knn.fit(data, classes)
然后,我们可以使用同一个 KNN 对象来预测新、不可预见的数据点的类别。首先,我们创建新的 x 和 y 特征,然后对新数据点调用 knn.predict()
以获取类别 0 或 1。
new_x = 8
new_y = 21
new_point = [(new_x, new_y)]
prediction = knn.predict(new_point)
print(prediction)
结果
[0]
当我们将所有数据与新点和类别一起绘制时,我们可以看到它被标记为蓝色,类别为 1
。文本注释只是为了突出显示新点的位置。
plt.scatter(x + [new_x], y + [new_y], c=classes + [prediction[0]])
plt.text(x=new_x-1.7, y=new_y-0.7, s=f"new point, class: {prediction[0]}")
plt.show()
结果
但是,当我们将邻居数量更改为 5 时,用于对新点进行分类的点数会发生变化。因此,新点的分类也会发生变化。
knn = KNeighborsClassifier(n_neighbors=5)
knn.fit(data, classes)
prediction = knn.predict(new_point)
print(prediction)
结果
[1]
当我们将新点的类别与旧点一起绘制时,我们注意到颜色已根据相关的类别标签发生了变化。
plt.scatter(x + [new_x], y + [new_y], c=classes + [prediction[0]])
plt.text(x=new_x-1.7, y=new_y-0.7, s=f"new point, class: {prediction[0]}")
plt.show()