机器学习 - K 近邻 (KNN)
在此页面上,W3schools.com 与 纽约数据科学学院 合作,为我们的学生提供数字培训内容。
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()