从高斯混合模型中采样向量的一部分

1 投票
2 回答
1275 浏览
提问于 2025-04-28 07:13

我想从一个高斯混合模型中,只抽取一些特定的元素,这个模型是通过它们的均值和协方差矩阵来定义的。

具体来说:

我在用高斯混合模型(GMM)来填补数据。我的步骤是这样的,使用的是sklearn库:

  1. 用均值来填补数据
  2. 用GMM获取均值和协方差(比如说5个成分)
  3. 从中选一个样本,只抽取缺失的值,其他的值保持不变。
  4. 重复几次这个过程

我看到有两个问题。(A)我该如何从高斯的总和中抽样,(B)我该如何只抽取向量的一部分。我想这两个问题可以同时解决。对于(A),我可以用拒绝抽样或逆变换抽样,但我觉得用numpy中的多元正态分布生成器会有更好的方法。或者,使用其他有效的方法。对于(B),我只需要把抽样的变量乘以一个已知值的高斯分布作为参数。对吧?

我更希望能有一个Python的解决方案,但算法或伪代码也可以。

暂无标签

2 个回答

0

我觉得这个问题其实是关于条件概率的。首先,我会用一些写得不太好的代码来展示一个sklearn的实现。

我假设你已经有了一个从数据集中得到的sklearn高斯混合模型,或者说是“填补”的模型。下面的代码块会展示如何从数据集中创建一个模型:

import numpy
import sklearn
import sklearn.mixture

GaussianMixtureObjectSklearn = sklearn.mixture.GaussianMixture(
                n_components    = NumberComponents, 
                covariance_type = 'full',
                )
GaussianMixtureObjectSklearn.fit(NumpyTwoDimensionalDataset)

如果你想要得到一个概率值,你可以这样做:

#Turn the model object into a single function
def GaussianMixtureModelFunction( Point ):
    return numpy.exp( GaussianMixtureObjectSklearn.score_samples( numpy.atleast_2d( Point ) ) )
    #return clf.score( numpy.atleast_2d( Point ) )

为了使用完整的高斯混合模型(GMM)生成样本,我们可以使用内置的方法:

samples = GaussianMixtureModelFunction.sample( 1000 )

但实际上,我们想要生成一个条件样本,也就是说固定“点”的某些元素,让其他元素可以变化。sklearn的原生方法不适合这个需求。最简单的解决办法是从GMM中提取出权重、均值和协方差:

weights = GaussianMixtureObjectSklearn.weights_ 
means = GaussianMixtureObjectSklearn.means_     
covs = GaussianMixtureObjectSklearn.covariances_   

首先,使用权重来选择一个高斯分布:

chosen_gaussian_index = np.random.choice(len(weights), 1, p=weights)

然后,通过维度条件地对所选的高斯分布进行采样,可以参考这个Stack Overflow上的其他答案:

Python/Numpy: 从多元分布进行条件模拟

gcov = covs[chosen_gaussian_index]
gmean = means[chosen_gaussian_index]

#TODO --> use the linked answer to sample a single gaussian conditionally
1

因为在取样时,只有分布的相对比例是重要的,所以前面的缩放可以忽略掉。对于对角协方差矩阵,我们只需要使用缺失数据的协方差和均值向量。对于包含非对角元素的协方差矩阵,我们需要调整采样高斯分布的均值和标准差。

撰写回答