kNN 近邻算法原理:存在一个样本数据集合,也称作训练样本集,并且样本集中每个数据都存在标签,即我们知道样本集中每一数据与所属分类的队友关系。输入没有标签的新数据后,将新数据的每个特征与样本集中的数据对应的进行比较,然后算法提取样本集中特征最相似数据(最邻近)的分类标签。
算法流程:
1.收集数据
2. 准备数据
3.分析数据
4. 训练算法
5. 测试数据
6. 使用算法
# -*- coding: utf-8 -*-
'''
Created on Mar 15, 2016
@author: fky
k-近邻算法
'''
from numpy import array
import operator
from numpy.lib.shape_base import tile
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 classify(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): # 距离最小的k个点
voteIlabel = labels[sortedDistIndicies[i]]
classCount[voteIlabel] = classCount.get(voteIlabel,0) + 1
sortedClassCount = sorted(classCount.items(),key=operator.itemgetter(1),reverse=True) # 排序
return sortedClassCount[0][0]
if __name__=='__main__':
group, labels = createDataSet()
print(classify([1,1], group, labels, 3))
输出结果:
A
-----------------------------
diffMat = tile(inX,(dataSetSize,1)) -dataSet # 算距离
sqDiffMat = diffMat**2
sqDistances = sqDiffMat.sum(axis=1) #
distances = sqDistances**0.5
以上面输入数据为例中间的输出:
diffMat = [[ 0. -0.1]
[ 0. 0. ]
[ 1. 1. ]
[ 1. 0.9]]
sqDistances = [ 0.01 0. 2. 1.81]
sortedClassCount=[('A', 2), ('B', 1)]
这可以看到近邻的A中是两个大于B 中的一个 所以输出 A
参考《机器学习实战》这本书