【问题标题】:How to solve three parameters and get the error squared minimization using scipy.minimize?如何解决三个参数并使用 scipy.minimize 获得误差平方最小化?
【发布时间】:2020-11-28 15:06:33
【问题描述】:

我有以下模型来预测“主队的胜利幅度(home MOV)”:

模型 = HAdv + (HT * homeSkills) + (AT * awaySkills)

其中“HAd”是主场优势,“HT”是主队,“AT”是客队,“homeSkills”和“awaySkills”是在包含 198 个样本的 pandas DataFrame 中给出的球队的技能数据还包括每个游戏的“Home MOV”列。

# Transform the panda columns values in np.array

homeSkills = games['Home Skills'].to_numpy()  
awaySkills = games['Away Skills'].to_numpy()
homeMOV = games['Home MOV'].to_numpy() 

我要做的就是求解变量(HAAdv、HT、AT)并获得最小值以使平方误差和 (SSE) 最小化。

SSE = ((model - HomeMOV)^2).sum()

其中“homeMOV”是之前使用 DataFrame 给出的数据设置的数组。

这是我的代码:

from scipy.optimize import minimize

# INITIAL CONDITIONS
HAdv_0 = 100. 
HT_0 = 100.
AT_0 = 100.

v0 = [HAdv_0, HT_0, AT_0]
# DATA TO BE ANALIZED
Y = homeMOV

def model (v, p):
    # Unpack variables
    HAdv, HT, AT = v
    
    # Unpack parameters
    homeSkills, awaySkills = p
    
    # Model
    f = HAdv + (HT * homeSkills) + (AT * awaySkills)
    return f

def sum_of_squares(Y,v,p):
    f = model(v, p)
    obj = np.array(((f - Y)**2)).sum()
    return obj

res = minimize(sum_of_squares, v0, options={'disp':True})

我收到以下错误:sum_of_squares() 缺少 2 个必需的位置参数:'v' 和 'p'

我不知道这是否是唯一错误。我认为在这种最小化中我无法解决其他一些问题。有人可以帮助我完成这项任务,我在将近 2 周的时间里试图解决这个值,拜托。非常感谢。

【问题讨论】:

  • minimize()需要什么参数?
  • cipy.optimize.minimize(fun, x0, args=(), method=None, jac=None, hess=None, hessp=None, bounds=None, constraints=(), tol=无,回调=无,选项=无)我把函数和初步猜测。不知道是不是设置的正确,我尝试了一些其他的方法,包括args,但是我无法运行minimize。
  • fun 的“签名”是什么?也就是minimize的第一个参数应该怎么定义?
  • 我的“乐趣”是 sum_of_squares 函数,我最初的猜测是 v0 作为一个列表。最小化参数中的 'fun' 只是表明目标函数在那里,但它也不需要命名为 'fun'。
  • 指向有关最小化()的文档。

标签: python optimization scipy solver minimize


【解决方案1】:

看来sum_of_squares 需要 3 个参数。但是说minimize(sum_of_squares, v0, options={'disp':True}),只提供了2个:

Y:由minimize提供 五:v0 p: 丢失

我不认为“选项”算作“p”。

【讨论】:

    【解决方案2】:

    我想你快到了。

    让我稍微改变一下符号以提高可读性:

    • v => coeffs:要优化的变量
    • p => X => 输入数据

    然后,您的代码如下所示:

    
    def model(coeffs, X):
        # Unpack variables
        HAdv, HT, AT = coeffs
        
        # Unpack parameters
        homeSkills, awaySkills = X
        
        # Model
        f = HAdv + (HT * homeSkills) + (AT * awaySkills)
        return f
    
    
    def sum_of_squares(coeff, X, Y):
        f = model(coeff, X)
        obj = np.array(((f - Y)**2)).sum()
        return obj
    

    从那里,您需要将XY 传递给sum_of_squares 函数(coeff 将由 scipy 自动管理)。这是通过minimize中的args参数实现的:

    传递给目标函数的额外参数及其派生函数(fun、jac 和 hess 函数)。

    所以,在你的情况下:

    res = minimize(sum_of_squares, v0, args=(X, Y), options={'disp':True})
    

    最后,您可以通过以下方式检查合身状态:

    res.success
    

    并在以下位置找到适合的coeff (HAd, HT, AT):

    res.x
    

    【讨论】:

    • 是的。这完全有助于解决我的问题。谢谢。
    猜你喜欢
    • 2020-10-06
    • 1970-01-01
    • 2020-10-13
    • 1970-01-01
    • 1970-01-01
    • 2018-10-20
    • 2016-11-01
    • 2020-09-24
    • 1970-01-01
    相关资源
    最近更新 更多