Math 超平面之间的距离

Math 超平面之间的距离,math,image-processing,machine-learning,classification,image-recognition,Math,Image Processing,Machine Learning,Classification,Image Recognition,我试图教自己一些机器学习,并且一直在使用MNIST数据库()来实现这一点。该网站的作者在1998年写了一篇关于各种手写识别技术的论文,可在 第十种方法是“切线距离分类器”。其思想是,如果将每个图像放置在(NxM)维向量空间中,则可以计算两个图像之间的距离,作为每个图像形成的超平面之间的距离,其中超平面通过取点、旋转图像、重新缩放图像、平移图像等方式给出 我想不出足够的办法来填补遗漏的细节。我知道其中大部分都是线性算子,那么如何利用这个事实来创建超平面呢?一旦我们有了一个超平面,我们如何计算它与其

我试图教自己一些机器学习,并且一直在使用MNIST数据库()来实现这一点。该网站的作者在1998年写了一篇关于各种手写识别技术的论文,可在

第十种方法是“切线距离分类器”。其思想是,如果将每个图像放置在(NxM)维向量空间中,则可以计算两个图像之间的距离,作为每个图像形成的超平面之间的距离,其中超平面通过取点、旋转图像、重新缩放图像、平移图像等方式给出


我想不出足够的办法来填补遗漏的细节。我知道其中大部分都是线性算子,那么如何利用这个事实来创建超平面呢?一旦我们有了一个超平面,我们如何计算它与其他超平面的距离?

我会给你一些提示。你需要一些图像处理方面的背景知识。详情请参阅

  • 是切线距离的
    c
    实现
  • 是一篇更详细地描述切线距离的文章
图像卷积 据介绍,您需要做的第一步是平滑图片。下面我们展示了3种不同平滑操作的结果(检查的第4节)(左栏显示结果图像,右栏显示原始图像和卷积算子)。这一步是将离散向量映射到连续向量,使其可微。作者建议使用高斯函数。如果您需要有关图像卷积的更多背景信息,以下是一个示例

完成此步骤后,您已经计算了水平和垂直偏移:

计算缩放切线 这里我向您展示了在中实现的一个切线计算-缩放切线。从中,我们知道转换如下:

/* scaling */
for(k=0;k<height;k++)
  for(j=0;j<width;j++) {
    currentTangent[ind] = ((j+offsetW)*x1[ind] + (k+offsetH)*x2[ind])*factor;
    ind++;
  }

作者使用的图像大小为16x16。所以我们知道

factor=factorW=factorH=1/8, 

还要注意,我们已经计算了

  • x1[ind]
    =
  • x2[ind]
    =
因此,我们插入这些常数:

currentTangent[ind] = ((j-7.5)*x1[ind] + (k-7.5)*x2[ind])/8
                    = x1 * (j-7.5)/8 + x2 * (k-7.5)/8.
由于
j
(也是
k
)是一个介于0和15之间的整数(图像的宽度和高度为16像素),
(j-7.5)/8
只是介于
-0.9375
0.9375
之间的一个小数

所以我猜
(j+offsetW)*因子是每个像素的位移,它与像素到图像中心的水平距离成正比。同样,您知道垂直位移
(k+偏移)*系数

计算旋转切线 旋转切线的定义如下所示:


我认为以上内容应该足以让您开始学习,如果缺少任何内容,请仔细阅读,并在中查看相应的实现。祝你好运

我认为这不完全是一个编程问题,对吗?@ShivanRaptor,我认为这是关于算法的,所以它看起来不错。这太神奇了。非常感谢。真是太棒了,解释得很好
offsetH=offsetW = 0.5-8 = -7.5
currentTangent[ind] = ((j-7.5)*x1[ind] + (k-7.5)*x2[ind])/8
                    = x1 * (j-7.5)/8 + x2 * (k-7.5)/8.
/* rotation */
for(k=0;k<height;k++)
  for(j=0;j<width;j++) {
    currentTangent[ind] = ((k+offsetH)*x1[ind] - (j+offsetW)*x2[ind])*factor;
    ind++;
  }
// determine the tangents of the first image
calculateTangents(imageOne, tangents, numTangents, height, width, choice, background);

// find the orthonormal tangent subspace 
numTangentsRemaining = normalizeTangents(tangents, numTangents, height, width);

// determine the distance to the closest point in the subspace
dist=calculateDistance(imageOne, imageTwo, (const double **) tangents, numTangentsRemaining, height, width);