使用scikit的GMM计算对数正态分布AIC、BIC取值不可比问题求解
错误原因分析
- 输入数据域不匹配:你训练
log_gmm时输入的是对数变换后的np.log(data),模型拟合的是对数域数据的高斯分布,但计算AIC/BIC时直接传入了原始data。模型会基于对数域的高斯参数直接计算原始大数值的概率,得到的似然值几乎为0,取对数后为绝对值极大的负数,而AIC的计算公式为-2*对数似然 + 2*参数个数,因此会得到离谱的极大正值,这是你看到数值差距过大的直接原因。 - 未做变量变换的雅可比修正:就算你计算AIC时传入对数变换后的数据,得到的结果也不能直接和原始域拟合的高斯模型AIC对比。AIC的计算基准是原始数据的边缘似然,对数据做取对数这类非线性变换后,分布的概率密度需要乘以变换的雅可比行列式,对数似然也需要加上对应的修正项,否则两个模型的似然计算基准完全不同,没有可比性。
对数正态模型AIC/BIC的正确计算方法
你可以选择任意一种方案完成计算:
- 方案1:手动计算对数正态分布的似然
你拟合得到的log_gmm.means_[0][0]就是对数正态分布的μ参数,log_gmm.covariances_[0][0][0]就是σ²参数。原始数据每个样本的对数密度公式为:
把所有样本的对数密度求和得到总对数似然,再按公式计算:ln(1/(x*σ*np.sqrt(2*np.pi))) - (np.log(x) - μ)**2/(2*σ**2)
AIC = -2 * 总对数似然 + 2 * 2 (对数正态共有2个参数,所以乘以2)
BIC = -2 * 总对数似然 + np.log(numValues) * 2 - 方案2:复用GMM的aic方法并补修正项
先调用log_gmm.aic(np.expand_dims(np.log(data),1))得到对数域的AIC,再加上2 * np.sum(np.log(data)),修正后的结果即可和原始域高斯模型的AIC直接对比。
内容的提问来源于stack exchange,提问作者darthV
相关产品推荐
相关产品推荐

