2016-01-07 39 views
0

我想用mu和sigma的四个不同参数调用scipy.stats.multivariate_normal。然后,对于每个生成的概率密度函数,我需要在一个10个值的数组上调用该pdf。如何使用参数作为矩阵调用函数?

为了简单起见,让我们说,上面提到的功能是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. 这是Python的?

  2. 有没有办法传递参数和输入,并得到一个矩阵,其中所有的组合更pythonic /矢量化/更快?

重要通知:在本例中的输入是标量值(我已经设置的标量值,以简化问题描述,我实际使用n维向量的阵列,从而多元 _normal PDF)。

欢迎提供有关类似操作的提示和提示。

+0

*“我给自己定标量值,以简化问题的描述。” *嘿,我觉得你简化太多了:) (看我的答案)。如何展示一个更合适的例子?您需要每个* mu *为一个n维矢量,并且每个“sigma”实际上将是一个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。您使用标量mu和sigma分配一组标量值来调用PDF方法。因此,您可以使用scipy.stats.normpdf()方法。这种方法将其参数设置为broadcast,因此通过传递具有适当形状的数组,可以在一次调用中计算不同mu和sigma值的PDF。这是一个例子。

这是你的x值(你叫他们inputs),参数:

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

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

为了方便,参数分成mu和sigma值的数组。

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

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

我们将使用scipy.stats.norm来计算PDF。

In [27]: from scipy.stats import norm 

此调用计算用于的x和参数所期望的组合的PDF。 mu.reshape(-1, 1)sig.reshape(-1, 1)是具有形状(4,1)的2D阵列。x具有形状(3,),所以当这些参数广播时,结果具有形状(4,3)。每行是在x评估的mu和sigma对之一的PDF。

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和标量值作为输入。我当然会使用一组矢量,而不是标量,用于多元正常pdf输入。 –