Python:定义对数似然函数

时间:2015-12-03 06:04:25

标签: function python-2.7

假设我有一些数据z=[1,2,3,4]

我正在尝试将此数据拟合到已知的模型中,因此练习只是查找未知参数D的值 我的对数似然函数看起来像这样

l(D|z)= \sum(\sqrt(z^2 + D^2)) 

我试图定义这个对数似然函数,z是一个列表的数据,theta是参数向量,在这种情况下是1维

import scipy.optimize as op
import numpy as np

D_true = some given value 
def f(z,theta):
     D=theta
     z2=[x**2 for x in z]
     return np.sqrt(np.sum(z2 + D**2))

result = op.minimize(f, D_true,args=(z))
print result.x

但我收到错误消息unsupported operand type(s) for ** or pow(): 'list' and 'int' 并指向return np.sqrt(np.sum(z2 + D**2))

任何人都可以帮我解决这个问题吗?

2 个答案:

答案 0 :(得分:0)

正如他们所说,"我们有眼睛,如果我们只是看到了。"我的意思是,它告诉你在哪里看

"但是我收到**或pow()的错误消息不支持的操作数类型:' list'和' int' 并指向返回np.sqrt(np.sum(z2 + D ** 2))"

它甚至告诉你问题:你不能将列表对象添加到int对象。顺便说一下你编写它,我认为你假设Python会广播,但除非至少有一个对象是一个numpy(ndarray)对象,否则它不会这样做。

您可能希望将值D ** 2 添加到z2的每个条目中。一种选择是写

return np.sqrt(np.sum(z2 + D **2 * np.ones_like(z2)))

另一种选择是

return np.sqrt(np.sum(np.array(z2) + D ** 2))

让我看到列表与numpy函数一起使用很尴尬,你可以考虑专门使用numpy数组。例如,如果您从一开始就选择这样做,就不会遇到此问题。

如果你有一个numpy数组,你可以使用ufuncs而不是list comprehensions。

z = np.arange(1,5)
z2 = z ** 2

相同
z2 = [x ** 2 for x in z]

但返回一个numpy数组而不是列表。

答案 1 :(得分:0)

我认为您应该将import re cam1 = re.compile(r'some regex') cam2 = re.compile(r'something else') if cam1.match(filename) and cam2.match(filename): process_data() 替换为D = theta,因为theta是一个列表。这样我们就可以快速解压缩。