【问题标题】:Minimize function最小化功能
【发布时间】:2019-09-28 09:39:04
【问题描述】:

我有 Y 和 X 值的列表,我想最小化这个函数

如果需要,我有 Theta 的起始值,函数可以从该值开始搜索 (0.01604 = Theta2, 1.143 = Theta1, 1.537 = Theta0)

我实现了Huber功能

def Huber(l,delta):

    if m.fabs(l)<=delta:
        return 1/2*(l)**2
    else:
        return delta*m.fabs(l)-1/2*delta**2

那我试试

def my_function(start, X, y):
    Theta0, Theta1, Theta2 = start
    u = Huber((y - (Theta0 + Theta1*X+Theta2*X*X)),7)
    return u

optimized = minimize(my_function(start, X, y), start)

还有

TypeError: cannot convert the series to <class 'float'>

如何做到正确?

【问题讨论】:

  • 你能贴出你的代码吗?
  • 你确定你把方块放在了正确的地方吗?这个函数没有最小值。
  • “凝视点”是什么意思? θ是常数吗?或者您是否试图找到最小化箭头左侧函数值的θ?从这个符号看不清楚。
  • @rusu_ro1 我没有尝试过,因为我不明白如何将 scipy.minimize 用于具有一些变量(超过 1)的函数
  • 那么@amitavory 是对的。您可以先添加 $Y_i$、$X_i$ 和 ${X_i}^2$(将总和扩展为 4 个总和)。因此,除非正方形在第一个或第二个括号之外,否则它将变为 A-theata0-theta1*B-theta2*C。没有最低限度。

标签: python math scipy


【解决方案1】:

只需提供一个包含您的起点的列表:

start = [1.537, 1.143, 0.01604]

然后使用SciPy的optimizedocs):

from scipy.optimize import minimize

def my_function(args):
    Theta0, Theta1, Theta2 = args
    # here return the value of the function

optimized = minimize(my_function, start)

在上面,Theta0Theta1Theta2 是变量。从问题中不清楚它们是否是常数。如果是这种情况,只需使用上面的代码作为模板并将您的起点解压缩到变量,例如

from scipy.optimize import minimize

start = [1, 1]

def my_function(args):
    X, y = args # Thetas constant
    # here return the value of the function

optimized = minimize(my_function, start)

注意:您应该只传递函数的名称,而不是函数调用,即

minimize(my_function, start) # works
minimize(my_function(....), start) # doesn't work

【讨论】:

  • 在这种情况下,我有 TypeError: 'Series' object is not callable。我更新了问题并添加了我尝试的代码
  • @ИльшатМурзурбеков 您应该传递函数的名称,而不是调用。我已经更新了答案。并且该函数应该有一个参数,该参数是要优化的变量。
猜你喜欢
  • 2012-02-04
  • 2020-05-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-08-01
  • 1970-01-01
相关资源
最近更新 更多