Skip to main content
 首页 » 编程设计

python之选择数据集中属于多元高斯分布的点

2025年05月04日16sxdcgaq8080

我有一组值 D:

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

给定一个具有均值 M 和协方差 V 的多元高斯分布:

  1. 在均值的 2 个标准差范围内的单变量点的等效多变量情况是什么?即假设我有一个均值 A 和标准差 B 的单变量分布,如果 x_i - A < B,我可以说点 x_i 在均值的 2 个标准差范围内。在多变量情况下,这相当于什么?
  2. 我如何根据均值 M 计算 D 中 2 个标准差(或多元情况下的等效值)内的所有点?

请您参考如下方法:

听起来您想要的概括是 Mahalanobis distance .距均值 1 的马氏距离是距单变量高斯均值一个标准差的推广。

您可以使用模块 scipy.spatial.distance 中的函数计算马氏距离。 (几乎可以肯定在 scikit-learn 中有某种形式的这个距离的代码,可能还有 statsmodels,但我没有检查过。)

为了计算单个距离,有scipy.spatial.distance.mahalanobis ,以及计算点集合之间的距离,您可以使用 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]]) 
VI = np.linalg.inv(V) 
 
# Generate a sample from the multivariate normal distribution 
# with mean M and covariance matrix V. 
rng = np.random.default_rng() 
x = rng.multivariate_normal(M, V, size=250) 
 
# Compute the Mahalanobis distance of each point in the sample. 
mdist = cdist(x, [M], metric='mahalanobis', VI=VI)[:,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()