一、简介
邻近算法,或者说K最近邻(kNN,k-NearestNeighbor)分类算法是数据挖掘分类技术中最简单的方法之一。所谓K最近邻,就是k个最近的邻居的意思,说的是每个样本都可以用它最接近的k个邻居来代表。
二、算法实现
1.算法理解
(1)准备数据,对数据进行预处理。
(2)选用合适的数据结构存储训练数据和测试数据。
(3)设定参数,如k。
(4)计算测试数据到训练数据的距离,按照从小到大排序。
(5)取前k个数据作为参考样本。
(6)分析参考样本,得到结果。
2.代码实现
训练数据:
序号 电影名称 搞笑镜头 拥抱镜头 打斗镜头 电影类型
1 宝贝当家 45 2 9 喜剧片
2 美人鱼 21 17 5 喜剧片
3 澳门风云3 54 9 11 喜剧片
4 功夫熊猫3 39 0 31 喜剧片
5 谍影重重 5 2 57 动作片
6 叶问3 3 2 65 动作片
7 我的特工爷爷 6 4 21 动作片
8 奔爱 7 46 4 爱情片
9 夜孔雀 9 39 8 爱情片
10 代理情人 9 38 2 爱情片
11 新步步惊心 8 34 17 爱情片
12 伦敦陷落 2 3 55 动作片
测试数据:
唐人街探案 23 3 17
import numpy as np
import pandas as pd
class KNN(object):
def __init__(self,path,testdata,k):
self.path=path
self.testData=testdata
self.k=k
def readData(self):
#读取数据
try:
self.data = pd.read_csv(self.path,sep=',',encoding='gbk')
except:
self.data = pd.read_excel(self.path)
# return self.data
def clearData(self):
#清洗空值的数据
self.data.dropna(axis=1,how='all',inplace=True)
self.data.dropna(axis=0,how='all',inplace=True)
def distance(self):
# 计算距离
#新增instance一列,将对应点的距离一一填入
self.data['distance'] = np.sqrt((self.data['搞笑镜头']-self.testData[0])**2+(self.data['拥抱镜头']-self.testData[1])**2+(self.data['打斗镜头']-self.testData[2])**2)
def KNN_way(self):
# KNN算法函数
sort_list = sorted(self.data['distance'])[:self.k] #将距离一列进行排列存入sort_list
list=[]
for i in sort_list:
list.append(self.data.loc[self.data['distance']==i]['电影类型'].values)
df = pd.DataFrame({'type':list})
top_type = df['type'].describe()[2][0]
print(top_type)
test = KNN(r'C:\Users\Administrator\Desktop\电影分类数据.xlsx',[23, 3, 17],5)
test.readData()
test.clearData()
test.distance()
test.KNN_way()