2017-01-25 9 views
2

Я пытаюсь создать 3D-распределение, где x, y представляет плоскость поверхности, а z - величина некоторого значения, распределенная по диапазону.Генерация трехмерных гауссовских данных

Я смотрю numpy's multivariate_normal, но это только позволяет мне получить несколько образцов. Мне хотелось бы указать координату x, y и вернуть значение z; поэтому я мог бы запросить gp(x, y) и вернуть значение z, которое придерживается некоторой средней и ковариации.

Возможно, более иллюстративный (игрушечный) пример: предположим, что у меня есть распределение температуры, которое можно смоделировать как гауссовский процесс. Таким образом, я мог бы иметь среднюю температуру 20 при (0, 0) и некоторую ковариацию [[1, 0], [0, 1]]. Я хотел бы иметь возможность создать модель, которую я могу запросить в разных местах x, y, чтобы получить температуру в этом положении (так, на (5, 5) я мог бы получить что-то вроде 7 градусов).

Как это сделать?

+1

так что вы хотите, чтобы функция плотности вероятности вместо образцов? –

ответ

0

Вы можете создать многомерную норму, используя scipy.stats.multivariate_normal.

>>> import scipy.stats 
>>> dist = scipy.stats.multivariate_normal(mean=[2,3], cov=[[1,0], 
                  [0,1]]) 

Тогда найти p(x,y) вы можете использовать pdf

>>> dist.pdf([2,3]) 
0.15915494309189535 
>>> dist.pdf([1,1]) 
0.013064233284684921 

, который представляет собой вероятность (что вы под названием z) получая любой [x,y]

+0

Итак, это, вероятно, недостаток понимания с моей стороны: PDF кажется похожим на то, что я ищу, но вместо вероятности 0-1 x, y, я бы хотел, чтобы какой-то гауссовый кривоподобный функцию/поверхность, которую я могу попробовать, чтобы получить фактические точки данных. – Teknophilia

1

Я предполагаю, что ваши данные могут быть скопированы в один np.array, которые я буду ссылаться как X в моем коде, с формой X.shape = (n,2), где n является количеством точек данных, у вас есть и вы можете иметь n = 1, если вы хотите протестировать одну точку за раз. 2, конечно, относится к двумерному пространству, охватываемому вашими координатами (x и y). Тогда:

def estimate_gaussian(X): 
    return X.mean(axis=0), np.cov(X.T) 

def mva_gaussian(X, mu, sigma2): 
    k = len(mu) 
    # check if sigma2 is a vector and, if yes, use as the diagonal of the covariance matrix 
    if sigma2.ndim == 1 : 
    sigma2 = np.diag(sigma2) 
    X = X - mu 
    return (2 * np.pi)**(-k/2) * np.linalg.det(sigma2)**(-0.5) * \ 
    np.exp(-0.5 * np.sum(np.multiply(X.dot(np.linalg.inv(sigma2)), X), axis=1)).reshape((X.shape[0], 1)) 

будет делать то, что вы хотите - то есть данные точек данных вы получите значение гауссовой функции в этих точках (или в одной точке). Это на самом деле обобщенная версия того, что вам нужно, поскольку эта функция может описывать многомерный гауссовый. Вас, кажется, интересует корпус k = 2 и диагональная ковариационная матрица sigma2.

Кроме того, это также распределение вероятности, которое, как вы говорите, вы не хотите. У нас недостаточно информации, чтобы узнать, к чему именно вы пытаетесь соответствовать (т. Е. Что вы ожидаете от трех параметров гауссовой функции). Обычно люди заинтересованы в нормальном распределении). Тем не менее, вы можете просто изменить параметры в операторе return функции mva_gaussian в соответствии с вашими потребностями и проигнорировать функцию estimate gaussian, если вы не хотите нормализованного распределения (хотя нормализованная функция все равно даст вам то, что вы ищете) - реальная оценка температура - пока вы знаете процесс нормализации - что вы делаете :-)).

+1

Я отредактировал свой ответ, чтобы он соответствовал вашим потребностям. Хотя невозможно понять, к чему вы пытаетесь поместиться - вот почему я написал нормированную функцию распределения. Но теперь вы можете изменить параметры в функции в соответствии с вашим распределением температуры. – id5h

 Смежные вопросы

  • Нет связанных вопросов^_^