K 近邻算法(K-Nearest Neighbor)

K-近邻算法(K-Nearst Neighbor)基本是机器学习过程中接触的第一个算法。接下来,我们从以下几个方面来讲解下该算法:

  1. K-近邻算法实现思路
  2. K-近邻算法基本要素
  3. sklearn 代码实现

1. K-近邻算法实现思路

K-近邻算法的思路是:在训练样本中,如果一个测试样本附近的 K 个最接近的训练样本的大多数属于某一个类别,则该测试样本也属于这个类别。

我们将该算法的实现步骤分解如下:

1. 获得一个测试样本 s;
2. 计算该测试样本 s 到所有训练样本 t1, t2 … tn 的距离;
3. 获得 K 个距离测试样本 s 最近的训练样本;
4. 如果 K 个样本中,多数属于 C 类别,则认为测试样本 s 也属于 C 类别。

请继续看下面的示意图:

假设:我们现在要判断一个测试样本(绿色圆形)属于哪个分类,按照 K-近邻算法思路,其过程如下:

首先,计算测试样本(绿色圆形)到其他的每一个训练样本(所有蓝色的方块、红色的三角形)之间的距离。

然后,找到距离测试样本(绿色圆形)最近的 K 个训练样本:

如上图所示,如果 K 的值为 3,则实线圆圈范围内是选出的训练样本,由于红色三角形比较多,所以,就认为绿色圆形属于红色三角形所属的类别。

如果 K 的值是 5,则虚线圆圈范围内是选出的训练样本,由于蓝色方块比较多,所以,就认为绿色圆形属于蓝色方块所属的类别。

2. K-近邻算法基本要素

在 K-近邻算法中,我们可以看到有几个基本要素:

2.1 分类规则

K-近邻算法使用多数表决来确定类别,即由输入测试样本的 K 个近邻的训练样本中的多数决定测试样本的类别。

2.2 距离计算

实际上,距离的度量方式有很多,不同的度量方式会导致临近点是不同的。

2.3 K 值确定

K 值得选择会影响到测试样本邻近的训练样本数量,并影响最终的结果。

如果确定的 K 值较小时,意味着选取的邻近训练样本个数少,只有距离测试样本较近的训练样本才会对结果起作用,近似误差会减少,但是估计误差会增大,近邻的训练样本会对结果影响较大。所以,K 值一般选择较小的整数,具体的数值需要经过反复测试来获得。

3. sklearn 代码实现

from sklearn.neighbors import KNeighborsClassifier
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split


def iris_data():
    """
    鸢尾花数据信息
    """

    # 1. 加载红酒数据集
    dataset = load_iris()
    # 样本数量
    print("样本数量:", len(dataset.data))
    # 类别名称
    print("类别名称:", dataset.target_names)
    # 特征名称
    print("特征名称:", dataset.feature_names)
    # 样本类别
    print("样本类别:", dataset.target)
    # 样本数据
    print("样本数据:", dataset.data)


# knn API
def knn_api():

    # 1. 加载鸢尾花数据
    iris_dataset = load_iris()

    # 2. 创建 knn 分类对象
    knn = KNeighborsClassifier(n_neighbors=3)

    # 3. 将数据集划分为训练集和测试集[测试集占所有数据集的20%]
    X_train, X_test, y_train, y_test = \
        train_test_split(iris_dataset.data, iris_dataset.target, test_size=0.2)

    # 4. 训练数据
    knn.fit(X_train, y_train)

    # 5. 进行预测
    for index in range(len(X_test)):

        # 5.1 计算当前测试样本属于哪个分类
        class_label = knn.predict([X_test[index]])
        # 5.2 计算当前测试样本属于每个分类的概率
        class_proba = knn.predict_proba([X_test[index]])
        # 5.3 返回距离当前测试样本最近的 N 个样本
        nearest_neighbors = knn.kneighbors([X_test[index]], 5, False)

    # 预测准确率
    predict_score = knn.score(X_test, y_test, sample_weight=None)
    print("准确率:", predict_score)


if __name__ == "__main__":
    knn_api()
未经允许不得转载:一亩三分地 » K 近邻算法(K-Nearest Neighbor)
评论 (0)

3 + 8 =