2016-01-07 2 views
0

Я пытаюсь позвонить scipy.stats.multivariate_normal с четырьмя различными параметрами для му и сигмы. И тогда для каждой генерируемой функции плотности вероятности мне нужно называть это pdf на массив, скажем, 10 значений.Как вызвать функцию с параметрами в качестве матрицы?

Для простоты допустим, что упомянутый выше функция addXY:

def addXY(x, y): 
    return x+y 

params=[[1,2],[1,3],[1,4],[1,5]]  # mu and sigma, four versions 
inputs=[1,2,3]       # values, in this case 3 of them 

matrix = [] 
for pdf_params in params: 
    row = [] 
    for inp in inputs: 
     entry = addXY(*pdf_params) 
     row.append(entry*inp) 
    matrix.append(row) 
print matrix 
  1. Является ли это вещий?

  2. Есть ли способ передать параметры и входы и получить матрицу со всеми комбинациями в ней, которые более пифоничны/векторизованы/быстрее?

Важное замечание: Входы в данном примере являются скалярными значениями (Я настроил скалярные значения, чтобы упростить описание проблемы, я на самом деле, используя массив из п-мерных векторов и, таким образом многомерный _normal PDF).

Подсказки и советы о подобных операциях приветствуются.

+0

* «Я установил скалярные значения, чтобы упростить описание проблемы ...» * Хех, я думаю, что вы упростили слишком много :) (см. мой ответ). Как насчет показа более подходящего примера? Вам нужно, чтобы каждый * mu * был n-мерным вектором, и каждая «сигма» на самом деле будет n-на-n ковариационной матрицей. –

+0

Да, вы правы! Можно ли сделать это с обновленной информацией? –

+0

К сожалению, похоже, что 'multivariate_normal.pdf' не передает свои аргументы, поэтому вы должны написать цикл, чтобы обрабатывать разные средние и ковариационные значения. –

ответ

0

Это только моя идея, чтобы сократить код и использовать больше библиотеки.

В вашем коде, на самом деле, вы не используете numpy, scipy. Вопрос будет заключаться в том, хотите ли вы использовать numpy.array для дальнейшей обработки данных.

Вариант 1: просто использовать список, чтобы представить массив и список список, чтобы представить матрицу:

from itertools import product 
matrix_list = [sum(param)*input_x for param, input_x in product(params, inputs)] 
matrix = zip(*[iter(matrix_list)]*len(inputs)) 
print matrix 

Кредит для использования метода зип следует уделять convert a flat list to list of list in python

Вариант 2: использование numpy.array и numpy.matrix для дальнейшей обработки

from itertools import product 
import numpy as np 
matrix_array = np.array([sum(param)*input_x for param, input_x in  product(params, inputs)]) 
matrix = matrix_array.reshape(len(params),len(inputs)) 
print matrix 
+0

Да, но функция addXY выше - это фиктивная функция, используемая для упрощения примера. Фактическая функция многовариантная, с входными данными n-мерных векторов. Спасибо за попытку в любом случае! –

1

Основываясь на вашем описании того, что вы пытаетесь вычислить, вам не нужно multivariate_normal. Вы вызываете метод PDF с набором скалярных значений для распределения со скалярным mu и sigma. Таким образом, вы можете использовать метод pdf()scipy.stats.norm. Этот метод будет broadcast его аргументы, поэтому, передавая массивы с правильной формой, вы можете вычислить PDF для разных значений mu и sigma в одном вызове. Вот пример.

Вот ваши x значения (вы назвали их inputs), а также параметры:

In [23]: x = np.array([1, 2, 3]) 

In [24]: params = np.array([[1, 2], [1, 3], [1, 4], [1, 5]]) 

Для удобства, отдельные параметры в массивы мю и сигма-значений.

In [25]: mu = params[:, 0] 

In [26]: sig = params[:, 1] 

Мы будем использовать scipy.stats.norm для вычисления PDF.

In [27]: from scipy.stats import norm 

Этот вызов вычисляет PDF для желательных комбинаций x и параметров. mu.reshape(-1, 1) и sig.reshape(-1, 1) - это 2D-массивы с формой (4, 1).x имеет форму (3,), поэтому, когда эти аргументы передаются, результат имеет форму (4, 3). Каждая строка представляет собой PDF, оцененный в x для одной из пар mu и sigma.

In [28]: p = norm.pdf(x, loc=mu.reshape(-1, 1), scale=sig.reshape(-1, 1)) 

In [29]: p 
Out[29]: 
array([[ 0.19947114, 0.17603266, 0.12098536], 
     [ 0.13298076, 0.12579441, 0.10648267], 
     [ 0.09973557, 0.09666703, 0.08801633], 
     [ 0.07978846, 0.07820854, 0.07365403]]) 

Другими словами, строки p являются:

norm.pdf(x, loc=mu[0], scale=sig[0]) 
norm.pdf(x, loc=mu[1], scale=sig[1]) 
norm.pdf(x, loc=mu[2], scale=sig[2]) 
norm.pdf(x, loc=mu[3], scale=sig[3]) 
+0

Я только что просмотрел ответ, и я считаю, что это решение моего вопроса, но у меня есть одно дополнение для добавления и было бы очень приятно, если бы вы обновили свой вопрос. В данном примере я использовал функцию addXY и скалярные значения для ввода для упрощения описания проблемы. Я бы, конечно, использовал массив векторов, а не скаляров, для ввода нескольких переменных. –

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