【概述】
K-近邻算法采用不同特征值之间的距离方法进行分类。
优点:精度高,对异常值不敏感,无数据输入假定;
缺点:计算复杂度高,空间复杂度高,数据量比较大时,耗时耗内存;无法给出数据的基础结构信息。
适用数据范围:数值型和标称型
【实现原理】
- 选择一种距离计算方式, 通过数据所有的特征计算新数据与已知类别数据集中的数据点的距离
- 按照距离递增次序进行排序,选取与当前距离最小的k(一般不超过20)个点
- 对于离散分类,返回k个点出现频率最多的类别作预测分类;对于回归则返回k个点的加权值作为预测值
【算法关键】
- 数据的所有特征都要做可比较的量化
- 需要计算distance的函数
- 确定K值
【实现步骤】
收集数据;
准备数据:距离计算所需要的数值,最好是结构化的数据格式(可能需要归一化数据)
分析数据:可利用数据可视化方法找出variable之间的关系
测试算法:计算错误率(构建分类器)
使用方法:首选需要输入样本数据和结构化的输出结果,然后运行K-紧邻算法判定输入数据分别属于哪个分类,最后应用对计算出的分了你执行后续的处理(实例化分类器)
【算法实例】
建立kNN.py文件如下:
from numpy import *
import operator
from os import listdir
def classify0(inX, dataSet, labels, k):
dataSetSize = dataSet.shape[0]
diffMat = tile(inX, (dataSetSize,1)) - dataSet
sqDiffMat = diffMat**2
sqDistances = sqDiffMat.sum(axis=1)
distances = sqDistances**0.5
sortedDistIndicies = distances.argsort()
classCount={}
for i in range(k):
voteIlabel = labels[sortedDistIndicies[i]]
classCount[voteIlabel] = classCount.get(voteIlabel,0) + 1
sortedClassCount = sorted(classCount.iteritems(), key=operator.itemgetter(1), reverse=True)
return sortedClassCount[0][0]
def createDataSet():
group = array([[1.0,1.1],[1.0,1.0],[0,0],[0,0.1]])
labels = ['A','A','B','B']
return group, labels
运行:
kNN.classify0([0,0],group,labels,3)
结果 :‘B’