Расстояние Махаланобиса в Matlab

Я пытаюсь найти расстояние Махаланобиса некоторых точек от начала координат. Команда MATLAB для этого — mahal (Y, X)

Но если я использую это, я получаю NaN как матрицу X = 0, так как расстояние нужно найти от начала координат. Может кто-нибудь, пожалуйста, помогите мне с этим. Как это сделать?


person SB26    schedule 16.04.2012    source источник
comment
Пожалуйста, покажите входные данные для команды mahal.   -  person PearsonArtPhoto    schedule 17.04.2012
comment
Входные данные для команды mahal представляют собой матрицу Y 407000 * 3 и матрицу X, которая должна быть исходной, и, поскольку MATLAB требует, чтобы X имел больше строк, чем столбцов, это матрица нулей 4 * 3.   -  person SB26    schedule 17.04.2012


Ответы (1)


Я думаю, вы немного запутались в том, что делает mahal(). Во-первых, для вычисления расстояния Махаланобиса требуется совокупность точек, по которым будет рассчитываться ковариация.

В документах Matlab для этой функции ясно указано, что расстояние вычислено:

d(I) = (Y(I,:)-mu)*inv(SIGMA)*(Y(I,:)-mu)'

где mu — среднее значение совокупности X, а SIGMA — ковариационная матрица совокупности X. Поскольку ваша популяция состоит из одной точки (происхождения), она не имеет ковариации, поэтому матрица SIGMA необратима, отсюда и ошибка, когда вы получаете значения NaN/Inf на расстояниях.

Если вы знаете структуру ковариации, которую хотите использовать для расстояния Махаланобиса, вы можете просто использовать приведенную выше формулу, чтобы вычислить ее самостоятельно. Предположим, что интересующая вас ковариация хранится в матрице S. Вы хотите, чтобы расстояние w.r.t. источник, поэтому вам не нужно ничего вычитать из значений в Y, все, что вам нужно вычислить, это:

for ii = 1:size(Y,1)
    d(ii) = Y(ii,:)*inv(S)*Y(ii,:)'; % Where Y(ii,:) is assumed to be a row vector.'
end
person ely    schedule 16.04.2012
comment
Да, в этом проблема. В документации говорится, что Y — это набор точек, из которых вы хотите рассчитать расстояние, а мю и сигма — это выборочное среднее значение и ковариация. Поскольку я выполняю PCA, среднее значение равно нулю, поскольку я работаю в пространство PCA. Мне нужно расстояние каждой точки от нового начала координат. Тогда как мне это сделать - person SB26; 17.04.2012
comment
Вам нужно рассчитать ковариацию ваших новых точек в пространстве PCA. Расстояние Махаланобиса в первую очередь требует ковариации. Должен быть какой-то набор точек, а затем вы преобразовали их с помощью проекции с помощью PCA, и теперь у этих проецируемых точек есть новое среднее значение и ковариация. Если вы поместите все эти точки в матрицу X, тогда ваш исходный код будет работать для вычисления расстояния от нового среднего значения. В противном случае, если новое среднее значение теоретически должно быть равно нулю, просто вычислите ковариацию спроецированных точек самостоятельно и используйте формулу для расчета расстояния. - person ely; 17.04.2012
comment
Что ж, я попытался использовать приведенную выше формулу. Мой Y представляет собой матрицу 40700 * 3, где каждая строка имеет 3 столбца, поскольку это изображение RGB, и каждая строка соответствует одному пикселю. Ковариационная матрица представляет собой матрицу 3 * 3. Таким образом, приведенная выше формула дает мне матрица 3 * 3. Но не должен ли я получить матрицу 40700 * 1, если я хочу найти расстояние от каждой точки. Вот почему я чувствую, что где-то ошибаюсь - person SB26; 17.04.2012
comment
В этом случае, если вы выполняете операцию векторно, вы вычисляете попарные расстояния между всеми точками. Вместо этого вы должны выполнить цикл for и на каждой итерации применять формулу только к одной точке данных. Тогда это будет 1 на 3, умноженное на 3 на 3, умноженное на 3 на 1, чтобы дать вам квадрат расстояния 1 на 1 для этой точки. Повторите для всех точек в Y. Если вы выполните приведенный выше код, вместо этого вы вычислите что-то другое. Я отредактирую свой код выше. - person ely; 17.04.2012