KNN算法学习--简单实现对羽毛球拍类型的分类

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

一、项目背景

最近刚学knn近邻算法,通过借鉴电影分类项目来实现一个羽毛球拍类型判断来加深一下对knn算法理解

二、KNN算法

k近邻算法用一句通俗的古语来说就是:“物以类聚,人以群分”。

k近邻法三要素:距离度量k值的选择分类决策规则

欧式距离计算公式如下

k值选择

 K 的取值很重要,通过交叉验证来判断k值好坏(将样本数据按照一定比例,拆分出训练用的数据和验证用的数据,比如6:4拆分出部分训练数据和验证数据),从选取一个较小的 K 值开始,不断增加 K 的值,然后计算验证集合的方差,最终找到一个比较合适的 K 值。

knn算法优缺点

优点:

  1. 简单易懂:KNN算法非常直观和易于理解,它使用了一种基本的度量来计算样本之间的距离,并根据最近邻居的投票结果进行分类或回归。
  2. 无需训练过程:KNN算法是一种基于实例的学习方法,不需要在训练阶段建立模型,因此训练过程非常简单。
  3. 对异常值不敏感:由于KNN算法使用了最近邻居的投票结果,它对数据中的异常值不敏感。这是因为少数异常值对多数邻居的投票结果影响较小。
  4. 适用于多分类问题:KNN算法可以应用于多分类问题,通过选择合适的K值和投票机制,可以在多个类别中进行决策。

缺点:

  1. 需要大量的存储空间:KNN算法需要存储整个训练数据集,以便在预测阶段进行比较和计算。对于大规模数据集来说,存储和计算的成本会很高。
  2. 计算复杂度高:在预测阶段,KNN算法需要计算新样本与所有训练样本之间的距离,这个过程是计算密集型的,特别是对于大规模数据集来说。
  3. 效果受参数K的影响:KNN算法中的K值决定了最近邻居的数量。选择合适的K值很重要,如果选择较小的K值,模型可能会过拟合;如果选择较大的K值,模型可能会欠拟合。
  4. 对输入数据的表示方式敏感:KNN算法使用距离度量来计算样本间的相似性,因此对输入数据的表示方式非常敏感。如果特征之间的尺度差异较大或者特征选择不合适,可能会导致不准确的预测结果。

三、实现步骤

1.引入库

import collections
import numpy as np

2.读取数据集

这几组三维特征中[x,y,z],x表示球拍平衡点,y表示中杆莫氏硬度,z表示球拍中杆长度

    group = np.array([[305, 9, 225], [310, 8.8, 225], [295, 9, 215], [295, 8, 225], [300, 9, 255], [305, 8.7, 220], [290, 8.9, 215], [285, 9, 215], [300, 8.1, 220], [295, 8.3, 225]])
    labels = ['进攻拍', '进攻拍', '速度拍', '平衡拍', '进攻拍', '进攻拍','速度拍','速度拍','平衡拍','平衡拍']
    return group, labels

3.计算距离进行排序选取最小距离

def classify(inx, dataset, labels, k):
    # 计算距离  其实就是计算点一定之间的距离
    dist = np.sum((inx - dataset) ** 2, axis=1) ** 0.5
    # k个最近的标签
    # dist.argsort 将x中的元素从小到大排列,提取其对应的index(索引)
    k_labels = [labels[index] for index in dist.argsort()[0: k]]
    label = collections.Counter(k_labels).most_common(1)[0][0]
    return label

4.输入新的观测值,进行预测

if __name__ == '__main__':
    # 创建数据集
    group, labels = createDataSet()
    # 测试集
    test = [295, 9,215]
    test_class = classify(test, group, labels, 5)
    # 打印分类结果
    print('球拍类型:',test_class)

输出结果:(预测成功)

球拍类型: 速度拍

总结

由于数据集比较少代码比较简单,预测结果准确率可能不高容易出现过拟合(过拟合(Overfitting)是指机器学习模型在训练数据上表现得很好,但在新的未见过的数据上表现较差的情况。),只能通过下次慢慢改进

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值