Выбор точек в наборе данных, принадлежащих многомерному распределению Гаусса

У меня есть набор значений D:

 [[  6.83822474   3.54843586]
 [ 12.45778114   4.42755159]
 [ 10.27710359   9.47337879]
 ..., 
 [ 46.55259568  64.73755611]
 [ 51.50842754  44.60132979]   

Учитывая многомерное распределение Гаусса со средним значением M и ковариацией V:

  1. Каков эквивалентный многомерный случай, когда одномерная точка находится в пределах двух стандартных отклонений от среднего? т. е. предполагая, что у меня есть одномерное распределение со средним значением A и стандартным значением B, я могу сказать, что точка x_i находится в пределах 2 стандартных отклонений от среднего значения, если x_i - A ‹ B. Что будет эквивалентно этому в многомерном случае?
  2. Как бы я вычислил все точки в D, которые находятся в пределах 2 стандартных (или эквивалентных в многомерном случае) от среднего M?

person Abdel Wahab Turkmani    schedule 09.07.2017    source источник


Ответы (2)


Похоже, что нужное вам обобщение — это расстояние Махаланобиса. Расстояние Махаланобиса, равное 1, от среднего является обобщением одного стандартного отклонения от среднего одномерного гауссова.

Вы можете вычислить расстояние Махаланобиса, используя функции модуля scipy.spatial.distance. (Почти наверняка есть код для этого расстояния в той или иной форме в scikit-learn и, возможно, в statsmodels, но я не проверял.)

Для расчета одного расстояния существует scipy.spatial.distance.mahalanobis< /a>, а для вычисления расстояний между наборами точек можно использовать pdist и cdist соответственно (тоже от scipy.spatial.distance).

Вот скрипт, который использует cdist. На графике точки, обведенные красным, находятся в пределах расстояния Махаланобиса, равного 2, от среднего значения.

import numpy as np
import matplotlib.pyplot as plt
from scipy.spatial.distance import cdist


# Mean
M = [10, 7]

# Covariance matrix
V = np.array([[ 9, -2],
              [-2,  2]])

# Generate a sample from the multivariate normal distribution
# with mean M and covariance matrix V.
np.random.seed(314159)
x = np.random.multivariate_normal(M, V, size=250)

# Compute the Mahalanobis distance of each point in the sample.
mdist = cdist(x, [M], metric='mahalanobis', V=V)[:,0]

# Find where the Mahalanobis distance is less than 2.
d2_mask = mdist < 2  
x2 = x[d2_mask]

plt.plot(x2[:,0], x2[:,1], 'o',
         markeredgecolor='r', markerfacecolor='w', markersize=6, alpha=0.6)
plt.plot(x[:,0], x[:,1], 'k.', markersize=5, alpha=0.5)
plt.grid(alpha=0.3)
plt.axis('equal')
plt.show()

сюжет

person Warren Weckesser    schedule 09.07.2017

Правильным способом определения расстояния для многомерного случая является расстояние Махаланобиса, т.е.

Примером этого может быть:

import numpy as np

vals = np.array([[  6.83822474,   3.54843586],
                 [ 12.45778114,   4.42755159],
                 [ 10.27710359,   9.47337879],
                 [ 46.55259568,  64.73755611],
                 [ 51.50842754,  44.60132979]])

# Compute covariance matrix and its inverse
cov = np.cov(vals.T)
cov_inverse = np.linalg.inv(cov)

# Mean center the values
mean = np.mean(vals, axis=0)
centered_vals = vals - mean

# Compute Mahalanobis distance
dist = np.sqrt(np.sum(centered_vals * cov_inverse.dot(centered_vals.T).T, axis=1))

# Find points that are "far away" from the mean
indices = dist > 2
person Jonas Adler    schedule 09.07.2017
comment
Вопрос был задан около 2 часов назад, и ваш ответ появился всего за секунды до того, как я нажал кнопку отправки своего. Иди разберись. В любом случае, +1. - person Warren Weckesser; 09.07.2017
comment
Но ваш лучше, поэтому я тоже голосую за него :) - person Jonas Adler; 09.07.2017