k-近邻算法(K-NearestNeighbouralgorithm),又称KNN算法,是数据挖掘技术中原理最简单的算法。
工作原理:给定一个已知标签类别的训练数据集,输入没有标签的新数据后,在训练数据集中找到与新数据最邻近的k个实例,如果这k个实例的多数属于某个类别,那么新数据就属于这个类别。简单理解为:由那些离X最近的k个点来投票决定X归为哪一类。
(1)计算已知类别数据集中的点与当前点之间的距离;
(2)按照距离递增次序排序;
(3)选取与当前点距离最小的k个点;
(4)确定前k个点所在类别的出现频率;
(5)返回前k个点出现频率最高的类别作为当前点的预测类别。
判断一个电影是爱情片还是动作片。
欧氏距离
构建数据集
rowdata={"电影名称":['功夫熊猫','叶问3','伦敦陷落','代理情人','新步步惊心','谍影重重','功夫熊猫','美人鱼','宝贝当家'],"搞笑镜头":[39,3,2,9,8,5,39,21,45],"拥抱镜头":[0,2,3,38,34,2,0,17,2],"打斗镜头":[31,65,55,2,17,57,31,5,9],"电影类型":["喜剧片","动作片","动作片","爱情片","爱情片","动作片","喜剧片","喜剧片","喜剧片"]}计算已知类别数据集中的点与当前点之间的距离
new_data=[24,67]dist=list((((movie_data.iloc[:6,1:3]-new_data)**2).sum(1))**0.5)将距离升序排列,然后选取距离最小的k个点「容易拟合·以后专栏再论」
k=4dist_l=pd.DataFrame({'dist':dist,'labels':(movie_data.iloc[:6,3])})dr=dist_l.sort_values(by='dist')[:k]确定前k个点的类别的出现概率
re=dr.loc[:,'labels'].value_counts()re.index[0]选择频率最高的类别作为当前点的预测类别
result=[]result.append(re.index[0])result
(1)简单好用,容易理解,精度高,理论成熟,既可以用来做分类也可以用来做回归;
(2)可用于数值型数据和离散型数据;
(3)无数据输入假定;
(4)适合对稀有事件进行分类。
(1)计算复杂性高;空间复杂性高;
(2)计算量大,所以一般数值很大的适合不用这个,但是单个样本又不能太少,否则容易发生误分;
(3)样本不平衡问题(即有些类别的样本数量很多,而其他样本的数量很少);