聚类多元正态分布
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
现在您可以为此指标设置阈值并对您的分布进行分组。
希望这会有所帮助!
【讨论】:
以上是关于聚类多元正态分布的主要内容,如果未能解决你的问题,请参考以下文章