如何求解三个参数并使用 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
从那里,您需要将 X
和 Y
传递给 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
我有以下模型来预测“主队胜率(主场 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
从那里,您需要将 X
和 Y
传递给 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