简介
k近邻算法是数据分类一种常用的算法,属于监督学习算法的一类,它采用不同特征值之的距离进行分类。K近邻算法具有精度高、对异常值不敏感、无数据输入假定的优点,缺点是计算复杂度高、空间复杂度高。适用于数值型和标称型数据的计算分类。
K近邻算法的一般流程包括:
- 收集数据
- 准备数据:距离计算所需要的数值,最好是结构化的数据
- 分析数据
- 训练算法:根据训练样本得到
- 测试算法:计算错误率
- 使用算法
Case
已知四个点,及其对应的分类。我们需要根据已有数据,判别未知点的分类。首先导入数据。
from numpy import *
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
对未知点类别属性的判别执行以下的步骤
- 计算已知类别数据点和当前点之间的距离
- 按照距离递增排序
- 选取与当前点距离最小的k个点
- 确定前k个点所在类别的出现规律
- 返回前k个点出现频率最高的类别作为当前点的预测分类
下面是代码的具体实现
from numpy import *
import operator
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
def classfiy(inX, dataSet, labels, k):
# size of the dataSet array
dataSetSize = dataSet.shape[0]
<!--得到未知点和已知点的差值-->
diffMat = tile(inX, (dataSetSize, 1)) - dataSet
<!--差值平方-->
sqDiffMat = diffMat ** 2
<!--未知点和已知点距离的平方和-->
sqDistances = sqDiffMat.sum(axis=1)
<!--得到距离差数据-->
distances = sqDistances ** 0.5
<!--argsort得到index的sort,index可以关联labels的index-->
sortedDistanceIndicts = distances.argsort()
print
classCount = {}
for i in range(k):
voteIlabel = labels[sortedDistanceIndicts[i]]
classCount[voteIlabel] = classCount.get(voteIlabel, 0) + 1
sortedClassCount = sorted(classCount.iteritems(), key=operator.itemgetter(1), reverse=True)
return sortedClassCount
data_set = createDataSet()
result = classfiy([0, 0], data_set[0], data_set[1], 3)
<!--返回的结果是B-->
print result