2018-04-1712:22:40
这是python依靠计算机视觉进行的ocr手写字的识别。
通过KNN训练数据
kNN 可以说是最简单的监督学习分类器了。想法也很简单,就是找出测试数据在特征空间中的最近邻居。我们将使用下面的图片介绍它。
上图中的对象可以分成两组,蓝色方块和红色三角。每一组也可以称为一个 类。我们可以把所有的这些对象看成是一个城镇中房子,而所有的房子分别属于蓝色和红色家族,而这个城镇就是所谓的特征空间。(你可以把一个特征空间看成是所有点的投影所在的空间。例如在一个 2D 的坐标空间中,每个数据都两个特征 x 坐标和 y 坐标,你可以在 2D 坐标空间中表示这些数据。如果每个数据都有 3 个特征呢,我们就需要一个 3D 空间。N 个特征就需要 N 维空间,这个 N 维空间就是特征空间。在上图中,我们可以认为是具有两个特征色2D 空间)。
现在城镇中来了一个新人,他的新房子用绿色圆盘表示。我们要根据他房子的位置把他归为蓝色家族或红色家族。我们把这过程成为 分类。我们应该怎么做呢?因为我们正在学习看 kNN,那我们就使用一下这个算法吧。
一个方法就是查看他最近的邻居属于那个家族,从图像中我们知道最近的是红色三角家族。所以他被分到红色家族。这种方法被称为简单 近邻,因为分类仅仅决定与它最近的邻居。
但是这里还有一个问题。红色三角可能是最近的,但如果他周围还有很多蓝色方块怎么办呢?此时蓝色方块对局部的影响应该大于红色三角。所以仅仅检测最近的一个邻居是不足的。所以我们检测 k 个最近邻居。谁在这 k 个邻居中占据多数,那新的成员就属于谁那一类。如果 k 等于 3,也就是在上面图像中检测 3 个最近的邻居。他有两个红的和一个蓝的邻居,所以他还是属于红色家族。但是如果 k 等于 7 呢?他有 5 个蓝色和 2 个红色邻居,现在他就会被分到蓝色家族了。k 的取值对结果影响非常大。更有趣的是,如果 k 等于 4呢?两个红两个蓝。这是一个死结。所以 k 的取值最好为奇数。这中根据 k 个最近邻居进行分类的方法被称为 kNN。
## https://www.cnblogs.com/Undo-self-blog/p/8449393.html import numpy as np import cv2 #读取图片转为灰度图 img = cv2.imread('D:opencv-3.4.1samplesdatadigits.png') gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY) #把图片分隔成5000个,每个20x20大小 cells = [np.hsplit(row,100) for row in np.vsplit(gray,50)] #再转成numpy数组 x = np.array(cells) #一半用来训练的数组,一半用来测试的数组 train = x[:,:50].reshape(-1,400).astype(np.float32) test = x[:,50:100].reshape(-1,400).astype(np.float32) #创建训练和测试的标签 k = np.arange(10) train_labels = np.repeat(k,250)[:,np.newaxis] test_labels = train_labels.copy() #创建一个K-Nearest Neighbour分类器,训练数据,然后用测试数据测试它 knn = cv2.ml.KNearest_create() knn.train(train,cv2.ml.ROW_SAMPLE,train_labels) ret,result,neighbours,dist = knn.findNearest(test,k=5) #最终检查测试的精确度,比较结果,检查哪些是错误的,最终输出正确率 matches = result == test_labels correct = np.count_nonzero(matches) accuracy = correct*100.0 / result.size print(accuracy) # save the data np.savez('knn_data.npz',train=train, train_labels=train_labels) # Now load the data with np.load('knn_data.npz') as data: print (data.files) train = data['train'] train_labels = data['train_labels']
2018-04-1712:22:44