1. 基本定义
k最近邻(k-Nearest Ne ighbor)算法是比较简单的机器学习算法。它采用测量不同特征值之间的距离方法进行分类。它的思想很简单:如果一个样本在特征空间中的多个最近邻(最相似〉的样本中的大多数都属于某一个类别,则该样本也属于这个类别。第一个字母k可以小写,表示外部定义的近邻数量。简而言之,就是让机器自己按照每一个点的距离,距离近的为一类。
2. 算法原理
knn算法的核心思想是未标记样本的类别,由距离其最近的k个邻居投票来决定。
具体的,假设我们有一个已标记好的数据集。此时有一个未标记的数据样本,我们的任务是预测出这个数据样本所属的类别。knn的原理是,计算待标记样本和数据集中每个样本的距离,取距离最近的k个样本。待标记的样本所属类别就由这k个距离最近的样本投票产生。
3.案例实现
用knn算法根据电影中打斗镜头次数与接吻镜头次数的比较来判断该电影的类型是动作片还是爱情片。
4.代码
from math import sqrt # 创建样本数据 dataset = { '电影1': [3, 104, '爱情片'], '电影2': [18, 90, '爱情片'], '电影3': [2, 81, '爱情片'], '电影4': [101, 10, '动作片'], '电影5': [99, 5, '动作片'], '电影6': [98, 2, '动作片'] } # 定义KNN算法函数 def knn(data, predict, k=3): distances = [] for movie in data: features = data[movie][:2] # 计算欧几里得距离 euclidean_distance = sqrt((features[0] - predict[0]) ** 2 + (features[1] - predict[1]) ** 2) distances.append([euclidean_distance, movie]) # 按距离从小到大排序 distances.sort() # 取前k个最近的距离 neighbors = [distance[1] for distance in distances[:k]] # 统计邻居中各类别的出现次数 class_votes = {} for neighbor in neighbors: class_name = data[neighbor][2] class_votes[class_name] = class_votes.get(class_name, 0) + 1 # 按类别出现次数从大到小排序 sorted_votes = sorted(class_votes.items(), key=lambda x: x[1], reverse=True) return sorted_votes[0][0] # 测试 test_movie = [18, 90] # 测试电影的打斗镜头次数和接吻镜头次数 k = 3 # 设置K值 predicted_genre = knn(dataset, test_movie, k) print("预测电影类型为:", predicted_genre)
5.结果展示
5.结论
算法优缺点
- 优点:模型训练时间快,准确性高,对异常值和噪声有较高的容忍度。
- 缺点:计算量较大,对内存的需求也较大,对不相关的功能和数据规模敏感。