我只想从通过其均值和协方差矩阵给出的高斯和中采样向量的某些元素。
特定:
我正在使用高斯混合模型(GMM)估算数据。我正在使用以下步骤和sklearn:
我看到了两个问题。 (A)如何从高斯和中采样,(B)如何仅对向量的一部分采样。我认为两者可以同时解决。对于(A),我可以使用拒绝采样或逆变换采样,但是我觉得在numpy中使用多元正态分布生成器有更好的方法。或者,其他有效的方法。对于(B),我只需要将采样变量乘以具有已知样本值作为参数的高斯。对吧?
我更喜欢用python解决方案,但是算法或伪代码就足够了。
由于仅对分布的相对比例进行采样,所以可以删除缩放序言或。对于对角协方差矩阵,可以只使用协方差潜艇和均值子向量,该向量具有丢失数据的维数。对于与非对角线元素的协方差,将需要更改采样高斯的均值和标准差。
我相信这个问题相当于一个条件概率问题。首先,我将使用写得不好的代码制作一个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