K最近邻算法(K-Nearest Neighbors,KNN)是一种常用的监督学习分类算法。它的基本思想是通过计算样本之间的距离来进行分类。具体而言,对于一个未知样本,KNN算法会找出与该样本最近的K个已知样本,并根据这K个样本的标签来判断未知样本的类别。
KNN算法的步骤如下:
-
准备数据集:首先需要准备带有标签的训练集,其中每个样本都有对应的特征和类别标签。
-
计算距离:对于一个未知样本,计算它与训练集中每个样本的距离。常见的距离度量方法有欧氏距离、曼哈顿距离等。
-
选择K值:确定K的大小,即要考虑的最近邻样本的数量。
-
寻找K个最近邻:从训练集中选择距离未知样本最近的K个样本。
-
进行投票决策:根据K个最近邻样本的标签进行投票,将得票最多的类别作为未知样本的预测类别。
-
输出预测结果:将预测的类别作为未知样本的分类结果。
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()