knn(k邻近算法)
程序员文章站
2024-01-25 22:03:16
...
这几天学习了knn还有k-means,身为学渣,上课听的一头雾水,课下赶紧找网课看了一下,并学习了一些代码 代码是收集一些博客的
两个knn都是关于电影分类的
感谢大牛:
1.https://blog.csdn.net/sinat_30353259/article/details/80901746
2. 抱歉第二个博客地址找不到了
代码一
import math
movie_data={"宝贝当家": [45, 2, 9, "喜剧片"],
"美人鱼": [21, 17, 5, "喜剧片"],
"澳门风云3": [54, 9, 11, "喜剧片"],
"功夫熊猫3": [39, 0, 31, "喜剧片"],
"谍影重重": [5, 2, 57, "动作片"],
"叶问3": [3, 2, 65, "动作片"],
"伦敦陷落": [2, 3, 55, "动作片"],
"我的特工爷爷": [6, 4, 21, "动作片"],
"奔爱": [7, 46, 4, "爱情片"],
"夜孔雀": [9, 39, 8, "爱情片"],
"代理情人": [9, 38, 2, "爱情片"],
"新步步惊心": [8, 34, 17, "爱情片"]}
x=[23,3,17]
KNN=[]
for key,v in movie_data.items():
d=math.sqrt((x[0]-v[0])**2+(x[1]-v[1])**2+(x[2]-v[2])**2)
KNN.append([key,round(d,2)])#保留小数点后两位
print(KNN)
# 按照KNN.items()内容的维度进行排序
KNN.sort(key=lambda dis:dis[1])
#选取距离最小的k个样本,这里取k=5;
KNN=KNN[:5]
print(KNN)
labels={"喜剧片":0,"动作片":0,"爱情片":0}
for s in KNN:
label=movie_data[s[0]]
print(label)
#根据电影名称找到对应的类型,+1
labels[label[3]]+=1
#倒置
labels=sorted(labels.items(),key=lambda l:l[1],reverse=True)
print(labels,labels[0][0],sep='\n')
运行截图
代码二 是对点集进行分类的,里面的二维集可以换为更多维度:
import numpy as np
import operator
import math
def createDataset():
#四组二维特征
group = np.array([[5,115],[7,106],[56,11],[66,9]])
#可以换为三维或者更高维([[5,115,2],[7,106,11],..........)
#四组对应标签
labels = ('动作片','动作片','爱情片','爱情片')
return group,labels
def classify(intX,dataSet,labels,k):
#numpy中shape[0]返回数组的行数,shape[1]返回列数
dataSetSize = dataSet.shape[0]
#将intX在横向重复dataSetSize次,纵向重复1次
#例如intX=([1,2])--->([[1,2],[1,2],[1,2],[1,2]])便于后面计算
diffMat = np.tile(intX,(dataSetSize,1))-dataSet
#二维特征相减后乘方
sqdifMax = diffMat**2
#计算距离
seqDistances = sqdifMax.sum(axis=1)
distances = seqDistances**0.5
# distances=np.sqrt(np.sum(np.square(diffMat)))
print ("distances:",distances)
#返回distance中元素从小到大排序后的索引
sortDistance = distances.argsort()
print ("sortDistance:",sortDistance)
classCount = {}
for i in range(k):
#取出前k个元素的类别
voteLabel = labels[sortDistance[i]]
print ("第%d个voteLabel=%s",i,voteLabel)
classCount[voteLabel] = classCount.get(voteLabel,0)+1
#dict.get(key,default=None),字典的get()方法,返回指定键的值,如果值不在字典中返回默认值。
#计算类别次数
#key=operator.itemgetter(1)根据字典的值进行排序
#key=operator.itemgetter(0)根据字典的键进行排序
#reverse降序排序字典
sortedClassCount = sorted(classCount.items(),key = operator.itemgetter(1),reverse = True)
#结果sortedClassCount = [('动作片', 2), ('爱情片', 1)]
print ("sortedClassCount:",sortedClassCount)
return sortedClassCount[0][0]
if __name__ == '__main__':
group,labels = createDataset()
test = [20,101]
test_class = classify(test,group,labels,3)
print(test_class)
截图:
第二种方法更巧妙 用到的库多