假设我有一些数据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))
任何人都可以帮我解决这个问题吗?
答案 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是一个列表。这样我们就可以快速解压缩。