摘要:
kNN算法的核心思想是如果一个样本在特征空间中的k个最相邻的样本中的大多数属于某一个类别,则该样本也属于这个类别,并具有这个类别上样本的特性。
KNN关键的一个参数就是K了
对下面这组参数:
n=400
class_1 = 0.8 * randn(n,2)
r = 0.8 * randn(n,1) + 5
angle = 3*pi * randn(n,1)
class_2 = hstack((r*cos(angle),r*sin(angle)))
labels = hstack((ones(n),-ones(n)))
当把K修改为150时:
当K=5时,分类的图像为:
当把K改成1时:
可见对于该类型的数据,K越小分类效果越好。但是K过于小的话,会对噪声过于敏感。
像对下面这两组数据,KNN算法完全无法分类
#右图
class_1 = 5.6 * randn(n,2)
class_2 = 3 * randn(n,2) + array([-5,5])
#左图
class_1 = 5.6 * randn(n,2)
class_2 = 3 * randn(n,2) + array([15,5])
dense sift和sift的差别:
dense SIFT是提取我们感兴趣的patches中的每个位置的SIFT特征。而通常做特征匹配的SIFT算法只是得到感兴趣区域或者图像上若干个稳定的关键点的SIFT特征。
根据这个特性,一般dense sift用于图像识别,而sift用于图像检索。
dense SIFT提取的做法是,拿一个size固定的掩模或者bounding box,以一定的步长(stepsize)在图像上自左向右、从上到下提取dense SIFT的patch块。
x,y = meshgrid(range(steps,m,steps),range(steps,n,steps))#生成采样点的网格,step为步长
scale = size/3.0#scale就是bounding box的大小
xx,yy = x.flatten(),y.flatten()
frame = array([xx,yy,scale*ones(xx.shape[0]),zeros(xx.shape[0])])#生成bounding box提取特征值
dsift.process_image_dsift('gesture/hand.jpg','hand.dsift',90,40,True)#调用函数,其中90是size,40是step
对手势进行dense sift 特征提取:
把步长变小之后step=20(图左),再把size变小size=20(图右):
我们可以通过调整这两个值,来观察他们对识别精确率的影响:
dsift.process_image_dsift(filename,featfile,5,2,resize=(50,50))
使用的测试集是有加入训练集没有的数据,包括自己拍的:
filelist_train = get_imagelist('gesture/train')#训练集
filelist_test = get_imagelist('gesture/test')#测试集
所以可以得出结论,size和step对于精确度的影响不是一个线性上升和线性下降的过程。
用我们上面测试出正确率最高的step和size组合来对自己拍的图片进行识别:
test1:
test2:
test3:
从上面的结果来看,对于自己拍摄的图片识别正确率并不高,可能是因为背景比较杂对特征提取造成了影响。