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

时间:2014-10-18 17:10:19

标签: python numpy random-sample normal-distribution mixture-model

我想从一个高斯的总和中采样一个矢量的一些元素,这些元素由它们的均值和协方差矩阵给出。

具体做法是:

我使用高斯混合模型(GMM)来输入数据。我正在使用以下程序和sklearn:

  1. 用平均值
  2. 来估算
  3. 获取与GMM的手段和协方差(例如5个组件)
  4. 取一个样本并仅对缺失值进行采样。其他值保持不变。
  5. 重复几次
  6. 我看到有两个问题。 (A)我如何从高斯的总和中采样,(B)我如何仅采样部分矢量。我认为两者都可以同时解决。对于(A),我可以使用拒绝采样或逆变换采样,但我觉得有更好的方法在numpy中使用多元正态分布生成器。或者,一些其他有效的方法。对于(B),我只需要将采样变量乘以具有样本中已知值的高斯作为参数。正确?

    我更喜欢python中的解决方案,但算法或伪代码就足够了。

2 个答案:

答案 0 :(得分:1)

由于仅对采样事项的相对比例进行采样,因此缩小前言或可以丢弃。对于对角协方差矩阵,可以使用协方差潜艇和平均具有缺失数据维度的子向量。对于非对角线元素的协方差,需要改变采样高斯的均值和标准差。

答案 1 :(得分: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中的本机方法对此不起作用。最简单的解决方案是取而代之的是权重,均值,covs从GMM:

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

首先使用权重选择高斯:

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

,然后使用此处的其他堆栈溢出答案按维度有条件地对选定的高斯采样:

Python/Numpy: Conditional simulation from a multivatiate distribution

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

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