KNN.py
#!/usr/bin/python
# -*- coding: utf-8 -*-
#coding=utf-8
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'] #元素个数等于group矩阵行数
return group, labels
#k-近邻算法
#inX是输入向量,dataSet是训练样本集,labels为标签向量, k是用于选择最近邻居的数目
def classify0(inX, dataSet, labels, k):
#计算已知类别数据集中的点与当前点之间的距离
dataSetSize = dataSet.shape[0] #获取矩阵第一维长度
diffMat = tile(inX, (dataSetSize, 1)) - dataSet #tile(A, b) 将数组A重复b次
sqDiffMat = diffMa**2
sqDistances = sqDiffMat.sum(axis=1) #axis=1是将一个矩阵的每一行向量相加
distances = sqDistances**0.5
#按照距离递增次序排序
sortedDistIndicies = distances.argsort()
#选取与当前点距离最小的k个点,确定前k个点所在类别的出现频率
classCount = {}
for i in range(k): # for(int i=0; i<l; i++)
voteIlabel = labels[sortedDistIndicies[i]]
classCount[voteIlabel] = classCount.get(voteIlabel, 0) + 1 #get(key,d) 如果key在字典中,返回对应的值,否则返回d
#返回前k个点出现频率最高的类别作为当前点的预测分类
#sorted(iterable, cmp=None, key=None, reverse=False)
#cmp:用于比较的函数,比较什么由key决定,有默认值,迭代集合中的一项;
#key:用列表元素的某个属性和函数进行作为关键字,有默认值,迭代集合中的一项;
#reverse:排序规则. reverse = True 降序;reverse = False,升序,有默认值。
sortedClassCount = sorted(classCount.iteritems, key=operator.itemgetter(1), reverse=true)
return sortedClassCount[0][0]
预测
在KNN.py中按F5,重新加载模块
>>> import KNN
>>> group, labels = KNN.createDataSet()
>>> KNN.classify0([0,0], group, labels, 3)
'B'
>>>