基于KNN算法的电影分类器(原理,代码讲解)

K近邻(K-Nearest Neighbor, KNN)是一种最经典和最简单的有监督学习方法之一。K-近邻算法是最简单的分类器,没有显式的学习过程或训练过程,是懒惰学习(LazyLearning)。当对数据的分布只有很少或者没有任何先验知识时,K 近邻算法是一个不错的选择。

接下来我们实际案例来看理解KNN算法。

现在我们有很多电影的反馈数据,数据有三个维度分别电影的甜蜜程度,恐怖程度,搞笑程度。每个程度对应一个电影类型分别爱情,恐怖,搞笑电影。下面我们简单的形成数据:

[100,   1,  20],
[ 80,   8,   8],
[  6,  89,   1],
[  8, 208,   2],
[ 20,   6,  90],
[ 10,   7,  78]

其中,第一位表示甜蜜程度的分数,第二位表示恐怖程度的分数,第三位表示搞笑程度的表示。那现在我们有一个电影的数据[10,8,78],对他进行分类。其实我们现在能肉眼能看出这个电影属于哪个类别,但是当数据的维度越来越大的时候(在实际应用中,维度很高)不可能肉眼看出来的。那我们可以通过KNN算法能分类出这个电影的应该哪一类电影。

其实KNN算法是我们初中学的两点之间的距离,就这么简单。

 但是,现在应该能看出来,多了一个维度也就是Z。这个好比与在三位空间中的两个点之间的距离。

接下里我们通过python实现这个算法和功能。

首先就是导入包了,如果有python基础的小伙伴就知道。

#config:utf-8
import numpy
import operator

首先我们用把准备数据:

def create_data():
    #[a,b,c],其中分别表示a=甜蜜程度,b=恐怖程度,c=搞笑程度
    T_value=numpy.array([[100,1,20],[80,8,8],[6,89,1],[8,208,2],[20,6,90],[10,7,78]])
    lable=['爱情','爱情','恐怖','恐怖','搞笑','搞笑']
    return T_value,lable

在写一个KNN算法实现的函数:

def KNN(test,train,lable,k):
    train_size=train.shape[0]
    print(train_size)
    minus=numpy.tile(test,(train_size,1))-train
    print(minus)
    sq_data=minus**2
    print(sq_data)
    sum_data=sq_data.sum(axis=1)
    print(sum_data)
    squre_data=sum_data**0.5
    print(squre_data)
    sourt_data=squre_data.argsort()
    print(sourt_data)
    
    class_count={}
    for i in range(k):
        lable_value=lable[sourt_data[i]]
        class_count[lable_value]=class_count.get(lable_value,0)+1
    print(class_count)
    sortedClassCount = sorted(class_count.items(),key=operator.itemgetter(1),reverse=True)
    print(sortedClassCount)
    return sortedClassCount[0][0]

你们也像我这样每个断点方一个输出(print),看每个断点输出的具体数值是什么。

在调用KNN算法

if __name__ == '__main__':
    test=[10,8,78]
    train,lable=create_data()
    target=KNN(test,train,lable,3)
    print(target)

输出结果就是:

6
[[ -90    7   58]
 [ -70    0   70]
 [   4  -81   77]
 [   2 -200   76]
 [ -10    2  -12]
 [   0    1    0]]
[[ 8100    49  3364]
 [ 4900     0  4900]
 [   16  6561  5929]
 [    4 40000  5776]
 [  100     4   144]
 [    0     1     0]]
[11513  9800 12506 45780   248     1]
[107.29864864  98.99494937 111.83022847 213.96261356  15.74801575
   1.        ]
[5 4 1 0 2 3]
{'搞笑': 2, '爱情': 1}
[('搞笑', 2), ('爱情', 1)]
搞笑

本文章已经讲解了KNN算法和用KNN实现简单电影分类的案例,希望对大家的学习有所帮助!

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值