多变量正态分布的聚类分析

问题描述 投票:1回答:1

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

一开始我尝试使用K-Means聚类。正如你可以从下图中看到的,我已经画出了分布(在两个选择的维度上以椭圆的形式)。我把这个通过sklearn KMeans。同样颜色的被认为是相同的包。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))

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

最后,我想确定哪些多变量正态分布是足够接近的,这样我就有可能合并它们,并摆脱多余的。

python scikit-learn scipy statistics k-means
1个回答
0
投票

你可以使用 KL分歧 损失,用于比较两个概率分布之间的相似性。请按照下面的例子了解更多信息。

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

现在你可以为这个度量设置一个阈值,并对你的分布进行分组。

希望这能帮到你

© www.soinside.com 2019 - 2024. All rights reserved.