如何获取GMM聚类的未归一化责任?
我用sklearn训练了一个高斯混合模型,现在想根据聚类的均值和方差,得到某个数据点的未归一化责任值。
可惜的是,GMM.predict_proba
返回的是归一化的概率,这些概率加起来等于1,但我需要的是原始的概率。
我尝试了以下方法(GMM是我训练好的高斯模型):
import numpy as np
from sklearn import mixture
lpr = (mixture.log_multivariate_normal_density(X, GMM.means_, GMM.covars_, GMM.covariance_type) + np.log(GMM.weights_))
probs = np.exp(lpr)
但是我得到的概率大于1。
我哪里出错了呢?
1 个回答
0
lpr
是高斯成分的对数概率。要把它转换成高斯混合模型(GMM)的概率,需要在对数空间中进行求和。下面的代码会对此进行解释。
from sklearn.utils.extmath import logsumexp
lpr = (mixture.log_multivariate_normal_density(X, GMM.means_, GMM.covars_, GMM.covariance_type) + np.log(GMM.weights_)) # probabilities of components
logprob = logsumexp(lpr, axis=1) # logsum to get probability of GMM
probs = np.exp(logprob) # 0 < probs < 1