Вычислить расстояние от точки p до многомерного гауссова (M, V) - PullRequest
4 голосов
/ 16 декабря 2010

У меня есть многомерный гауссов со средним значением M и ковариационной матрицей V. Я хотел бы рассчитать расстояние от точки p до M, принимая во внимание V (я думаю, это расстояние в стандартных отклонениях p от M?).

Дифференциально, я забираю эллипс на одну сигма от M и хотел бы проверить, находится ли p внутри этого эллипса.

Ответы [ 3 ]

3 голосов
/ 16 декабря 2010

Если V является действительной ковариационной матрицей гауссиана, то она является симметричной положительно определенной и, следовательно, определяет действительное скалярное произведение. Кстати inv(V) тоже делает.

Следовательно, предполагая, что M и p - векторы столбцов, вы можете определить расстояния как:

d1 = sqrt((M-p)'*V*(M-p));
d2 = sqrt((M-p)'*inv(V)*(M-p));

Matlab, который можно переписать d2 как (возможно, некоторые ненужные скобки):

d2 = sqrt((M-p)'*(V\(M-p)));

Приятно то, что когда V - единичная матрица, тогда d1==d2 и это соответствует классическому евклидову расстоянию. Чтобы найти погоду, вы должны использовать d1 или d2, оставленное в качестве упражнения (извините, часть моей работы - преподавание). Напишите многомерную формулу Гаусса и сравните ее с одномерным случаем, поскольку многомерный случай является лишь частным случаем одномерного (или проведите некоторый численный эксперимент).

NB. В очень многомерных пространствах или для очень большого количества точек для проверки вы можете найти более умный / быстрый путь из собственных векторов и собственных значений V (т.е. главных осей эллипсоида и их соответствующей дисперсии).

Надеюсь, это поможет.

A.

2 голосов
/ 16 декабря 2010

Рассмотрим вычисление вероятности точки с учетом нормального распределения:

M = [1 -1];             %# mean vector
V = [.9 .4; .4 .3];     %# covariance matrix
p = [0.5 -1.5];         %# 2d-point
prob = mvnpdf(p,M,V);   %# probability P(p|mu,cov)

Функция MVNPDF предоставляется набором инструментов статистики

0 голосов
/ 16 декабря 2010

Может быть, я полностью выключен, но разве это не то же самое, что просто спросить о каждом измерении: я внутри сигмы?

ПСЕВДОКОД:

foreach(dimension d)
    (M(d) - sigma(d) < p(d) < M(d) + sigma(d)) ?

Потому что вы хотите знать, находится ли p внутри каждого измерения вашего гауссиана. На самом деле, это просто космическая проблема, и ваш гауссиан не должен иметь с этим ничего общего (за исключением M и сигмы, которые являются просто расстояниями).

В MATLAB вы можете попробовать что-то вроде:

all(M - sigma < p < M + sigma)

Может быть расстояние до этого места, где я не знаю функцию евклидова расстояния. Возможно dist работает:

dist(M, p)

Потому что М - это просто точка в пространстве, а также р. Всего 2 вектора. И теперь последний. Вы хотите узнать расстояние в виде сигмы:

% create a distance vector and divide it by sigma
M - p ./ sigma

Я думаю, что это поможет.

...