主要是参考机器学习实践(作者peter harrington)
优点:精度高,对异常值不敏感,无数据输入假定。
缺点:计算复杂度、空间复杂度高
适用数据:数值型和标称型
个人理解:数据型是连续数据,标称型离散数据。
KNN基本原理
写了一段时间了,没人看就没更新以后的。有兴趣或者没基础可以看看。
KNN的步骤
1、导入数据
import numpy as np
import operator
data =np.array([[1.0,1.1],[1.0,1.0],[0,0],[0,0.1]])
labels =['A','A','B','B']
其中data是传统意义上的x,是二维的,labels是y。
把x画出来观察,很明显,2个A标签和2个B标签差距很大。
2、knn原理
写的应该很清楚啦!
'''
1.计算已经知道属性的数据集中的点与当前点之间的距离;
2.按照距离递增次序排序;
3.选取与当前距离最小的k个点;
4.确定前k个点所在类别的出现频率;
5.返回前k个点出现频率最高的类别作为当前点的预测分类。
'''
def Knn(inX,dataSet,labels,k):
'''
四个参数inX是分类的输入向量,dataSet是输入的训练样本集,标签向量是labels,k是选择的最近的邻居个数
'''
dataSetSize = dataSet.shape[0]
'''
得到样本集中样本的数量
'''
diffMat = np.tile(inX,(dataSetSize,1))-dataSet
'''
tile共有2个参数,第一个指待输入数组
比如tile([1,2,3],(3,2))
就会输出:[[1,2,3,1,2,3,1,2,3]
[1,2,3,1,2,3,1,2,3]]
第二个就是数组重复次数,第一个参数是重复次数,第二个参数是重复几个数组
'''
x_square = diffMat ** 2
distances_square = x_square.sum(axis = 1)
'''
如果axis就是普通相加,axis=0
如果axiss=1那么比如矩阵为[[1,2,3],[4,5,6]]
经过sum(axis=1)就会变成[6,16]
'''
distances = distances_square ** 0.5
'''
很明显的欧拉距离计算
'''
sorted_dostances = distances.argsort()
'''
升序排序
'''
Count = {
}
'''
收集最近的点的计数,是个字典
'''
for i in range(k):
voteIlabel = labels[sorted_dostances[i]]
Count[voteIlabel] = Count.get(voteIlabel,0) + 1
'''
dict.get(name,0)就是查询字典里是否有name这个值,没有就返回0
'''
'''
选择最小的k个点
'''
sortedCount = sorted(Count.items(),key = operator.itemgetter(1),
reverse = True)
'''
sorted(iterable, key = None, reverse = False)
iterable是可迭代对象
key是主要是用来进行比较的元素,只有一个参
数,具体的函数的参数就是取自于可迭代对象
中,指定可迭代对象中的一个元素来进行排序。
reverse是排序规则,reverse = True 降序,
reverse = False 升序(默认)。
iteritems()是把字典改成迭代器
operator.itemgetter(1)是获取对象的第1个域的值
'''