knn基本原理学习理解
from numpy import *
import operator
from os import listdir
# knn分类函数
def classify0(inX, dataSet, labels, k):
# inX-输入向量
# dataset-训练数据
# labels-标签向量
# k-表示选择最近邻居的数目
dataSetSize = dataSet.shape[0] # 看有多少个数据
print("dataSetSize", dataSetSize)
diffMat = tile(inX, (dataSetSize, 1)) - dataSet # 把数据inX行重复dataSetSize次,列重复1次形成新列表,再减去训练数据
# 得到的是差值---和训练数据同样大小的差值
print(diffMat)
# 计算欧式距离-两个向量点之间
sqDiffMat = diffMat ** 2
sqDistances = sqDiffMat.sum(axis=1)
distances = sqDistances ** 0.5
print("distances1", distances)
sortedDistIndicies = distances.argsort() # 将数据降序排列--从小到大,提取的是各个数据的索引--不改变其原有排序
#print("distances2", distances)
print("sortedDistIndicies", sortedDistIndicies) # 从小到大排列的标签
classCount = {}
for i in range(k):
voteIlabel = labels[sortedDistIndicies[i]] # 获取最近邻的标签
classCount[voteIlabel] = classCount.get(voteIlabel, 0) + 1 # get函数为在classCount中找voteIlabel,有的话返回其值,没有返回0
print("classcount", classCount)
sortedClassCount = sorted(classCount.items(), key=operator.itemgetter(1), reverse=True) # 将字典数据变为内含元组的列表
print("sortedClassCount", sortedClassCount, type(sortedClassCount[1]))
return sortedClassCount[0][0]
# 创建数据集,包括数据和标签
def createDataSet():
group = array([[1.0, 1.1], [1.0, 1.0], [0, 0], [0, 0.1]])
labels = ['A', 'A', 'B', 'B']
return group, labels
# 1.knn基本算法测试
# 创建训练数据集
group, labels = createDataSet()
# 输入实验数据[0, 0],对其进行分类
res = classify0([0, 0], group, labels, 3)
print(res)