如何在 class 中使用 scipy 的最小化?
How to use scipy's minimize within a class?
我是 python 的新手,所以这可能是一个愚蠢的问题,但是我在任何地方都找不到答案。
我正在尝试根据另一个玩家的动作找到一个玩家的最佳反应。这种情况是您对那些熟悉的经济学的典型 Bertrand 价格竞争。代码如下:
import numpy as np
from scipy.optimize import minimize
class Player:
def __init__(self):
self.action = np.random.choice(np.linspace(0, 1, 11))
def payoff(self, other):
if self.action < other.action:
return (1 - self.action) * self.action
elif self.action == other.action:
return 0.5 * (1 - self.action) * self.action
else:
return 0
def best_reply(self, other):
br = minimize(-self.payoff, 0.5, other)
return br['x']
A = Player()
B = Player()
print(A.best_reply(B))
当我运行上面的代码时,我得到一个错误:
TypeError: bad operand type for unary -: 'method'
谁能给我解释一下这是为什么?我能够通过将收益乘以 -1 并从 best_reply 函数中删除“-”来规避这个问题。但是,当我 运行 我得到的代码时:
TypeError: payoff() takes 2 positional arguments but 3 were given
怎么会?我给出的唯一论据是自己 (A) 和其他玩家 (B)。如果有人能够通过解释我到底做错了什么以及 运行ning 此类代码的正确方法是什么来帮助我,我将非常感激。提前致谢!
编辑:在代码中添加了导入
payoff
是一种方法,您不能使用方法进行数学运算,只能使用它们的 return 值。就像Python无法计算出-print
是什么,也无法计算出-self.payoff
是什么。
第二个错误参考minimize
方法的documentation。我认为问题在于您需要更改调用 minimize
的方式。试试这个,请 post 结果:
br = minimize(self.payoff, 0.5, (other,))
以下是我的做法。将要优化的函数与 class 方法分开,并有一个私有的 static method 用于两种方法都可以使用的收益计算。
import numpy as np
from scipy.optimize import minimize
class Player:
def __init__(self):
self.action = np.random.choice(np.linspace(0, 1, 11))
@staticmethod
def _calc_payoff(a, b):
if a < b:
return (1 - a) * a
elif a == b:
return 0.5 * (1 - a) * a
else:
return 0
def payoff(self, other):
return self._calc_payoff(self.action, other.action)
def best_reply(self, other):
f = lambda x: 1 - self._calc_payoff(x, other.action)
br = minimize(f, 0.5)
return br.x.item()
A = Player()
B = Player()
print(A.best_reply(B))
0.5
是正确的结果吗?
我是 python 的新手,所以这可能是一个愚蠢的问题,但是我在任何地方都找不到答案。
我正在尝试根据另一个玩家的动作找到一个玩家的最佳反应。这种情况是您对那些熟悉的经济学的典型 Bertrand 价格竞争。代码如下:
import numpy as np
from scipy.optimize import minimize
class Player:
def __init__(self):
self.action = np.random.choice(np.linspace(0, 1, 11))
def payoff(self, other):
if self.action < other.action:
return (1 - self.action) * self.action
elif self.action == other.action:
return 0.5 * (1 - self.action) * self.action
else:
return 0
def best_reply(self, other):
br = minimize(-self.payoff, 0.5, other)
return br['x']
A = Player()
B = Player()
print(A.best_reply(B))
当我运行上面的代码时,我得到一个错误:
TypeError: bad operand type for unary -: 'method'
谁能给我解释一下这是为什么?我能够通过将收益乘以 -1 并从 best_reply 函数中删除“-”来规避这个问题。但是,当我 运行 我得到的代码时:
TypeError: payoff() takes 2 positional arguments but 3 were given
怎么会?我给出的唯一论据是自己 (A) 和其他玩家 (B)。如果有人能够通过解释我到底做错了什么以及 运行ning 此类代码的正确方法是什么来帮助我,我将非常感激。提前致谢!
编辑:在代码中添加了导入
payoff
是一种方法,您不能使用方法进行数学运算,只能使用它们的 return 值。就像Python无法计算出-print
是什么,也无法计算出-self.payoff
是什么。
第二个错误参考minimize
方法的documentation。我认为问题在于您需要更改调用 minimize
的方式。试试这个,请 post 结果:
br = minimize(self.payoff, 0.5, (other,))
以下是我的做法。将要优化的函数与 class 方法分开,并有一个私有的 static method 用于两种方法都可以使用的收益计算。
import numpy as np
from scipy.optimize import minimize
class Player:
def __init__(self):
self.action = np.random.choice(np.linspace(0, 1, 11))
@staticmethod
def _calc_payoff(a, b):
if a < b:
return (1 - a) * a
elif a == b:
return 0.5 * (1 - a) * a
else:
return 0
def payoff(self, other):
return self._calc_payoff(self.action, other.action)
def best_reply(self, other):
f = lambda x: 1 - self._calc_payoff(x, other.action)
br = minimize(f, 0.5)
return br.x.item()
A = Player()
B = Player()
print(A.best_reply(B))
0.5
是正确的结果吗?