KNN算法

K最近邻算法(K-Nearest Neighbors,KNN)是一种常用的监督学习分类算法。它的基本思想是通过计算样本之间的距离来进行分类。具体而言,对于一个未知样本,KNN算法会找出与该样本最近的K个已知样本,并根据这K个样本的标签来判断未知样本的类别。

KNN算法的步骤如下:

  1. 准备数据集:首先需要准备带有标签的训练集,其中每个样本都有对应的特征和类别标签。

  2. 计算距离:对于一个未知样本,计算它与训练集中每个样本的距离。常见的距离度量方法有欧氏距离、曼哈顿距离等。

  3. 选择K值:确定K的大小,即要考虑的最近邻样本的数量。

  4. 寻找K个最近邻:从训练集中选择距离未知样本最近的K个样本。

  5. 进行投票决策:根据K个最近邻样本的标签进行投票,将得票最多的类别作为未知样本的预测类别。

  6. 输出预测结果:将预测的类别作为未知样本的分类结果。

KNN算法的优点包括简单易实现、对异常值不敏感、能够处理多分类问题等。然而,KNN算法的缺点是计算量大,在大规模数据集上表现较差。此外,KNN算法对于特征的选择和数据的规范化也比较敏感。

在使用KNN算法时,常用的工具包如sklearn提供了相应的API,可以方便地进行模型训练和预测。

案例:使用K-邻近算法来对电影的类型进行判断

1.实验思路:

通过电影场景里面的打斗镜头次数与接吻镜头次数的比较然后根据KNN算法来进行判断该电影的类型是动作片还是爱情片

2.代码实现:

(一)首先创建一个数据集,里面有两个数组,其中一个存放打斗/接吻次数,另一个存放与之相对应的电影类型标签

from collections import Counter
import numpy as np

def createDataSet():
    dataset = np.array([[1, 2], [2, 1], [1, 3], [3, 4], [4, 3], [3, 2]])
    labels = np.array(['爱情片', '爱情片', '爱情片', '动作片', '动作片', '动作片'])
    return dataset, labels

(二)KNN算法的核心,用来判断测试集属于训练集中的哪一种。这里有四个参数,分别表示输入的测试集,数据集,数据集中的标签,选择距离最小的k个点以用来投票。出现次数最多的为影片的最终类型

def classify(inx, dataset, labels, k):
    distances = np.sqrt(np.sum((dataset - inx) ** 2, axis=1))  # 欧氏距离计算
    sorted_indices = np.argsort(distances)
    k_nearest_labels = labels[sorted_indices[:k]]
    label_counts = Counter(k_nearest_labels)
    most_common_label = label_counts.most_common(1)[0][0]
    return most_common_label

(三)输入一个自定义测试集进行测试

def main():
    dataset, labels = createDataSet()
    test = np.array([2.5, 2])
    predicted_label = classify(test, dataset, labels, k=3)
    print("Predicted label:", predicted_label)

if __name__ == '__main__':
    main()

3.运行截图:

4.完整代码展示:

from collections import Counter
import numpy as np

def createDataSet():
    dataset = np.array([[1, 2], [2, 1], [1, 3], [3, 4], [4, 3], [3, 2]])
    labels = np.array(['爱情片', '爱情片', '爱情片', '动作片', '动作片', '动作片'])
    return dataset, labels

def classify(inx, dataset, labels, k):
    distances = np.sqrt(np.sum((dataset - inx) ** 2, axis=1))  # 欧氏距离计算
    sorted_indices = np.argsort(distances)
    k_nearest_labels = labels[sorted_indices[:k]]
    label_counts = Counter(k_nearest_labels)
    most_common_label = label_counts.most_common(1)[0][0]
    return most_common_label

def main():
    dataset, labels = createDataSet()
    test = np.array([2.5, 2])
    predicted_label = classify(test, dataset, labels, k=3)
    print("Predicted label:", predicted_label)

if __name__ == '__main__':
    main()

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值