首页 > 技术文章 > 【机器学习】【kNN】

SuperiorLQF 2021-02-12 13:01 原文

 1 from numpy import *
 2 import operator 
 3 #需要用到的两个模块
 4 dataSet=array([[1,2,3],[4,5,6],[7,8,9],[10,11,12],[13,14,15],[16,17,18]])#自定义了一个6*3的训练集
 5 labels=['A','B','B','A','B','B']#训练集的标签,6个
 6 inX=array([6,9,17])#输入向量,需要和训练集中的特征个数(3)一致
 7 k=3#取最近的3个点作判断
 8 #start
 9 dataSetSize=dataSet.shape[0]#求取训练集的行数
10 diffMat=tile(inX,(dataSetSize,1))-dataSet#铺砖按行延拓输入向量,求差矩阵
11 sqDiffMat=diffMat**2#求出差矩阵的平方
12 sqDistances=sqDiffMat.sum(axis=1)#平方项按列相加
13 distances=sqDistances**0.5#求方根,算出距离
14 sortedDistIndicies=distances.argsort()#按照距离大小从小到大进行排序,返回其下标所组成的的序列
15 classCount={}#创建字典
16 for i in range(k):
17     voteIlabel=labels[sortedDistIndicies[i]]
18     classCount[voteIlabel]=classCount.get(voteIlabel,0)+1#在字典中按键值对进行计数
19 sortedClassCount=sorted(classCount.items(),key=operator.itemgetter(1),reverse=True)#对字典中的键按值从大到小排序。
20 print(dataSet)
21 print(diffMat)
22 print(distances)
23 print(sortedDistIndicies)
24 print(classCount)
25 print(sortedClassCount)#打印上述中间结果

结果如下

dataSet=
[[ 1 2 3] [ 4 5 6] [ 7 8 9] [10 11 12] [13 14 15] [16 17 18]]

diffMat= [[
5 7 14] [ 2 4 11] [ -1 1 8] [ -4 -2 5] [ -7 -5 2] [-10 -8 -1]]
distances= [
16.43167673 11.87434209 8.1240384 6.70820393 8.83176087 12.84523258]
sortedDistIndicies= [
3 2 4 1 5 0]
classCount= {
'A': 1, 'B': 2}
sortedClassCount= [(
'B', 2), ('A', 1)]

 

推荐阅读