机器学习教程 正在计划编写中,欢迎大家加微信 sinbam 提供意见、建议、纠错、催更。
KNN(K-Nearest Neighbor)是机器学习入门级的分类算法,也是最为简单的算法。它实现将距离近的样本点划为同一类别,KNN 中的K指的是近邻个数,也就是最近的K个点,根据它距离最近的K个点是什么类别来判断属于哪个类别。
「人以群分,物语类聚」、「近朱者赤,近墨者黑」是 KNN 的核心思想。这其实和我们在日常生活中评价一个人的方法是一样的,如果你想要知道一个人是怎么样的,那就去找和他关系好的几个人看看对他的评价或者看和他关系好的人是什么样子的,就可以大致判断出他是什么样的人了。
其中的 K 就是 K 个最近的邻居的意思。KNN 的原理就是当预测一个待分类的值 x 的时候,通过计算找出离它距离最近的 K 个样本,然后由这个 K 个样本投票决定 x 归为哪一类。
我们也可以看到实现这个算法的两个核心问题是计算距离和选取 K 的取值。
KNN 算法的步骤:
更加详细的步骤为:
以下是一个 KNN 算法的动态演示,他能够根据取不同 K 的值将白点归到不同的类别。
当 K 取值不同的时候,判别的结果是不同的。所以该算法中 K 值如何选择将非常重要,因为它会影响到我们最终的结果。
KNN 算法中用样本之间的距离来衡量样本之间的相似度。常用的距离有:
其中:
欧式距离最为常用,n 个 p 维样本 x_i 其欧式距离公式如下:
距离的计算本教程会单独做介绍。
K-Nearest Neighbors 是用于分类和回归的机器学习算法(主要用于分类)。它考虑了不同的质心,并使用欧几里得函数来比较距离。接着分析结果并将每个点分类到组中,以优化它,使其与所有最接近的点一起放置。它使用k个最近邻的多数票对数据进行分类预测。
import matplotlib.pyplot as plt
import numpy as np
from sklearn.model_selection import train_test_split
from sklearn.datasets import make_classification
# Naive Bayes 任务为分类, n_classes=4
import sklearn.naive_bayes as nb
# 1. 准备数据,生成一个随机n类分类问题
nb_X_train, nb_y_train = make_classification(n_features=2, n_redundant=0, n_informative=2,
random_state=1, n_clusters_per_class=1, n_classes=4)
# 2. 构造训练与测试集
l, r = nb_X_train[:, 0].min() - 1, nb_X_train[:, 0].max() + 1
b, t = nb_X_train[:, 1].min() - 1, nb_X_train[:, 1].max() + 1
n = 1000
grid_x, grid_y = np.meshgrid(np.linspace(l, r, n), np.linspace(b, t, n))
nb_X_test = np.column_stack((grid_x.ravel(), grid_y.ravel()))
# 3. 训练模型
nb_model = nb.GaussianNB()
nb_model.fit(nb_X_train, nb_y_train)
# 4. 预测数据
nb_y_pred = nb_model.predict(nb_X_test)
# 5. 可视化
grid_z = nb_y_pred.reshape(grid_x.shape)
plt.figure('Naive Bayes')
plt.title('Naive Bayes')
plt.pcolormesh(grid_x, grid_y, grid_z, cmap='Blues')
plt.scatter(nb_X_train[:, 0], nb_X_train[:, 1], s=30, c=nb_y_train, cmap='pink')
plt.show()