Machine learning 提取手写体数字特征以加快最近邻算法

Machine learning 提取手写体数字特征以加快最近邻算法,machine-learning,computer-vision,artificial-intelligence,nearest-neighbor,Machine Learning,Computer Vision,Artificial Intelligence,Nearest Neighbor,我有1024位长的三个手写数字的二进制表示:0,1,8。 基本上,在32x32位位图中,行被连接成一个二进制向量 每个数字有50个二进制向量。 当我们对每个数字应用最近邻时,我们可以使用汉明距离度量或其他度量,然后应用该算法来区分向量。 现在,我想使用另一种技术,在比较向量时,我不看向量的每一位,而是分析更少的位 例如,我知道当比较bitmapsize:1024位数字“8”和“0”时,数字“8”的向量中间必须有1,因为数字8在视觉上显示为列中两个零的组合。 因此,我们的算法将寻找两个零的交点,即

我有1024位长的三个手写数字的二进制表示:0,1,8。 基本上,在32x32位位图中,行被连接成一个二进制向量

每个数字有50个二进制向量。 当我们对每个数字应用最近邻时,我们可以使用汉明距离度量或其他度量,然后应用该算法来区分向量。 现在,我想使用另一种技术,在比较向量时,我不看向量的每一位,而是分析更少的位

例如,我知道当比较bitmapsize:1024位数字“8”和“0”时,数字“8”的向量中间必须有1,因为数字8在视觉上显示为列中两个零的组合。 因此,我们的算法将寻找两个零的交点,即数字的中间

这就是我想要的工作方式。我想将1024位图向量的低级表示转换为高级表示,高级表示由从位图中提取的两个属性组成

有什么建议吗?我希望观众对这个问题有点清楚。

想法1:洪水泛滥 这个想法并没有使用每个数字50个模式:它基于这样一个想法:通常1的所有0位都连接在该1形状周围,而0将其内部的0位与外部的0位分开,8有两个这样的封闭区域。因此,计算0位的连接区域可以识别这三个区域中的哪一个

所以你可以使用a,从向量中的任何0位开始,将所有连接的0位设置为1。在一维数组中,您需要注意在水平方向上正确识别连接的位:1个位置分开,但不跨越32个边界,或者在垂直方向上。。。分开32个位置。当然,这种洪水填充会破坏图像-因此请确保使用副本。如果在一次这样的泛洪填充之后,仍然有0个比特没有连接到那些你变成1的比特,那么选择其中一个,并在那里开始第二次泛洪填充。如有必要,重复上述步骤

以这种方式将所有位设置为1时,使用必须执行的整体填充数,如下所示:

一次洪水?它是1,因为所有的0位都是连接的。 两次洪水?它是0,因为0的形状将内部/外部的两个区域分开 三次洪水?它是8,因为这个形状将连接的0位的三个区域分开。 当然,这个过程假设这些手写数字格式正确。例如,如果一个8字形有一个小间隙,如下所示:

…那么它将不会被标识为8,而是0。这个特殊的问题可以通过识别停止的1位线的松散端来解决。当你有两个在短距离内,然后增加你从洪水填充计数得到的数字1,就好像这两个端点是连接的一样

类似地,如果0意外地有一个小的第二个循环,如下所示:

…它将被标识为8而不是0。您可以通过要求每个泛洪填充找到最小数量的0位(如至少10个0位)来防止此特定问题

想法2:概率向量 对于每个数字,将50个示例向量相加,以便每个位置的计数介于0到50之间。每个数字有一个这样的概率向量,所以prob0,prob1和prob8。如果prob8[501]=45,则表示8向量在索引501处具有1位的可能性很高,为45/50

现在将这3个概率向量进行如下变换:不存储每个位置的计数,而是按降低计数概率的顺序存储位置。因此,如果prob8[513]的值最高,比如49,那么新数组应该像[513,…]一样开始。让我们把这些新向量称为A0、A8和A1,作为相应的数字


最后,当您需要匹配给定的输入向量时,同时通过A0、A1和A8,始终查看三个向量中的相同索引,并保留3个分数。当输入向量在A0[i]中指定的位置有1时,则将1添加到0。如果在A1[i]相同i中指定的位置也有1,则将1添加到score1。分数8也是一样。增量i,然后重复。一旦有明确的赢家,即当得分0、得分1和得分8中的最高得分与其中第二高的得分超过阈值差时,停止此迭代。在这一点上,您知道表示的是哪个数字。

当您实际拥有位图时,矢量是什么意思?要么你有一系列向量,要么你有一个位图。。。你能举一个输入的例子吗?矢量和位图的区别是什么。。。。我想两者都是指同一个。。。。我的意思是一个长度为1024的数组,包含1或0。所以一个32x32位图,比如白色是0,黑色是1?明白了,这里是32x32位的行
ap被连接起来形成一个长度为1024的二进制向量。你能给我一个方向吗?我应该学习什么才能在没有任何帮助的情况下猜出解决这类问题的方法?我只是练习解决问题,实际上很多问题,然后看看其他人是如何解决的。有很多网站提供这种服务,比如CodeWars、CodeChef、LeetCode等等。不知何故,大脑应该从以前的经验中建立一些直觉-