微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

从模块加载时如何并行运行 scipy 差分进化?如果 __name__ == '__main__' 则不能使用:

如何解决从模块加载时如何并行运行 scipy 差分进化?如果 __name__ == '__main__' 则不能使用:

当我与多个工人运行差异进化时遇到了一个问题。正常情况下可以通过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 举报,一经查实,本站将立刻删除。