В этом примере показано, как использовать анализ Procrustes для сравнения двух написанных от руки трех чисел. Визуально и аналитически исследуйте эффекты изменения размера и отражения.
Введите данные ориентира для двух рукописных числовых троек.
A = [11 39;17 42;25 42;25 40;23 36;19 35;30 34;35 29;... 30 20;18 19]; B = [15 31;20 37;30 40;29 35;25 29;29 31;31 31;35 20;... 29 10;25 18];
Создать X и Y от A и B , перемещение B в сторону, чтобы сделать каждую форму более видимой.
X = A; Y = B + repmat([25 0], 10,1);
Постройте график фигур, используя буквы для обозначения точек ориентира. Линии на рисунке соединяют точки для указания траектории рисования каждой фигуры.
plot(X(:,1), X(:,2),'r-', Y(:,1), Y(:,2),'b-'); text(X(:,1), X(:,2),('abcdefghij')') text(Y(:,1), Y(:,2),('abcdefghij')') legend('X = Target','Y = Comparison','location','SE') xlim([0 65]); ylim([0 55]);

Используйте анализ Procrustes, чтобы найти преобразование, которое минимизирует расстояния между точками данных ориентира.
[d,Z,tr] = procrustes(X,Y);
Выходы функции: d (стандартизированная мера разнородности), Z (матрица преобразованных ориентиров), и tr (структурный массив вычисленного преобразования с полями T , b , и c которые соответствуют уравнению преобразования).
Визуализация преобразованной формы, Z , используя пунктирную синюю линию.
plot(X(:,1), X(:,2),'r-', Y(:,1), Y(:,2),'b-',... Z(:,1),Z(:,2),'b:'); text(X(:,1), X(:,2),('abcdefghij')') text(Y(:,1), Y(:,2),('abcdefghij')') text(Z(:,1), Z(:,2),('abcdefghij')') legend('X = Target','Y = Comparison',... 'Z = Transformed','location','SW') xlim([0 65]); ylim([0 55]);

Используйте два различных числовых значения, измерение разнородности d и мера масштабирования b , чтобы оценить сходство целевой формы и преобразованной формы.
Мера разнородности d дает число от 0 до 1, описывающее разницу между целевой формой и преобразованной формой. Значения около 0 подразумевают более схожие формы, в то время как значения около 1 подразумевают разнородность.
d
d = 0.1502
Малое значение d в этом случае показано, что две формы одинаковы. procrustes вычисляет d путем сравнения суммы квадратичных отклонений между множеством точек с суммой квадратичных отклонений исходных точек от их столбчатых средств.
numerator = sum(sum((X-Z).^2))
numerator = 166.5321
denominator = sum(sum(bsxfun(@minus,X,mean(X)).^2))
denominator = 1.1085e+03
ratio = numerator/denominator
ratio = 0.1502
Результирующая мера d не зависит от масштаба размеров фигур и учитывает только сходство знаковых данных.
Проверьте сходство размеров форм.
tr.b
ans = 0.9291
Размеры целевых фигур и фигур сравнения на предыдущем рисунке похожи. Это визуальное впечатление усиливается значением b =% 0,93, что означает, что наилучшее преобразование приводит к уменьшению формы сравнения в 93 раза (только 7%).
Изучите эффекты ручной регулировки коэффициентов масштабирования и отражения.
Сила b равным 1 (установить 'Scaling' в ложный) для исследования величины разнородности по размеру цели и преобразованных фигур.
ds = procrustes(X,Y,'Scaling',false)ds = 0.1552
В этом случае настройка 'Scaling 'до false увеличивает вычисленное значение d только 0,0049, что дополнительно подтверждает сходство размера двух числовых троек. Более значительное увеличение d указал бы на большее расхождение в размерах.
В этом примере для выравнивания форм требуется только поворот, а не отражение. Это можно показать, наблюдая, что определитель матрицы T равен 1 в этом анализе.
det(tr.T)
ans = 1.0000
Если вам нужно отражение в преобразовании, определитель T равно -1. Вы можете форсировать отражение в преобразование следующим образом.
[dr,Zr,trr] = procrustes(X,Y,'Reflection',true);
drdr = 0.8130
Значение d резко увеличивается, указывая, что принудительное отражение приводит к плохому преобразованию точек ориентира. График преобразованной формы показывает аналогичный результат.
plot(X(:,1), X(:,2),'r-', Y(:,1), Y(:,2),'b-',... Zr(:,1),Zr(:,2),'b:'); text(X(:,1), X(:,2),('abcdefghij')') text(Y(:,1), Y(:,2),('abcdefghij')') text(Zr(:,1), Zr(:,2),('abcdefghij')') legend('X = Target','Y = Comparison',... 'Z = Transformed','Location','SW') xlim([0 65]); ylim([0 55]);

Основные точки данных теперь находятся дальше от их целевых аналогов. Преобразованная тройка теперь является нежелательным зеркальным отображением целевой тройки.
Кажется, что фигуры лучше сопоставить, если перевернуть преобразованную форму вверх дном. Однако изменение формы приведет к еще большему ухудшению преобразования, поскольку точки данных ориентира будут дальше от целевых аналогов. Из этого примера ясно, что ручная регулировка параметров масштабирования и отражения обычно не является оптимальной.