我的人工智能之旅——近邻算法KNN(K-Nearest Neighbor)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/daihuimaozideren/article/details/82977972

在图像识别中,图像分类是首要工作。因为需要将不同类型的图像先进行排除。近邻算法是最简单的算法之一,但由于其弊端的存在,本篇只做了解性的简单介绍,

K近邻算法的实质

将测试图片在已经分类好的,具有不同标签的训练数据图片中,找到K张最相似的图片,进而根据K张图片中类型的比例大小,推断图片类型。判断图片的相似程度,就需要用到距离算法。我们知道,图片的电子存在形式是多维的矩阵数据,不同的维度代表区域(高,宽),颜色(RGB之类)等。

算法具体步骤

1)计算测试数据与各个训练数据之间的距离;

2)按照距离的递增关系进行排序;

3)选取距离最小的K个点;

4)确定前K个点所在类别的出现频率;

5)返回前K个点中出现频率最高的类别作为测试数据的预测分类。

曼哈顿距离算法

曼哈顿距离算法Manhattan,又称为L1距离算法。将测试图片的各像素与训练图片的各像素进行比较,形成绝对值的差,然后将差值全部相加。若差值越小,说明图片越相近。算法公式如下,

d(I_{1},I_{2})=\sum _{p=0}^{n}\left | I_{1}^{p}-I_{2}^{p} \right |

说明:I_1,I_2分别为测试图片和训练图片,p为像素点的索引。

欧式距离算法

欧式距离算法,又称为L2距离算法,较L1更为常用。L1距离算法使用的是绝对值差的和。L2距离算法,使用的是方差和的算术平方根,用来体现个体的离散程度。算法公式如下,

d(I_{1},I_{2})=\sqrt{\sum _{p=0}^{n}(I_{1}^{p}-I_{2}^{p})^2}

交叉验证

在验证模型效果时,通常使用训练数据进行验证。原因在于训练数据已经有标签,可以直接比对结果。做法是将训练数据分成N份,仅用N-M份用于训练(M<N),剩余M份用于验证。交叉验证在其他算法中也是通用的存在。

K值的选择

K值通常是小于20的整数。可以通过多次交叉验证,遍历不同的K,获取结果较好的K值。

K近邻算法的问题

在实际应用中,很少使用KNN,原因如下,

1)算法效率与训练数据集合的大小成线性关系。因为要逐一比较,训练数据集越大,比较时间越长,效率越低。而训练集越小,准确度将随之降低。因此,如何确定训练数据集的大小,很关键。

2)同一张图片,若光线强弱不同,或存在图像偏移,又或关键部位缺失,都会对距离计算产生影响。

3)由于是对所有像素点进行距离计算,图像背景对距离计算的影响很大。

参考文章

https://www.cnblogs.com/ybjourney/p/4702562.html

猜你喜欢

转载自blog.csdn.net/daihuimaozideren/article/details/82977972