从高斯混合模型中采样向量的一部分
我想从一个高斯混合模型中,只抽取一些特定的元素,这个模型是通过它们的均值和协方差矩阵来定义的。
具体来说:
我在用高斯混合模型(GMM)来填补数据。我的步骤是这样的,使用的是sklearn库:
- 用均值来填补数据
- 用GMM获取均值和协方差(比如说5个成分)
- 从中选一个样本,只抽取缺失的值,其他的值保持不变。
- 重复几次这个过程
我看到有两个问题。(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上的其他答案:
gcov = covs[chosen_gaussian_index]
gmean = means[chosen_gaussian_index]
#TODO --> use the linked answer to sample a single gaussian conditionally
1
因为在取样时,只有分布的相对比例是重要的,所以前面的缩放可以忽略掉。对于对角协方差矩阵,我们只需要使用缺失数据的协方差和均值向量。对于包含非对角元素的协方差矩阵,我们需要调整采样高斯分布的均值和标准差。