Выборка частей вектора из модели гауссовой смеси

Я хочу выбрать только некоторые элементы вектора из суммы гауссиан, заданной их средствами и ковариационными матрицами.

Конкретно:

Я имплантирую данные, используя модель смеси Гаусса (GMM). Я использую следующую процедуру и sklearn:

  1. вменять среднее значение
  2. получить средства и ковариации с GMM (например 5 компонентов)
  3. возьмите один из образцов и выберите только недостающие значения. остальные значения остаются прежними.
  4. повторить несколько раз

Я вижу в этом две проблемы. (A) как мне сделать выборку из суммы гауссианов, (B) как выбрать только часть вектора. Я полагаю, что и то, и другое можно решить одновременно. Для (A) я могу использовать выборку отклонения или выборку с обратным преобразованием, но я чувствую, что есть лучший способ использовать многомерные генераторы нормального распределения в numpy. Или какой-нибудь другой действенный метод. Для (B) мне просто нужно умножить выбранную переменную на гауссианский, который имеет известные значения из выборки в качестве аргумента. Верно?

Я бы предпочел решение на Python, но алгоритма или псевдокода было бы достаточно.


person kirill_igum    schedule 18.10.2014    source источник
comment
Stackoverflow - это в первую очередь сайт программирования. Вы можете попробовать получить свой алгоритм на stats.stackexchange.com, а затем вернуться сюда, если вам потребуется помощь в его программировании.   -  person John1024    schedule 19.10.2014
comment
Я согласен переместить это   -  person kirill_igum    schedule 25.10.2014


Ответы (2)


Поскольку для выборки имеет значение только относительная пропорция распределения, масштабирование предисловия или может быть отброшено. Для диагональной ковариационной матрицы можно просто использовать подлодку ковариации и средний подвектор, имеющий размеры недостающих данных. Для ковариации с недиагональными элементами необходимо изменить среднее значение и стандартное отклонение выборочного гауссовского языка.

person kirill_igum    schedule 25.10.2014

Я считаю, что этот вопрос сводится к вопросу об условной вероятности. Для начала сделаю реализацию 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: условное моделирование из многомерного распределения

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

#TODO --> use the linked answer to sample a single gaussian conditionally
person D Adams    schedule 14.06.2020