一. KNN 简介
1.KNN 算法也称为 K 邻近算法, 是数据挖掘分类技术之一. 所谓 K 最近邻, 就是 k 个最近的邻居的意思, 说的是每个样本都可以用它最接近的 k 个邻居来代表.
2.KNN 算法的核心思想是如果一个样本在特征空间中的 k 个最相邻的样本中的大多数属于某一个类别, 则该样本也属于这个类别, 并具有这个类别上样本的特性. 该方法在确定分类决策上只依据最邻近的一个或者几个样本的类别来决定待分样本所属的类别. KNN 算法在类别决策时, 只与极少量的相邻样本有关. 由于 KNN 算法主要靠周围有限的邻近的样本, 而不是靠判别类域的方法来确定所属类别的, 因此对于类域的交叉或重叠较多的待分样本集来说, KNN 方法较其他方法更为适合.
二. 代码实现
- # -*- coding: utf-8 -*-
- """
- 使用 python 程序模拟 KNN 算法
- Created on Sat Jun 22 18:38:22 2019
- @author: zhen
- """
- import numpy as np
- import collections as cs
- data = np.array([
- [203,1],[126,1],[89,1],[70,1],[196,2],[211,2],[221,2],[311,3],[271,3]
- ])
- feature = data[:,0] # 特征
- print(feature)
- label = data[:,-1] # 结果分类
- print(label)
- predictPoint = 200 # 预测数据
- print("预测输入特征为:" + str(predictPoint))
- distance = list(map(lambda x : abs(predictPoint - x), feature)) # 各点到预测点的距离
- print(distance)
- sortIndex = np.argsort(distance) # 排序, 返回排序后各数据的原始下标
- print(sortIndex)
- sortLabel = label[sortIndex] # 根据下标重新进行排序
- print(sortLabel)
- # k = 3 # 设置 k 值大小为 3
- for k in range(1,label.size+1):
- result = cs.Counter(sortLabel[0:k]).most_common(1)[0][0] # 根据 k 值计算前 k 个数据中出现次数最多的分类, 即为预测的分类
- print("当 k=" + str(k) + "时预测分类为:" + str(result))
三. 结果
- [203 126 89 70 196 211 221 311 271]
- [1 1 1 1 2 2 2 3 3]
预测输入特征为: 200
- [3, 74, 111, 130, 4, 11, 21, 111, 71]
- [0 4 5 6 8 1 2 7 3]
- [1 2 2 2 3 1 1 3 1]
当 k=1 时预测分类为: 1
当 k=2 时预测分类为: 1
当 k=3 时预测分类为: 2
当 k=4 时预测分类为: 2
当 k=5 时预测分类为: 2
当 k=6 时预测分类为: 2
当 k=7 时预测分类为: 1
当 k=8 时预测分类为: 1
当 k=9 时预测分类为: 1
四. 总结
1. 根据训练数据和结果可知, 当 k 较小时 [比如本次当 k=1] , 若训练数据存在异常数据时容易出现预测错误的情况, 因此一般 K 值都不能太小!
2. 当 k 值较大时, 某个分类的训练数据越多, 预测成此分类的可能性越大, 因此, 训练数据要先根据分类进行再平衡!
3. 一般 k 值的选择与分类数量有关, 分类数量越大, k 一般也越大, 一般为取值为: k~2k 之间!
来源: http://www.bubuko.com/infodetail-3100729.html