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实现简单电影分类的案例,希望对大家的学习有所帮助!