如何使用scipy.stats.discrete.expect来计算离散期望值?

时间:2016-12-11 18:47:34

标签: python numpy scipy

首先,我是scipy的新手。这可能是一个新秀问题。在给定离散输入的情况下,我不确定如何使用scipy.discrete.expect来计算以下函数:1,2,3

m = lambda k: (0.12*np.sin((2*np.pi*k)/3 + np.pi/2))**2
k = 1,2,3

现在,在我知道如何使用标准函数之前,我自己写了一个小函数。

input_k = [np.array([1]),np.array([2]),np.array([3])]

def discrete_expect_mk(input_k):
    temp_k = []
    for i in input_k:
        temp_k.append(m(i))
    return np.array([np.mean(temp_k)])

    discrete_expect_mk(input_k)

感谢您的帮助!

2 个答案:

答案 0 :(得分:2)

在您的情况下,您可以使用scipy.stats.randint (low=1, high=4).expect(m)

在使用字母k的任意统一多项式的更一般情况下,您可以使用

uniform_dist = scipy.stats.rv_discrete(values=(k, np.ones(k)/len(k)))
result = uniform_dist.expect(m)

答案 1 :(得分:1)

在这种情况下,您不需要for循环:

import numpy as np
m = lambda k: (0.12*np.sin((2*np.pi*k)/3 + np.pi/2))**2
k=np.arange(1,4) # k = array([1, 2, 3])
print (m(k))
# array([ 0.0036,  0.0036,  0.0144])
print (np.mean(m(k)))
# 0.0072

如果您想使用scipy.stats.rv_discrete,请确保m(k)是概率,即它们加起来为1.

from scipy import stats
pk = m(k)
pk /= np.sum(m(k)) # making sure they add up to 1
func = stats.rv_discrete(name='custm', values=(k, pk))
func.expect()
# 2.5

如果您坚持使用rv_discrete并且所有m具有相同的概率,您可以使用:

from scipy import stats
pk = np.ones_like(m(k))/len(m(k))
func = stats.rv_discrete(name='custm', values=(m(k), pk))
func.mean()
# 0.0072