很简单的一个分类算法:
根据不同特征值之间的距离方法进行分类
优点:输入高,对异常值不敏感,无数据输入假定
缺点:计算复杂度高,空间复杂度高
适用数据范围:数值型 和 标称型
代码实现:
"""K近邻算法"""
"""伪代码:
(1)计算已知数据集的点与当前点之间的欧式距离
(2)按照距离递增顺序进行排序
(3)选取与当前距离最小的K个点
(4)确定前K个点所属类别的出现频率
(5)返回前k个点出现频率最高的类别作为当前点的预测分类
"""
import numpy as np
import operator
"""创建数据集"""
def creatDataset():
group = np.array([[1.0,1.1],[1.0,1.0],[0,0],[0,0.1]])
label = ['A','A','B','B']
return group,label
def classfy0(inX,dataset,labels,k):
"""
input:
inX——当前点
dataset——数据集
label——标签
k——前K个点
"""
diffMat = np.tile(inX,(len(dataset),1)) - dataset
sqDiffMat = diffMat ** 2
sumSqDiffMat = sqDiffMat.sum(axis=1)
distance = sumSqDiffMat ** 0.5 #数据集的点与当前点之间的欧式距离
sortDistance = distance.argsort()#按照距离递增顺序进行从小到大排序(输出为排序的索引)
classcount = {}
for i in range(k):
votellabel = labels[sortDistance[i]]
classcount[votellabel] = classcount.get(votellabel,0) + 1
sortclasscount = sorted(classcount.items(),key=operator.itemgetter(1),reverse=True)
return sortclasscount[0][0]
if __name__ == '__main__':
dataset,labels = creatDataset()
res = classfy0([0,0],dataset,labels,3)
print(res)
输出结果:B
Process finished with exit code 0