KNN 算法是机器学习中入门级算法, 属于监督性学习算法. SupervisedLearning.
通过 Plinko 游戏来介绍该算法.
就是随机在上面投球, 然后球进下面的哪个地方就得多少分.
然后在规定得投次数得到最高得分数, 应该怎么投?
然后预测每次投能得到多少分?
首先应该通过训练数据集, 看看在每个位置投得点, 能得到多少分, 然后预测点距离每次点得距离, 然后排序, 那么预测点周围出现次数最多得就是大概率得到得分数.
1, 通过训练得数据集, 提取特征值和标签, 特征值就是距离左侧得距离. 标签就是投下去得到得分数.
2, 选择预测点, 和 K 个距离近得数. 计算每个点得距离.
3. 排序, 前 K 个点得出现最多次标签得就是得分得大概率值.
- #KNN 算法是寻找 K 个距离最近的邻居, 然后根据已知的邻居 label, 出现次数最多的, 推断出测试点的类别.
- # polinko 模拟
- import numpy as np
- import collections as c
- def KNN(k,predictPoint,feature,label):
- # 先求出预测点与周围点的距离, 然后排序, 找出距离最近的 k 个点, 出现最多的次数, 就是预测结果.
- # map 内置函数 (func,iterable)
- distance = list(map(lambda x: abs(200 - x), feature))
- # np.sort() 是直接排序, 而我们需要 feature 和 labell 联系一起
- # print(np.sort(distance))
- # 所以应该使用 np.argsort() 可以得到排序的后的 index, 可以与 label 关联
- sort_index = np.argsort(distance)
- # 通过切片找出 K 个最邻近的点
- return c.Counter(label[sort_index][:k]).most_common(1)[0][0] # 返回的是 (4,2), 表示在 k 的最邻近元素, 4 出现最多次数为 2
- if __name__ == '__main__':
- data = np.array([
- [120, 3],
- [140, 3],
- [160, 3],
- [40, 2],
- [70, 2],
- [200, 4],
- [250, 4],
- [100, 3]
- ])
- feature = data[:,0]
- label = data[:,-1]
- k = 5
- predictPoint = 170
- print(KNN(k,predictPoint,feature,label))
预测结果:
3
缺点: 对于数据量很大得训练集合, 耗费内存. 对硬件要求较高.
来源: http://www.bubuko.com/infodetail-3096098.html