k-近邻算法,简单地说,k-近邻算法采用测量不同特征值之间的距离方法进行分类
K近邻算法特征 | 详细 |
---|---|
优点 | 精度高、对异常值不敏感、无数据输入假定 |
缺点 | 计算复杂度高、空间复杂度高 |
适用数据范围 | 数值型和标称型 |
k-近邻算法的一般流程:
- 收集数据:可以使用任何方法
- 准备数据:距离计算所需要的数值,最好是结构化的数据格式
- 分析数据:可以使用任何方法
- 训练数据:此步骤不适合k-近邻算法
- 测试算法:计算错误率
- 使用算法:首先需要输入样本数据和结构化的输出结果,然后运行k-近邻算法判定输入数据分别属于哪个分类,最后应用对计算出的分类执行后续的处理。
实施kNN分类算法伪代码如下:
对未知类别属性的数据集中的每个点依次执行以下操作:
- 计算已知类别数据集中的点与当前点之间的距离
- 按照距离递增次序排序
- 选取与当前点距离最小的k个点
- 确定前k个点所在类别的出现频率
- 返回前k个点出现频率最高的类别作为当前点的预测分类
以下代码在python3.6中测试,安装了anocoda
from numpy import *
import operator
def classify0(inX, dataSet, labels, k):
"""
k-近邻算法实现
:param inX:特征值
:param dataSet:数据集
:param labels:标注的分类结果
:param k:求前k个
:return:前k个距离最近的选项中,返回出现频率最大的项
"""
# 返回数据集中行的大小
dataSetSize = dataSet.shape[0]
#将输入参数inX扩展到与数据集行的大小一致的矩阵,然后每项做差
diffMat = tile(inX, (dataSetSize, 1)) - dataSet
#求差值后的矩阵每项乘方
sqDiffMat = diffMat**2
#以行为单位,求和
sqDistances = sqDiffMat.sum(axis=1)
#开方,计算距离
distances = sqDistances**0.5
#按从小到大次序排序,保存对应的下标值
sortedDistances = distances.argsort()
classCount = {}
for i in range(k):
voteIlabel = labels[sortedDistances[i]] #取得在前k个距离下的对应取值
classCount[voteIlabel] = classCount.get(voteIlabel,0) + 1 #计算当前取值voteIlabel的个数,get()如果获取不到,默认为0
# 在python2.x版本中使用iteritems,operator.itemgetter(1)是以第二个项进行排序,这里是逆序
sortedClassCount = sorted(classCount.items(),
key = operator.itemgetter(1),reverse = True)
#最后返回第一项的第一个属性值 sortedClassCount {'A':3,'B':1}
return sortedClassCount[0][0]