kNN原理:
通俗理解:采用测量与不同特征值之间的距离的方法进行分类。
具体描述:存在一个样本数据集合,也称作训练样本集,并且样本集中都存在标签,即我们知道样本集中的每一数据与所属分类的对应关系。输入没有标签的新数据后,将新数据的每个特征与样本集中数据对应的特征进行比较,然后算法提取样本集中特征最相似数据(最近邻)的分类标签。一般来说,我们只选择样本数据集中前K个最相似的数据,这就是K-近邻算法中K的出处。通常k是不大于20的整数。最后,选择k个最相似数据中出现次数最多的分类,作为新数据的分类。
优缺点:
优点:精度高、对异常值不敏感、无数据输入假定
缺点:计算复杂度高、空间复杂度高。
使用数据范围:
数值型和标称型
kNN.py代码解析:
from numpy import * #科学计算包Numpy
import operator # 运算符模块
def createDataSet(): #定义函数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 classify0(inX,dataSet,labels,k):
#定义函数classify0(),包含是四个参数,第一个向量是需要用算法分类的,第二个是训练样本集,第三个是标签向量,最后一个是选择最近邻居的数目
#距离计算,采用欧式距离公式
dataSetSize = dataSet.shape[0]
'''
shape是numpy函数库中的方法,用于查看矩阵或者数组的维素
shape(array) 若矩阵有m行n列,则返回(m,n)
array.shape[0] 返回矩阵的行数m,参数为1的话返回列数n
'''
diffMat = tile(inX,(dataSetSize,1)) - dataSet
'''tile是numpy函数库中的方法,用法如下:
tile(A,(m,n)) 将数组A作为元素构造出m行n列的数组
'''
sqDiffMat = diffMat**2
sqDistances = sqDiffMat.sum(axis=1)
'''array.sum(axis=1)按行累加,axis=0为按列累加
'''
distances = sqDistances**0.5 #开方
sortedDistances = distances.argsort()
'''argsort()是numpy中的方法,得到矩阵中每个元素的排序序号
A=array.argsort() A[0]表示排序后 排在第一个的那个数在原来数组中的下标
'''
classCount = {}
for i in range(k):#选择距离最小的k个点
voteIlabel = labels[sortedDistances[i]]
classCount[voteIlabel] = classCount.get(voteIlabel,0)+1
'''python中字典的方法,get(key,x)从字典中获取key对应的value,字典中没有key的话返回0
'''
#排序,此处应为classCount.items(),而不是iteritems()
sortedClassCount = sorted(classCount.items(),key=operator.itemgetter(1),reverse=True)
#sorted(),python中的方法
'''numpy中有min()、max()方法,用法如下
array.min(0) 返回一个数组,数组中每个数都是它所在列的所有数的最小值
array.min(1) 返回一个数组,数组中每个数都是它所在行的所有数的最小值
listdir('str'),python的operator中的方法
strlist=listdir('str') 读取目录str下的所有文件名,返回一个字符串列表
split(),python中的方法,切片函数
string.split('str')以字符str为分隔符切片,返回list
'''
return sortedClassCount[0][0]
在控制台输入import kNN
group,labels=kNN.createDataSet()
kNN.classify0([0,0],group,;labels,3)
输出结果为B。