一些自己的见解,记录下方便日后复习
# encoding:utf-8
from numpy import *
import operator
def createDataSet():
# 生成二维矩阵,每行表示一个样本
group = array([[1.0, 0.9], [1.0, 1.0], [0.1, 0.2], [0.0, 0.1]])
# 划分四个样本所属的类别
labels = ['A','A','B','B']
return group,labels
# KNN分类算法函数定义
def KNNClassify(newinput,dataSet,labels,k):
# 求dataSet的行数
numSamples = dataSet.shape[0]
## 使得输入的newinput变成和dataSet行数一样的数组,方便求newinput到dataSet中每一个点的距离
# 距离等于 = ((x1-x2)**2 + (y1-y2)**2)**0.5
# tile([0,0],(2,3))#在行方向重复[0,0] 2次,在在列方向上重复[0,0]3次
diff = tile(newinput,(numSamples,1))-dataSet
squaredDiff = diff**2
# 按行累加
# axis=0,列表中,每一个列表对应的列相加
# axis=1,列表中,每一个列表对应的行相加
squaredDist = squaredDiff.sum(axis=1)
distance = squaredDist**0.5
#对距离排序
#argsort() 将所有值从小到大排序,取原先的索引
sortedDistlndices = argsort(distance)
classCount = {}
for i in range(k):
'''sortedDistlndices是索引值(所有值从小到大排序的索引值,这里只取前三,也就是选三个点的距离),算出每个索引值对应的labels
中的值,为A或者B,在classCount中添加A,B的值。并用get()方法累加次数'''
voteLabel = labels[sortedDistlndices[i]]
classCount[voteLabel] = classCount.get(voteLabel,0) + 1
# 第一种方法
# 这里主要是选出A,B中对应的value谁更大,返回value对应的key(A或者B)这个值
maxCount = 0
for key,value in classCount.items():
if value >maxCount:
maxCount = value
maxlndex = key
return maxlndex
# # 第二种方法a
# sortedmp = sorted(classCount.items(), key=operator.itemgetter(1),reverse=True)
# # 将出现次数较多的情况返回
# return sortedmp[0][0]
def main():
group,labels = createDataSet()
var1 = KNNClassify([1.2,1.0],group,labels,3)
var2 = KNNClassify([0.2,0.3],group,labels,3)
print(var1)
print(var2)
main()