欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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')

运行截图
knn(k邻近算法)代码二 是对点集进行分类的,里面的二维集可以换为更多维度:

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)

截图:
knn(k邻近算法)第二种方法更巧妙 用到的库多