【问题标题】:Sampling parts of a vector from gaussian mixture model从高斯混合模型中采样向量的一部分
【发布时间】:2014-10-18 17:10:18
【问题描述】:

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

具体来说:

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

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

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

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

【问题讨论】:

  • Stackoverflow 主要是一个编程站点。您可以尝试在stats.stackexchange.com 获取您的算法,如果您需要编程帮助,请返回这里。
  • 我同意移动它

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


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    我相信这个问题相当于一个条件概率问题。 对于初学者,我将使用写得不好的代码来实现 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: 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
    

    【讨论】:

      猜你喜欢
      • 2019-08-03
      • 2018-06-10
      • 2021-09-30
      • 2020-10-07
      • 2020-05-06
      • 2014-10-08
      • 2023-03-24
      • 2014-01-09
      • 2012-05-08
      相关资源
      最近更新 更多