python3 sklearn之 knn学习

1,我们给定电影的数据表示如下:

2,问题的数据化:

knn是根据距离的长短进行分类的,通过分类之后我们可以对以后的数据进行判定是属于那种类型,现在我们通过一个实例电影的武打场景次数和接吻场景次数来判定电影是武打片还是爱情片,我们来给定一系列的数据如下所示:

3,算法依赖于求解的路径公式:

4,通过公式分类可以看到如下图结果:

数据如果多的时候分类效果好的话如下图所示:

5,看完上面我们已经已经大致明白了knn的算法实现,现在我们用代码来实现看看,并且给定数据测试一下:

import numpy as np
import operator

def createDataset():
    #7组二维特征
    group = np.array([[3,104],[2,100],[1,81],[101,10],[99,5],[98,2],[18,90]])
    #7组对应标签
    labels = ('爱情片','爱情片','爱情片','动作片','动作片','动作片','爱情片')
    return group,labels

def classify(intX,dataSet,labels,k):
    '''
    KNN算法
    '''
    #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
    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]
    test1 = [108,19]
    test_class = classify(test,group,labels,3)
    print (test_class)
    test_class1 = classify(test1,group,labels,2)
    print (test_class1)
    

运行结果如下:

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

陌上花开缓缓归以

你的鼓励将是我创作的最大动力,

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值