聚类多元正态分布

Posted

技术标签:

【中文标题】聚类多元正态分布【英文标题】:Clustering multivariate normal distributions 【发布时间】:2020-09-25 06:36:14 【问题描述】:

我有 N 个多元正态分布。我想对它们进行聚类,以便删除冗余的(彼此足够接近的),或者通过增加它们的 sigma 来合并它们。有没有一种方法可以确定两个给定的正态分布是否足够接近(假设从它们中采样的 X% 的点将是相同的,其中 X 很大)。

起初我尝试使用 K-Means 聚类。从下图中可以看出,我已经绘制了分布(以两个选定维度的椭圆形式)。我通过 sklearn KMeans 传递了这个。相同颜色的包装被认为是相同的。

我还使用了 Bhattarcharya 距离和我在看到 wikipedia 页面时编写的以下代码。

def bhattacharya_distance(mu1, mu2, cov1, cov2):
    dist = mu1 - mu2
    sigma = (cov1 + cov2) / 2
    term1 = dist * np.linalg.inv(sigma) * dist.T
    term2 = np.log(np.linalg.det(sigma) / np.sqrt(np.linalg.det(cov1) * np.linalg.det(cov2))) / 2
    return np.exp(-np.linalg.det(term1 + term2))

它也无法识别不同的高斯(或者我做错了什么)。

最后,我想确定哪些多元正态分布足够接近,这样我就可以合并它们并去除多余的分布。

【问题讨论】:

嗨,@lokiysh 以下解决方案对您有用吗?如果是,请将其标记为已接受的答案,因为这可能会对将来可能访问此页面的其他人有所帮助。谢谢。 【参考方案1】:

您可以利用KL Divergence 损失来比较两个概率分布之间的相似性。请按照以下示例获取更多信息:

import numpy as np
import tensorflow as tf

kl = tf.keras.losses.KLDivergence()

#let's compute the KL divergence between two similar distributions
mean1 = [0, 0]
cov1 = [[1, 0], [0, 1]]  
mean2 = [1, 1]
cov2 = [[1, 0], [0, 1]]  
np.random.seed(10)
x = np.random.multivariate_normal(mean1, cov1, 10)
y = np.random.multivariate_normal(mean2, cov2, 10)
kl(x, y).numpy()
2.6799798011779785

#now let's compute the same for two distributions that are far away
mean1 = [0, 0]
cov1 = [[1, 0], [0, 1]]  
mean2 = [5, 5]
cov2 = [[1, 0], [0, 1]]  
np.random.seed(10)
x = np.random.multivariate_normal(mean1, cov1, 10)
y = np.random.multivariate_normal(mean2, cov2, 10)
kl(x, y).numpy()
-0.24824540317058563

现在您可以为此指标设置阈值并对您的分布进行分组。

希望这会有所帮助!

【讨论】:

以上是关于聚类多元正态分布的主要内容,如果未能解决你的问题,请参考以下文章

在 k-means 和层次聚类中使用表的混淆矩阵

多元统计分析05:多元正态分布的假设检验

multivariate_normal 多元正态分布

随机过程8 - 多元高斯分布及其线性性质

随机过程8 - 多元高斯分布及其线性性质

随机过程8 - 多元高斯分布及其线性性质