如何求解三个参数并使用 scipy.minimize 获得误差平方最小化?

How to solve three parameters and get the error squared minimization using scipy.minimize?

我有以下模型来预测“主队胜率(主场 MOV)”:

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

其中“HAdv”是主场优势,“HT”是主队,“AT”是客队,“homeSkills”和“awaySkills”是[=40=中给出的球队技能] 包含 198 个数据样本的 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() 

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

SSE = ((模型 - 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 周试图解决这个值的任务吗?非常感谢。

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

Y:由minimize提供 v: v0 p: 缺失

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

我想你快到了。

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

  • 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 参数实现的:

Extra arguments passed to the objective function and its derivatives (fun, jac and hess functions).

所以,在你的情况下:

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

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

res.success

并在以下位置找到拟合的 coeff(HAdv、HT、AT):

res.x