# -*- coding: utf-8 -*- """ Created on Wed Mar 7 09:17:17 2018 @author: admin """ ####################################################### #kNN cluster #author:niucas #date:2-18-03-07 #homePage:http://www.cnblogs.com/PiPifamily/ #email:[email protected] #命名规则采用驼峰命名 ####################################################### #导入对应的包 import numpy as np import matplotlib.pyplot as plt import pandas as pd import operator ############ #准备数据 ############ def creatDataSet(): ‘‘‘ 函数的作用是创建一个训练数据集,并且对应各个数据的label(标签) ‘‘‘ testData = np.array([ [1.0,1.1], [1.0,1.1], [0.,0.], [0.,0.1] ]) testLabel = [‘A‘,‘A‘,‘B‘,‘B‘] return testData,testLabel def classify(inData,dataSet,labels,k): ‘‘‘ 此函数是用来进行分类; 参数定义如下: inData:输入数据 dataSet:训练数据集 labels:训练数据对应的labels k:选取的K值 ‘‘‘ dataSetSize = dataSet.shape[0] #第一步计算欧式距离 diff = np.tile(inData,(dataSetSize,1)) - dataSet #训练数据集每个对象与测试数据的差值 distance = ((diff**2).sum(axis=1)) ** 0.5#求差值的平方和 ############# #开始进行投票 ############# sortedDistIndex = np.argsort(distance) #将欧式距离进行升序排列,结果对用的是索引号 #存放最终结果的字典,初始化 classCount = {} #投票就是计算前K个值中,概率的最大的类,哪个labels值最大 for i in range(k): voteLabel = labels[sortedDistIndex[i]] classCount[voteLabel] = classCount.get(voteLabel,0) + 1 #将classCount中的分类结果进行排序,返回得票数最高的label sortedClassCount = sorted(classCount.items(),key=operator.itemgetter(1), reverse = True)#降序排列,默认是升序排列 # class = max(classCount.items(),Key = lambda x : x[1])[0] return sortedClassCount[0][0] if __name__ == "__main__": #导入数据 dataSet,labels = creatDataSet() inData = [0.1,0.1] #简单分类 className = classify(inData,dataSet,labels,3) print(‘the class of test sample is %s‘ %className)