K近邻算法
kNN算法的原理:
存在一个样本数据集合,且每个样本数据都有对应的标签,即我们知道样本集合中每一数据与所属分类的对应关系。
输入没有标签的新数据后,将新数据的每个特征与样本集合中数据对应的特征进行比较,然后提取样本中最相似的K个分类标签。
最后,选择K个最相似数据中出现次数最多的分类,作为新数据的分类。
# 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和labels是四组数据,group表示坐标,labels表示坐标对应的特征值
return group,labels
#classify0是k近邻算法,计算用于分类的inX到dataSet的距离,判断inX属于哪个类。dataSet是训练样本数据集,labels是样本对应的标签值,k表示选取样本前k个最相似的数据用于判断inX属于哪个分类。
def classify0(inX, dataSet, labels, k):
dataSetSize = dataSet.shape[0] #获得dataSet的大小
diffMat = tile(inX,(dataSetSize, 1)) - dataSet #将inX扩充为(dataSetSize,1)即4行1列的矩阵,再与dataSet求差
sqDiffMat = diffMat**2
sqDistances = sqDiffMat.sum(axis=1) #.sum()运行加函数,参数axis=1表示矩阵每一行的各个值相加和
distances = sqDistances**0.5
sortedDistIndices = distances.argsort()
classCount = {}
for i in range(k):
voteIlabel = labels[sortedDistIndices[i]]
classCount[voteIlabel] = classCount.get(voteIlabel,0) + 1
sortedClassCount = sorted(classCount.iteritems(),key=operator.itemgetter(1),reverse=True)
return sortedClassCount[0][0]
1.createDataSet用于创建训练样本数据集,本例中创建了四个样本数据,分别为[1.0,1.1],[1.0,1.0],[0,0],[0,0.1],对应的分类(或称为特征值)分别为A,A,B,B
2.classify0函数是分类算法,输入的四个参数分别为(待分类的数据,样本数据,样本标签,相似样本标签的个数)
首先,根据欧式距离公式求得待分类的数据到每个样本数据的距离distances
dataSetSize:获得dataSet的大小,为4
diffMat:将inX扩充为(dataSetSize,1)(即4行1列)的矩阵,再与dataSet求差值
然后,argsort函数表示从小到大排序,返回索引0,1,2,3,距离最近---距离最远
3.对距离最近的k个样本,进行分类分析
首先,获得距离最近的k个样本数据对应的样本标签
classCount表示每个样本标签以及出现次数的字典
然后,使用sorted函数排序,返回出现次数最多的标签
[0,0]属于B类