KNN
前言:
knn(K-Nearest Neighbor)中文名叫做k最近邻算法,这是有监督算法(自己下去百度一下什么是有监督,什么是无监督),分类算法中简单粗暴的一个。
分类方法是根据距离该点最近的k个邻居,从而得到该点所属的分类。
这个算法的核心思想是:如果一个样本在样本空间中的k个最相邻的样本中大多数属于某一个类别,则该样本也属于该类别。
算法详细流程是:
一:计算样本空间中存在的点与当前点的距离。
二: 按照距离递增的关系进行排列。
三:选取前k个点(k的值由自己选定)
四:确定前k个点所属的分类。
五:选择前k个点中分类出现次数最高的分类最为该点所属的分类。
这里,我们可以看出当前样本点所属的分类跟k的取值是有很大关系的,k的值过小,则会导致当前点的所属分类会出现偶然性(也就是所谓的噪音干扰,相比常识下也会认为k==1,是不正常的),整个模型也会变得复杂,容易变得过拟合(这个概念自己下去查询一下)。
相反的,k的取值过大也会导致模型变得简单,较远的点也会对分类的预测起到作用。
同时k的值尽可能取奇数,避免五五开的情况。
正如上面的图所示,如果这里k==3,那么很明显绿点就属于三角形这个分类。
这个算法看起来确实简单,暴力,请用KNN实现手写数字识别。
(学有余力者: https://blog.csdn.net/zzz_cming/article/details/78938107
https://www.kaggle.com/mineshjethva/knn-from-scratch-in-python-at-97-1 )
当前点的取值除了跟k的取值有关之外,还跟距离的度量有关。
下面介绍几个距离计算公式:
欧氏距离:
这个是我们最为熟悉的一个距离计算公式:最常见的是空间中两点间的距离公式。
$$
d=\sqrt{(x_1-x_2)^2+(y_1-y_2)^2}
$$
n维的公式以此类推就好。
曼哈顿距离
$$
d=|x_1-x_2|+|y_1-y_2|
$$
n维以此类推
切比雪夫距离:
$$
d=max(|x_1-x_2|,|y_1-y_2|)
$$
如果有兴趣的话,可以观察一下,在国际象棋中,国王每走一步,移动的最小距离就是切比雪夫距离。