math - 超平面之间的距离

标签 math image-processing machine-learning classification image-recognition

我正在尝试自学一些机器学习,并且一直在使用 MNIST 数据库 ( http://yann.lecun.com/exdb/mnist/ ) 来做到这一点。该网站的作者在 98 年写了一篇关于所有不同类型的手写识别技术的论文,可在 http://yann.lecun.com/exdb/publis/pdf/lecun-98.pdf 获取。 .

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

我无法找出足够的信息来填补缺失的细节。我知道其中大多数确实是线性算子,那么如何利用这一事实来创建超平面呢?一旦我们有了一个超平面,我们如何确定它与其他超平面的距离?

最佳答案

我会给你一些提示。您需要一些图像处理方面的背景知识。请引用2 , 3了解详情。

  • 2是切线距离的 c 实现
  • 3是一篇更详细地描述切线距离的论文

图像卷积

根据3 ,你需要做的第一步就是平滑图片。下面我们展示了 3 种不同平滑操作的结果(查看 3 的第 4 节)(左列显示结果图像,右列显示原始图像和卷积运算符)。这一步是将离散向量映射到连续向量,使其可微。作者建议使用高斯函数。如果您需要更多有关图像卷积的背景知识,here就是一个例子。

enter image description here

完成这一步后,您就计算出了水平和垂直位移:

enter image description here enter image description here

计算缩放正切

在这里,我向您展示 2 中实现的正切计算之一- 缩放切线。来自 3 ,我们知道变换如下:

enter image description here

/* 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++;
  }

2td.c 的开头的实现,我们知道下面的定义:

factorW=((double)width*0.5);
offsetW=0.5-factorW;
factorW=1.0/factorW;

factorH=((double)height*0.5);
offsetH=0.5-factorH;
factorH=1.0/factorH;

factor=(factorH<factorW)?factorH:factorW; //min

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

factor=factorW=factorH=1/8, 

offsetH=offsetW = 0.5-8 = -7.5

另请注意我们已经计算了

  • 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 之间的整数(包括 0 和 15)(图像的宽度和高度均为 16 个像素),因此 (j -7.5)/8 只是 -0.93750.9375 之间的小数。

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

计算旋转正切

旋转切线的定义如下 3 :

enter image description here

/* 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++;
  }

根据前面的结论,我们知道(k+offsetH)*factor对应于y。类似地,- (j+offsetW)*factor 对应于-x。所以你知道这正是 3 中使用的公式.

您可以找到 3 中描述的所有其他切线实现于2 。我喜欢下面来自 3 的图片,清楚地显示了不同变换切线的位移效果。 enter image description here

计算图像之间的切线距离

只需按照tangentDistance函数中的实现即可:

// 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);

我认为以上内容应该足以让您入门,如果缺少任何内容,请阅读 3仔细看看 2 中相应的实现。祝你好运!

关于math - 超平面之间的距离,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13340353/

相关文章:

java - 如何将小数点后 10 到 5 的幂四舍五入

python - 将矩形图像调整为正方形,保持比例并用黑色填充背景

python - 矢量化照片 : Finding an Adapted Algorithm

python - 检查输入 : expected dense_input to have shape (21, 时出错)但得到形状为 (1,) 的数组

曲线的 "flattness"的数学指标?

c# - 计算 WPF 或 SVG 图形的坐标点

machine-learning - 复制原始数据是否有助于为构建模型提供更多数据?

javascript - 机器学习模型中的无效元素类型

javascript - 模运算符报告具有负值的不同结果

image - 在 MATLAB 中使用霍夫曼编码进行灰度图像压缩