邻近算法,或者说K最近邻(kNN,k-NearestNeighbor)分类算法是数据挖掘分类技术中最简单的方法之一。所谓K最近邻,就是k个最近的邻居的意思,说的是每个样本都可以用它最接近的k个邻居来代表。
其实,对于机器学习来说,KNN是最简单的一个入门算法,类似于编程的“hello world”,所谓近朱者赤近墨者黑,如果你想了解一个人,你看他身边的朋友大概就能知道这个人是怎么样的,KNN算法的核心思想也是这样,下面来看看这个图:
要想知道图中绿色的圆圈是属于哪一类的数据,取决于K的值,由图可知,当K=2时,它靠近最多样本的的是红色的三角形,由此可以推断当K=2时,新样本属于三角形类别的,当K=3时,新样本属于蓝色正方形,这就是KNN算法,它一般同归一下几个步骤来预测或者判断新样本属于哪一个类别的:
1.计算距离(常用欧几里得距离或者马氏距离)
其实我们中学所学的计算两个点或者两个向量的距离
二维空间的公式
其中,为点
与点
之间的欧氏距离;
为点
到原点的欧氏距离。
三维空间的公式
n维空间的公式
2.升序排列
通过计算新样本与所有点的距离,然后进行升序排列
3.取前K个
升序排列后,取前K个值
4.加权平均
对于离得比较近的点,应该给高一点的权重,比较远的点,给相对低的权重,而不是使用算数平均
KNN算法处理大概是以上几个步骤,而其实算法核心最关键的是K值的选取,那么怎么来选取K值呢?
根据经验来讲,K值一般选取奇数效果比较好,为什么选取奇数呢?因为一般对于二分类问题来说,把K设置为奇数是容易防止平局的现象。但对于多分类来说,设置为奇数未必一定能够防平局。
下面通过一个简单的例子来实现以下这个算法,这个例子是通过电影的接吻镜头和武打镜头作为标签,来预测一部电影属于什么类别的电影,先看看代码:
import numpy as np
import pandas as pd
from pandas import Series,DataFrame
from sklearn.neighbors import KNeighborsClassifier
data=pd.read_excel('movies.xlsx',sheet_name='Sheet1')
X=data[['武打镜头','接吻镜头']]
y=data['分类情况']
knn=KNeighborsClassifier(n_neighbors=5)
knn.fit(X,y)
X_test=np.array([[100,2],[2,15]])
print(knn.predict(X_test))
再看看excel的数据:
这篇属于总结学习,接下来会更深入的分析,如果对你有用,给我点赞