import numpy as np
import operator
import matplotlib.pyplot as plt
def createDataSet():
group = np.array([[1.0,1.1],[1.0,1.0],[0,0],[0,0.1]])
labels = ['A','A','B','B']
return group, labels
group,labels = createDataSet()
def draw(xs,ys):
figg = plt.scatter(xs,ys)
print(figg)
print(draw(group[:,0],group[:,1]))
#数组中的[:,0]指取数组的所有行,每一行的第0个数据,[:,1]即第1个数据
#相应的[:,0:2]为所有行,每一行的第0个到第2个数据
def classify0(inX, dataSet, labels, k):
dataSetSize = dataSet.shape[0]
#shape[]显示矩阵的行列数,shape[0]返回行数,shape[1]返回列数;
diffMat = np.tile(inX, (dataSetSize,1)) - dataSet
#比如tile(A,n),功能是将数组A在该行重复n次,构成一个新的数组;
#tile(A,[m,n]),则是将数组A在该行重复n次,并重复数组A共m次
sqDiffMat = diffMat**2
sqDistances = sqDiffMat.sum(axis=1) #axis=0代表列,axis=1代表行
distances = sqDistances**0.5
sortedDistIndicies = distances.argsort() #argsort从小到大排序,argsort()
classCount={}
for i in range(k):
voteIlabel = labels[sortedDistIndicies[i]]
#取出前k个距离对应的标签
classCount[voteIlabel] = classCount.get(voteIlabel,0) + 1
#计算每个类别的样本数。字典get()函数返回指定键的值,如果值不在字典中返回默认值0
#get(key,default=None),就是造字典;
sortedClassCount = sorted(classCount.items(), key=operator.itemgetter(1), reverse=True)
#reverse=Ture 表示降序;
#operator.itemgetter函数获取的不是某个值,而是定义一个函数,通过该函数作用到对象才取值;
#如a=[1,2,3],b=operator.itemgetter(1,0),获取对象的第一个和第零个域的值;
#b(a)=(2,1)
#这里的key指需要进行排序的值(列表中的值)
return sortedClassCount[0][0]#返回第0位的值,即计数最多的值
group,labels = createDataSet()
print(classify0([0,0],group,labels,3))