聚类多元正态分布

2024-10-04 07:31:38 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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

我还使用了Bhattarcharya距离,并在查看维基百科页面时编写了以下代码

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))

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

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


Tags: term1方法distnp集群sigmameansdet
1条回答
网友
1楼 · 发布于 2024-10-04 07:31:38

您可以使用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

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

希望这有帮助

相关问题 更多 >