KNN算法
1、原理
K最近邻(k-Nearest Neighbor,KNN)分类算法。是一种基本分类和回归方法
K近邻算法,即是给定一个训练数据集,对新的输入实例,在训练数据集中找到与该实例最邻近的K个实例,这K个实例的多数属于某个类,就把该输入实例分类到这个类中。
简单理解为:由那些距离x点最近的K个点投票决定x的归属。这就类似于现实生活中少数服从多数的思想。
2、步骤
- ①计算测试数据与各个训练数据之间的距离;
- ②按照距离的递增关系进行排序;
- ③选取距离最小的K个点;
- ④确定前K个点所在类别的出现频率;
- ⑤返回前K个点中出现频率最高的类别作为测试数据的预测分类。
3.实现
1、数据集
2、图
3、距离计算
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
@date:2022/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)))