1

我只想从由它们的均值和协方差矩阵给出的高斯和中抽取向量的一些元素。

具体来说:

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

  1. 用平均值估算
  2. 使用 GMM 获取均值和协方差(例如 5 个分量)
  3. 取其中一个样本并仅对缺失值进行采样。其他值保持不变。
  4. 重复几次

我看到了两个问题。(A)如何从高斯总和中进行采样,(B)如何仅对向量的一部分进行采样。我认为两者都可以同时解决。对于(A),我可以使用拒绝采样或逆变换采样,但我觉得在 numpy 中使用多元正态分布生成器有更好的方法。或者,其他一些有效的方法。对于 (B),我只需要将采样变量乘以具有来自样本的已知值作为参数的高斯。正确的?

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

4

2 回答 2

1

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

于 2014-10-25T17:18:49.373 回答
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 中取回权重、均值和 covs:

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

首先使用权重选择高斯:

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

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

Python/Numpy:来自多变量分布的条件模拟

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

#TODO --> use the linked answer to sample a single gaussian conditionally
于 2020-06-14T00:56:33.667 回答