【问题标题】:Using SCIPY.OPTIMIZE.FMIN_CG to extract Weibull distribution parameters使用 SCIPY.OPTIMIZE.FMIN_CG 提取 Weibull 分布参数
【发布时间】:2012-06-30 01:05:40
【问题描述】:

我正在尝试提取满足某个均值和方差的 Weibull 分布参数(形状“k”和尺度“lambda”)。在本例中,均值为 4,方​​差为 8。这是一个 2-unknowns 和 2-equations 类型的问题。

由于此算法适用于 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.

【问题讨论】:

    标签: python scipy distribution mathematical-optimization weibull


    【解决方案1】:

    据我所知,min_function 返回一个多维列表,但如果我没记错的话,fminfmin_cg 确实希望目标函数返回一个标量。

    如果您正在寻找两个方程问题的根源,我想您最好应用 root 函数。据我所知,scipy 没有为向量函数提供任何通用优化器。

    【讨论】:

      【解决方案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)
      

      注意:请随意将此脚本用于您自己或专业用途。

      【讨论】:

      • 如果你想应用边界,例如使用fmin_l_bfgs_b,它允许你设置变量的边界。另外,如果您发现我的回答有用,请不要犹豫:-)
      • 我很乐意,但我显然需要有 15 名声望。此外,fmin_l_bfgs 也给了我一个错误:File"C:\Program Files\Python27\lib\site-packages\scipy\optimize\lbfgsb.py",第 150 行,在 func_and_grad f, g = func(x, *args ) TypeError: 'numpy.float64' 对象不可迭代
      • 典型 :-) 查看参数列表,您似乎需要将 approx_grad 参数设置为 True。如果不这样做,则需要定义 fprime,或者必须将渐变包含在来自 func 的返回值中。这有帮助吗?
      • 效果很好!非常感谢,安德烈斯。 (另外,自从我的代表上升以来,我刚刚提高了你的答案)
      猜你喜欢
      • 2012-08-02
      • 2013-07-03
      • 2020-11-27
      • 2016-06-05
      • 1970-01-01
      • 2017-12-25
      • 2013-12-20
      • 2019-10-08
      • 2019-02-28
      相关资源
      最近更新 更多