не могу понять формулу центроида и расстояния в этом коде - PullRequest
0 голосов
/ 04 мая 2019

Я изо всех сил пытаюсь понять процесс нормализации алгоритма из 8 пунктов. Я имею в виду этот код в MATLAB , который я не могу запустить, так как у меня нет matlab.

function Nmatrix = getNormMat2d(x)

Nmatrix - the normalization matrix
%       x - input data, dim: 3xN

% Get the centroid
centroid = mean(x, 2);
% Compute the distance to the centroid
dist = sqrt(sum((x - repmat(centroid, 1, size(x, 2))) .^ 2, 1));
% Get the mean distance
mean_dist = mean(dist);
% Craft normalization matrix
Nmatrix = [sqrt(2) / mean_dist, 0, -sqrt(2) / mean_dist * centroid(1);...
           0, sqrt(2) / mean_dist, -sqrt(2) / mean_dist * centroid(2);...
           0, 0, 1];

end

Я пытаюсь закодировать это на Python. Но я не понимаю нескольких вещей:

Разве центроиды не должны быть такими:

#dummy points 
x1 = np.array([20, 30, 40, 50, 60, 30, 20, 40])
y1 =  np.array([12, 34, 56, 78, 89, 45, 90, 29])
# did the following to give it the shape the matlab function expects
first=np.stack((x1,y1),axis = 1) 
ones=np.ones((8,1))
first = np.concatenate((first,ones),axis = 1)
p1 = np.ndarray.transpose(first)
#centroid
centroid_x = np.mean(p1[0,:])
centroid_y = np.mean(p1[1,:])

Я не понимаю, почему они использовали centroid = mean(x, 2);. Кроме того, линия dist = sqrt(sum((x - repmat(centroid, 1, size(x, 2))) .^ 2, 1)); не очень хорошо в моей голове.

Пожалуйста, помогите мне понять это

Об алгоритме:

Нам нужно получить матрицу преобразования (перемещение и масштабирование), чтобы новая система координат имела свое начало в центроиде, а после перевода координаты масштабировались равномерно, так что среднее расстояние от начала координат до точки равно $ SQRT (2) $

1 Ответ

2 голосов
/ 05 мая 2019

Хорошо, давайте пройдемся по этому

centroid = mean(x, 2);

принимает среднее значение по строкам, поэтому x - это 3 строки и N столбцов. Это означает, что centroid является вектором 3x1 [xC ; yC ; zC]

dist = sqrt(sum((x - repmat(centroid, 1, size(x, 2))) .^ 2, 1));

Давайте пройдем это снаружи внутрь

repmat(centroid, 1, size(x, 2))

создает матрицу с N копиями centroid. Тогда - берет разницу между точкой и центроидом, давая матрицу 3xN. .^2 просто возводит в квадрат каждый из элементов матрицы 3xN. sum( ... , 1 ) добавляется вдоль строки (то есть, добавляя x-, y- и z-компоненты вместе). Тогда sqrt принимает квадратный корень.

Итак, ваш пример на python через код Matlab

x1 = [20, 30, 40, 50, 60, 30, 20, 40];
y1 = [12, 34, 56, 78, 89, 45, 90, 29];
x = [ x1 ; y1 ];
centroid = mean(x, 2);
dist = sqrt(sum((x - repmat(centroid, 1, size(x, 2))) .^ 2, 1));
dist'

ans =

      45.1506159980127
      21.0731612483747
      4.19262745781211
      27.5513724703507
      42.1939346944558
      11.0602045641118
      39.3837291911266
      25.4033093316599

И эквивалентный питон

x1 = np.array([20, 30, 40, 50, 60, 30, 20, 40])
y1 =  np.array([12, 34, 56, 78, 89, 45, 90, 29])
x = np.column_stack((x1,y1))
centroid = np.mean( np.transpose( x ) )
dist = [ np.sqrt( np.sum( np.square( v - centroid ) ) ) for v in x ]
dist
[45.1506159980127, 21.073161248374674, 4.192627457812105, 27.551372470350728, 42.19393469445579, 11.060204564111823, 39.38372919112663, 25.40330933165992]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...