Расстояние между гиперплоскостями
Я пытаюсь научить себя некоторому машинному обучению и использую базу данных MNIST (http://yann.lecun.com/exdb/mnist/) Сделайте так. Автор этого сайта написал статью в 98 году о различных методах распознавания почерка, доступных по адресу http://yann.lecun.com/exdb/publis/pdf/lecun-98.pdf.
упомянутый 10-й метод является "классификатором касательных расстояний". Идея в том, что если вы поместите каждое изображение в (НХМ)-мерных векторное пространство, вы можете вычислить расстояние между двумя изображениями как расстояние между гиперплоскости, образованной каждого, где гиперплоскость задается принимаете точку, и поворот изображения, масштабирование изображения, преобразование изображения и т. д.
Я не могу понять достаточно, чтобы восполнить недостающие детали. Я понимаю, что большинство из них действительно являются линейными операторами, так как же использовать этот факт для создания гиперплоскости? И если у нас есть гиперплоскость, как мы можем взять ее расстояние? с другими гиперплоскостями?
1 ответов
я дам вам несколько подсказок. Вам нужны базовые знания в обработке изображений. Пожалуйста, обратитесь к 2,3 для сведения.
-
2 это
c
реализация тангенциальной составляющей - 3 это документ, который описывает касательное расстояние более подробно
Свертка Изображения
по данным 3, первый шаг вам нужно сделать, это сгладьте картинку. Ниже мы покажем результат 3 различных плавных операций (проверьте раздел 4 из 3) (левый столбец показывает изображения результата, правый столбец показывает исходные изображения и операторы свертки). Этот шаг заключается в отображении дискретного вектора на непрерывный, чтобы он был дифференцируемым. Автор предлагает использовать функцию Гаусса. Если вам нужно больше фона о свертке изображения,здесь пример.
после выполнения этого шага вы рассчитали горизонтальный и вертикальный сдвиг:
Вычисление Тангенса Масштабирования
здесь я покажу вам один из касательных вычислений, реализованных в 2 - масштабирование касательной. От 3, мы знаем, что преобразование, как показано ниже:
/* 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++;
}
в начале td.c
in 2реализация, мы знаем следующее определение:
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. Так мы знаем!--28-->
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 включительно (ширина и высота изображения 16 пикселей), (j-7.5)/8
это всего лишь дробное число между -0.9375
to 0.9375
.
так что я думаю (j+offsetW)*factor
- смещение для каждого пикселя, пропорциональное горизонтальному расстоянию от пикселя до центра изображения. Точно так же вы знаете вертикальное смещение (k+offsetH)*factor
.
Расчет Тангенса Вращения
тангенс вращения определен как ниже в 3:
/* 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++;
}
С помощью вывод из предыдущего, мы знаем!--17--> соответствует y
. Аналогично - (j+offsetW)*factor
соответствует -x
. Таким образом, вы знаете, что это именно формула, используемая в 3.
вы можете найти все другие касательные, описанные в 3 реализовала в 2. Мне нравится изображение ниже от 3, который ясно показывает влияние смещений различные касательные преобразования.
расчет касательного расстояния между изображениями
просто следуйте реализации в 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. Удачи!