我试图提取满足某个均值和方差的Weibull分布参数(形状'k'和比例'lambda')。在这个例子中,均值是4,方差是8.这是一个2-unknowns和2-equation类型的问题。
由于此算法适用于Excel 2010的GRG解算器,因此我确信它是关于我构建问题的方式,或者可能是我正在使用的库。我对优化库并不太熟悉,所以请告诉我错误的位置。
以下是剧本:
from scipy.optimize import fmin_cg
import math
def weibull_mu(k, lmda): #Formula can be found on wikipedia
return lmda*math.gamma(1+1/k)
def weibull_var(k, lmda): #Formula can be found on wikipedia
return lmda**2*math.gamma(1+2/k)-weibull_mu(k, lmda)**2
def min_function(arggs):
actual_mean = 4 # specific to this example
actual_var = 8 # specific to this example
k = arggs[0]
lmda = arggs[1]
output = [weibull_mu(k, lmda)-(var_wei)]
output.append(weibull_var(k, lmda)-(actual_var)**2-(actual_mean)**2)
return output
print fmin(min_function, [1,1])
此脚本给出了以下错误:
[...]
File "C:\Program Files\Python27\lib\site-packages\scipy\optimize\optimize.py", line 278, in fmin
fsim[0] = func(x0)
ValueError: setting an array element with a sequence.
答案 0 :(得分:4)
据我所知,min_function
返回一个多维列表,但fmin和fmin_cg确实期望目标函数返回一个标量,如果我没有弄错的话。
如果您正在搜索双方程问题的根,我认为最好应用root函数。据我所知, scipy 没有为矢量函数提供任何通用优化器。
答案 1 :(得分:2)
由于Anders Gustafsson的评论(谢谢),我设法让它工作。如果只返回一个标量,这个脚本现在可以工作(在这种情况下,我使用的是最小二乘方式的东西)。此外,通过将优化函数更改为“fmin_l_bfgs_b”来添加边界(再次感谢Anders Gustafsson)。
我只更改了相对于问题的min_function定义。
from scipy.optimize import fmin_l_bfgs_b
import math
def weibull_mu(k, lmda):
return lmda*math.gamma(1+1/k)
def weibull_var(k, lmda):
return lmda**2*math.gamma(1+2/k)-weibull_mu(k, lmda)**2
def min_function(arggs):
actual_mean = 4. # specific to this example
actual_var = 8. # specific to this example
k = arggs[0]
lmda = arggs[1]
extracted_var = weibull_var(k, lmda)
extracted_mean = weibull_mu(k, lmda)
output = (extracted_var - actual_var)**2 + (extracted_mean - actual_mean)**2
return output
print fmin_l_bfgs_b(min_function, best_guess, approx_grad = True, bounds = [(.0000001,None),(.0000001,None)], disp = False)
注意:请随意使用此脚本供您自己或专业人士使用。