提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
一、项目背景
最近刚学knn近邻算法,通过借鉴电影分类项目来实现一个羽毛球拍类型判断来加深一下对knn算法理解
二、KNN算法
k近邻算法用一句通俗的古语来说就是:“物以类聚,人以群分”。
k近邻法三要素:距离度量、k值的选择和分类决策规则。
欧式距离计算公式如下
k值选择
K 的取值很重要,通过交叉验证来判断k值好坏(将样本数据按照一定比例,拆分出训练用的数据和验证用的数据,比如6:4拆分出部分训练数据和验证数据),从选取一个较小的 K 值开始,不断增加 K 的值,然后计算验证集合的方差,最终找到一个比较合适的 K 值。
knn算法优缺点
优点:
-
简单易懂:KNN算法非常直观和易于理解,它使用了一种基本的度量来计算样本之间的距离,并根据最近邻居的投票结果进行分类或回归。
- 无需训练过程:KNN算法是一种基于实例的学习方法,不需要在训练阶段建立模型,因此训练过程非常简单。
-
对异常值不敏感:由于KNN算法使用了最近邻居的投票结果,它对数据中的异常值不敏感。这是因为少数异常值对多数邻居的投票结果影响较小。
- 适用于多分类问题:KNN算法可以应用于多分类问题,通过选择合适的K值和投票机制,可以在多个类别中进行决策。
缺点:
- 需要大量的存储空间:KNN算法需要存储整个训练数据集,以便在预测阶段进行比较和计算。对于大规模数据集来说,存储和计算的成本会很高。
- 计算复杂度高:在预测阶段,KNN算法需要计算新样本与所有训练样本之间的距离,这个过程是计算密集型的,特别是对于大规模数据集来说。
- 效果受参数K的影响:KNN算法中的K值决定了最近邻居的数量。选择合适的K值很重要,如果选择较小的K值,模型可能会过拟合;如果选择较大的K值,模型可能会欠拟合。
-
对输入数据的表示方式敏感: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)是指机器学习模型在训练数据上表现得很好,但在新的未见过的数据上表现较差的情况。),只能通过下次慢慢改进