K-近邻算法(KNN),它是非常有效且易于掌握的算法。简单地说,k-近邻算法采用测量不同特征值之间的距离方法进行分类。
优点:精度高、对异常值不敏感、无数据输入假定。
缺点:计算复杂度高、空间复杂度高,分类时间复杂度是O(n)。
适用数据范围:数值型和标称型。
对于未知类别属性数据集中的点:
1、计算已知类别数据集中的点与当前点的距离
2、按照距离依次排序
3、选取与当前点距离最小的k个点
4、确定前k个点所在类别出现的概率
5、返回前k个点出现频率最高的类别作为当前点的预测分类
在样本不平衡时,可以通过设置权重进行控制。
一个简单的demo:
#-*- coding: utf-8 -*
import numpy as np
import operator
def createDataSet(): # 创建数据集
group = np.array([[1.0,1.1],[1.0,1.0],[0.0,0.0],[0,0.1]])
labels = ['A','A','B','B']
return group,labels # group和labels的值
def classify0(inX,dataSet,labels,k): # inX待分类的点 , dataSet数据集 , labels类别标签 , k跟几个进行比对
dataSetSize = dataSet.shape[0] # shape维度 , shape[0]代表矩阵有多少行,表示dataSet有多少样本
diffMat = np.tile(inX, (dataSetSize,1)) - dataSet # 计算距离 ,tile复制样本inX , 和数据集里面的值相减 ,返回的值为一个矩阵
sqDiffMat = diffMat ** 2 # 求平方值
sqDistances = sqDiffMat.sum(axis = 1) # 每一行记录的值求和
distance = sqDistances **0.5 # 开方,是与所有点距离的值,代表一个矩阵
sortedDistIndicies = distance.argsort() # 对distance进行一个排序
classCount = {}
for i in range(k): # 对k个样本遍历
voteLabel = labels[sortedDistIndicies[i]] # 当前最近那个点
classCount[voteLabel] = classCount.get(voteLabel,0) + 1 # 计算有多少个,classCount是一个字典
sortedClassCount = sorted(classCount.iteritems(),key=operator.itemgetter(1),reverse=True) # 排序 (reverse=True 倒序)
return sortedClassCount[0][0] # sortedClassCount[排在第一的那个点][是A还是B]
if __name__ == '__main__':
group,labels = createDataSet()
test = classify0([3,3],group,labels,3)
print test
这个是判断某一个点更接近于A还是B。