K近邻算法理解及实现(python)

KNN的工作原理:给定一个已知标签类别的训练数据集,输入没有标签的新数据后,在训练数据集中找到与新数据最邻
近的k个实例,如果这k个实例的多数属于某个类别,那么新数据就属于这个类别。可以简单理解为:由那些离X最
近的k个点来投票决定X归为哪一类。

在二维平面下:         |AB|=\sqrt{(x_{1}-x_{2})^{2}+(y_{1}-y_{2})^{2}}   计算新数据与附件k(K近邻)个训练数据集的距离。在二维条件下,可理解为只有两个特征值来决定其分类。

在N维空间下,也就是N个特征值来决定新输入数据的分类:dist(x,y)=\sqrt{\sum_{i=1}^{n}(x_{i}-y_{i})^{2}}

其算法步骤如下:

(1) 计算已知类别数据集中的点与当前点之间的距离;
(2) 按照距离递增次序排序;
(3) 选取与当前点距离最小的k个点;
(4) 确定前k个点所在类别的出现频率;
(5) 返回前k个点出现频率最高的类别作为当前点的预测类别。
 

#!/usr/bin/env python
# -*- coding:utf-8 -*-
import pandas as pa
rowdata={'电影名称':['无问西东','后来的我们','前任3','红海行动','唐人街探案','战狼2'],
          '打斗镜头':[1,5,12,108,112,115],
          '接吻镜头':[101,89,97,5,9,8],
          '电影类型':['爱情片','爱情片','爱情片','动作片','动作片','动作片']}
movie_data=pa.DataFrame(rowdata)
def movie_classify(judge_data,movie_data,k):
    result=[]
    dist = list((((movie_data.iloc[:6, 1:3] - new_data) ** 2).sum(1)) ** 0.5)
    dist_l = pa.DataFrame({'dist': dist, 'labels': (movie_data.iloc[:6, 3])})
    dr = dist_l.sort_values(by='dist')[:k]
    re = dr.loc[:, 'labels'].value_counts()
    result.append(re.index[0])
    return result
str1=input('请输入该部电影中的打斗镜头次数:')
str2=input('请输入该部电影中的接吻镜头次数:')
new_data=[int(str1),int(str2)]
predicetion=movie_classify(new_data,movie_data,4)
print('这是一部:',predicetion)

猜你喜欢

转载自blog.csdn.net/mr_qin_hh/article/details/84563870