k近邻算法

本文介绍了k-NearestNeighbor(KNN)算法的基本定义,包括其分类原理和通过电影打斗/接吻镜头判断类型的案例。还提供了Python代码实现,并讨论了KNN算法的优点(如训练速度快,对异常值容忍度高)和缺点(如计算量大,内存需求大)。
摘要由CSDN通过智能技术生成

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.结论

        算法优缺点

  • 优点:模型训练时间快,准确性高,对异常值和噪声有较高的容忍度。
  • 缺点:计算量较大,对内存的需求也较大,对不相关的功能和数据规模敏感。

  • 11
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值