【机器学习】KNN算法

522 阅读2分钟

KNN算法

1、原理

K最近邻(k-Nearest Neighbor,KNN)分类算法。是一种基本分类和回归方法

K近邻算法,即是给定一个训练数据集,对新的输入实例,在训练数据集中找到与该实例最邻近的K个实例,这K个实例的多数属于某个类,就把该输入实例分类到这个类中。

简单理解为:由那些距离x点最近的K个点投票决定x的归属。这就类似于现实生活中少数服从多数的思想。

image.png

2、步骤

  • ①计算测试数据与各个训练数据之间的距离;
  • ②按照距离的递增关系进行排序;
  • ③选取距离最小的K个点;
  • ④确定前K个点所在类别的出现频率;
  • ⑤返回前K个点中出现频率最高的类别作为测试数据的预测分类。

3.实现

1、数据集

image.png

2、图

image.png

3、距离计算

image.png

4、具体实现

1、数据集准备
row_data = {'电影名称': ['无问西东', '后来的我们', '前任3', '红海行动', '唐人街探案', '战狼2'],
            '打斗场景': [1, 5, 12, 108, 112, 115],
            '接吻镜头': [101, 89, 97, 5, 9, 8],
            '电影类型': ['爱情片', '爱情片', '爱情片', '动作片', '动作片', '动作片']}
movie_data = pd.DataFrame(row_data)

2、计算距离
new_data=[108,3]
dist = list((((movie_data.iloc[:6, 1:3] - new_data) * 2).sum(1)) ** 0.5)
3、将距离升序排列,然后选取距离最小的点
dist_l = pd.DataFrame({'dist': dist, 'labels': (movie_data.iloc[:6, 3])})
dr = dist_l.sort_values(by='dist')[:k]
4、确定前k个点所在类别的出现频率
re = dr.loc[:, 'labels'].value_counts()
5、选取频率最高的类别作为当前点的预测类别
re = dr.loc[:, 'labels'].value_counts()
result.append(re.index[0])

4.函数封装

'''
@author:hengBao
@date2022/3/31 12:34:43

函数功能:KNN分类器
参数说明:
    inX:需要预测分类的数据
    dataSet:已知分类标签的数据集
    k:k——近邻算法参数,选择距离最近的k个点
返回:
    result:预测结果
'''
def mKNN(inX,dataSet,k):
    result=[]
    dist = list((((movie_data.iloc[:6,1:3] - new_data)*2).sum(1))**0.5)
    dist_l = pd.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

# test
inX = new_data
dataSet = movie_data
k = 4
print("新电影-> "+str(new_data[0])+" 打斗镜头和 "+str(new_data[1])+" 接吻镜头。预测是: "+str(knn(inX, dataSet, k)))

5.预测结果

image.png

image.png