问题描述
当我与多个工人运行差异进化时遇到了一个问题。正常情况下可以通过if __name__ == '__main__':
解决,但是这里由于项目结构的原因是不可能的。简化版的问题如下:
类 GlobalRestrictedSUR
位于名为 functions.py
的文件中,该文件与 main.py
位于同一文件夹中。它有一个方法 gfit()
,通过最小化目标函数——残差平方和——使用差分进化(真正的问题不是凸的)来拟合回归系统。
当我在 main.py
文件中时,导入类并调用 gfit()
方法,differential_evolution
像这样:
#### Estimate GlobalRestrictedSUR
from functions import GlobalRestrictedSUR
lhs = ...
rhs = ...
grmodel = GlobalRestrictedSUR(lhs,rhs,beta_bound=(-100,100),maxiter=int(1e3))
grmodel.gfit(ftol=1e-9)
它仅适用于 workers=1
。对于 workers>1
,我收到错误:
Process SpawnPoolWorker-210:
Traceback (most recent call last):
File "/opt/anaconda3/lib/python3.8/multiprocessing/process.py",line 315,in _bootstrap
self.run()
File "/opt/anaconda3/lib/python3.8/multiprocessing/process.py",line 108,in run
self._target(*self._args,**self._kwargs)
File "/opt/anaconda3/lib/python3.8/multiprocessing/pool.py",line 114,in worker
task = get()
File "/opt/anaconda3/lib/python3.8/multiprocessing/queues.py",line 358,in get
return _ForkingPickler.loads(res)
ModuleNotFoundError: No module named 'functions'
如果所有内容都在 main.py
文件中,我可以使用 if __name__ == '__main__':
解决该问题。但这在这里是不可能的,因为类在 functions.py
中。我尝试使用 if __name__ == 'functions':
,但这没有帮助。为完整起见,我提供了 GlobalRestrictedSUR
的代码。
class GlobalRestrictedSUR():
def __init__(self,lhs,beta_bound=(-20,20) maxiter=100):
# To be filled with results
self.result = None
# Declare data
self.lhs = lhs
self.rhs = rhs
self.beta_bound = beta_bound
self.maxiter = maxiter
# Declare dimensions
self.T_dep,self.N = self.lhs.shape # T is time. N are dependent variables
self.T_ind,self.R = self.rhs.shape # R is the number of regressors
# Convenient shapes for optimization
self.y = lhs.unstack().values
self.x = np.kron(np.eye(self.N),self.rhs)
def ssr(self,params,y,x):
# get residuals
res = y - x @ params
return np.sum(res ** 2)
def gfit(self,ftol=1e-6):
# if __name__ == '__main__':
# Get a DE solution
bounds = [self.beta_bound] * (self.N*self.R)
result = differential_evolution(self.ssr,bounds,args=(self.y,self.x),maxiter=self.maxiter,tol=ftol,workers=2,seed=0,disp=True)
self.result = result
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)