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