K近邻算法知识背景:K-近邻法(K-nearest neighbor, K-NN)是1967年由Cover T和Hart P提出的一种基本分类与回归方法(百度的)。它的工作原理是:存在一个样本数据集合,也称作为训练样本集,并且样本集中每个数据都存在标签,即我们知道样本集中每一个数据与所属分类的对应关系。输入没有标签的新数据后,将新的数据的每个特征与样本集中数据对应的特征进行比较,然后算法提取样本最相似数据(最近邻)的分类标签。也就是在一个训练集中带有标签的样本数据,然后输入一个新数据,根据一个K值(后面会写到)范围内的最多数据样本来判断这个新数据的标签。
K近邻算法的算法步骤(在已经给了训练集的情况下):1.计算新数据点与各个训练集的距离,一般是以欧氏距离为标准。2.按照距离递增进行排序。3.输入一个K值,然后根据这个K值取前K个点(按照距离递增排序的点)。4.按照前K个点频率最高的标签定义为新数据的标签。
欧氏距离计算公式:
算法实现:NBA每年的选秀大会都是热点,各个球队也会根据新秀身高体重给出位置定位(大概就是适合在球队中打什么位置)。
而我可以将在集美大学篮球校队的部分球员的定位及身高体重数据作为训练集,而集美大学新生作为一个新的数据点去代入这个训练集,去寻找较为接近的位置。
代码实现:
from numpy import *
import operator
def UserDataInt():
#输入集美大学球员身高体重位置数据作为训练集
group = array([[175,65],[177,72],[189,88],[190,90],[183,80],[188,82]])
labels = ['后卫','后卫','中锋','中锋','前锋','前锋']
return group,labels
def Knn(inX, dataSet, labels, k):
dataSetSize = dataSet.shape[0]
diffMat = tile(inX, (dataSetSize, 1)) - dataSet
sqDiffMat = diffMat**2
sqDistances = sqDiffMat.sum(axis=1)
distances = sqDistances**0.5
sortedDistIndices = distances.argsort()
classCount = {}
for i in range(k):
#对前K个球员进行排序
voteIlabel = labels[sortedDistIndices[i]]
classCount[voteIlabel] = classCount.get(voteIlabel,0) + 1
sortedClassCount = sorted(classCount.items(),key=operator.itemgetter(1),reverse=True)
return sortedClassCount[0][0]
i = 0
print("\n新球员数据")
NewdataInt = array([[183,80],[170,66],[190,90]])
Newdatabestclass = []
for i in range(3):
Newdatabestclass.append(Knn(NewdataInt[i], group, labels, 3))
#默认K值为3
print('新球员%d:身高%3dm 体重%3dkg 位置理论上更适合是: %s'%(i+1,myTests[i][0],myTests[i][1],Newdatabestclass[i]))