来源:原始 Jupyter Notebook。内容已转换为网页阅读格式;下载原文件。
这一节我们使用 sklearn 自带的鸢尾花数据集来实现 kNN 算法,和前面一样,我们只取数据集中的两个维度:
import matplotlib.pyplot as plt
from sklearn import datasets
iris = datasets.load_iris();
X = iris.data
y = iris.target
X = X[y < 2, :2]
y = y[y < 2]
plt.scatter(X[y == 0, 0], X[y == 0, 1], color='red')
plt.scatter(X[y == 1, 0], X[y == 1, 1], color='blue')
plt.show()
运行结果

使用 sklearn 的 kNN 算法和 sklearn 的其他算法流程是一样的:首先定义分类器(在这里分类器为 KNeighborsClassifier),然后通过 fit 训练数据得到模型,最后通过 predict 对新的样本进行预测。
from sklearn.neighbors import KNeighborsClassifier
kNN = KNeighborsClassifier(n_neighbors=6)
kNN.fit(X, y)
results = kNN.predict([[6,2], [4, 3]])
print(results)
运行结果
[1 0]
上面对 (6,2) 和 (4,3) 两个样本进行预测,可以看到预测结果是正确的。
其他实例
在 Peter Harrington 的《机器学习实战》的第二章,还介绍了很多使用 kNN 解决现实问题的例子,譬如:
- 电影分类:根据电影中出现的打斗镜头数和接吻镜头数判断电影的类别

- 海伦约会:根据对方每年的飞行里程公里数、每周玩游戏所花费的小时数、每周吃掉的零食的斤数来判断对方是不是自己喜欢的类型

- 手写数字识别
可以参考这里:https://cuijiahua.com/blog/2017/11/ml_1_knn.html
归一化
在 kNN 算法中,还有一点需要特别注意,由于大多数时候我们都是使用欧式距离来作为距离度量方法,而欧氏距离公式会极大地受到数值大小的影响,比如上面海伦约会的例子中,两个人的飞行里程可能很容易就相差2000,但吃掉的零食斤数最多可能也就差10,这样算出来的距离就几乎只受飞行里程影响,而对于海伦来说,3个特征是同等重要的。为了解决这个问题,我们需要对这三个特征的特征值进行 归一化 (Normalization)处理,使得它们的取值范围都落在0到1之间。