上一篇博客中,我们已经介绍了图像检索的原理与实现,这篇要介绍图像分类,什么是图像分类呢?图像分类就是输入一张图像,找到它属于哪一类。比如拍照识花,我们拍一张花的图像上传系统,然后系统就会告诉你这是什么花。那么图像分类是怎么怎么实现的呢?
一、KNN算法
1.算法概述
KNN(K-Nearest Neighbor,KNN)算法,又叫K最近邻分类算法,是著名的模式统计学方法。在分类方法中,KNN算法是最简单且用的最多的一种方法之一。
2.基本思想
KNN算法的基本思想是在特征空间中,如果要分类的对象(例如一个特征向量),在它的k个最近邻的已知对象中,大多数属于一个类别,则该要它也属于这个类别,并具有这个类别样本的特性。其基本思想示意图如下:

如图所示,已知红色三角和蓝色正方形都是已知对象,那么绿色圆圈属于哪一类呢?如果我们取K=1,我们可以很清楚的看见离它最近的是红色的三角,那么它就属于红色三角的那类;如果我们取K=5,在离它最近的5个已知对象中,有2个红色三角和3个蓝色正方形,蓝色正方形的数量大于红色三角的数量,所以它属于蓝色正方形。从这里我们也可以看到,K值的选取,对于分类的好坏起着至关重要的作用。K值过小,整体模型会变得复杂,容易过拟合;K值过大,会增加误差。
3.算法流程
KNN算法的流程如下:
- 输入训练数据和标签,输入测试数据,设置K值
- 计算测试数据与各个训练数据之间的距离(本文选取欧式距离,大家也可以选取其他距离)
- 按照距离的递增关系进行排序,选取距离最近的K个点
- 确定前K个点所在类别的出现频率,返回频率最高的那个类别作为测试数据的类别
4.算法的优缺点
KNN算法的优点:
- KNN可以用来做分类也可以用来做回归;
- 可用于非线性分类;
- 训练时间复杂度比支持向量机之类的算法低,仅为O(n);
- KNN与朴素贝叶斯之类的算法比,对数据没有假设,准确度高,对异常点不敏感;
- KNN方法主要靠周围有限个邻近的样本,而不是靠判别类域的方法来确定所属类别的,因此对于类域的交叉或重叠较多的待分样本集来说,KNN方法较其他方法更为适合;
- KNN算法比较适用于样本容量比较大的类域的自动分类,而那些样本容量较小的类域采用这种算法比较容易产生误分;
- 特别适合于多分类问题(对象具有多个类别标签),KNN要比SVM表现要好。
KNN算法的缺点:
- 特征数比较多时,计算量很大;
- 样本各类别数量不平衡时,对稀有类别的预测准确率低;
- KD树,球树的模型建立需要大量的内存空间;
- 预测时需要现算预测点到训练集中所有点的距离,因此预测速度比逻辑回归算法要慢。
5.用KNN实现简单的二维数据分类
(1)随机生成二维的训练数据和测试数据
# -*- coding: utf-8 -*-
from numpy.random import randn
import pickle
from pylab import *
###生成数据
# 创建二维样本数据
n = 200
#两个正态分布的数据集
class_1 = 0.5 * randn(n,2)
class_2 = 1.5 * randn(n,2) + array([5,1])
labels = hstack((ones(n),-ones(n)))
#用Pickle模块保存
with open('points_normal.pkl', 'wb') as f:
#with open('points_normal_test.pkl', 'wb') as f:
pickle.dump(class_1,f)
pickle.dump(class_2,f)
pickle.dump(labels,f)
#正态分布,并使数据成环绕状分布
print ("save OK!")
class_1 = 0.5 * randn(n,2)
r = 1.0 * randn(n,1) + 5
angle = 2*pi * randn(n,1)
class_2 = hstack((r*cos(angle),r*sin(angle)))
labels = hstack((ones(n),-ones(n)))
#用Pickle模块保存
with open('points_ring.pkl', 'wb') as f:
#with open('points_ring_test.pkl', 'wb') as f:
pickle.dump(class_1,f)
pickle.dump(class_2,f)
pickle.dump(labels,f)
print ("save OK!")
根据上面的代码,运行两次,我们可以得到四个数据集,其中两个是训练集,两个是测试集,规模都是200,我们将前100个数据定义标签为-1,剩下的100个数据定义标签是1。两个训练集的不同之处在于一个是正态分布,另一个是环绕状分布。有个训练集和测试集,我们就可以用KNN来实现分类啦。
(2)KNN算法实现分类

最低0.47元/天 解锁文章
288

被折叠的 条评论
为什么被折叠?



