直接放代码
import random
import numpy as np
#设置k=3
k=3
def readyData():
#准备一个训练数组
group=np.array([[78,89,88],
[43,23,53],
[87,69,99],
[88,79,69],
[54,33,44],
[77,99,82]])
#并给上对应的标签
labels=['好成绩','差成绩','好成绩','好成绩','差成绩','好成绩']
return group,labels
def Classify_KNN(test,dataSet,labels,k):
#训练数组有多少行,shape[0]得到DataSet的行数
row_num=dataSet.shape[0]
#先将test数据变成一个跟dataSet同样多行的数组,再与dataSet相减
xiangjian=np.tile(test,(row_num,1))-dataSet
#相减后平方
pingfang=xiangjian**2
'''
关于numpy.sum的用法
https://0x9.me/8BUsa
c = np.array([[0, 2, 1], [3, 5, 6], [0, 1, 1]])
print c.sum()
print c.sum(axis=0)
print c.sum(axis=1)
结果分别是:19, [3 8 8], [ 3 14 2]
axis=0, 表示列。
axis=1, 表示行。
'''
#平方相加
row_sum=pingfang.sum(axis=1)
#再开方
distances=row_sum**0.5
# argsort()将距离从小到大排序,并得到之前所在的index
sortDistance=distances.argsort()
# 定一个记录类别次数的字典
countClass={}
for i in range(k):
test_label=labels[sortDistance[i]]
countClass[test_label]=countClass.get(test_label,0)+1
sortCountClass=sorted(countClass,key=lambda x:[2],reverse=True)
return sortCountClass[0]
if __name__=='__main__':
group,labels=readyData()
testData=[]
for i in range(10):
Chinese=random.random()*100
Math=random.random()*100
English=random.random()*100
tem=[Chinese,Math,English]
testData.append(tem)
for test in testData:
print(test)
result=Classify_KNN(test,group,labels,k)
print(result)
参考资料:https://www.cnblogs.com/yyxf1413/p/6253995.html