我正在使用 Windows 机器,并且我有一个为 Python 2.7 设计的代码,可以解决统计模型。由于模型取决于参数的值,因此我创建了一个并行版本,它为每个参数值求解一个模型。
例如,考虑一个名为的第一个文件main_function,其中包含以下代码(此代码是为了可复制性,但与问题无关):
import numpy as np
import cvxpy
def lm_lasso(x, y, lambda1=None):
n = x.shape[0]
m = x.shape[1]
lambda_param = cvxpy.Parameter(sign="positive")
# Define the objective function
beta_var = cvxpy.Variable(m)
lasso_penalization = lambda_param * cvxpy.norm(beta_var, 1)
lm_penalization = (1.0 / n) * cvxpy.sum_squares(y - x * beta_var)
objective = cvxpy.Minimize(lm_penalization + lasso_penalization)
problem = cvxpy.Problem(objective)
beta_sol_list = []
for l in lambda1:
lambda_param.value = l
problem.solve(solver=cvxpy.ECOS)
beta_sol = np.asarray(np.row_stack([b.value for b in beta_var])).flatten()
beta_sol_list.append(beta_sol)
return beta_sol_list
第二个名为的文件parallel_function包含以下代码:
import multiprocessing as mp
import numpy as np
import functools
import zz_main_function as mf
def lm_lasso_parallel(x, y, lambda1):
chunks = np.array_split(lambda1, mp.cpu_count())
pool = mp.Pool(processes=mp.cpu_count())
results = pool.map(functools.partial(mf.lm_lasso, x, y), chunks)
pool.close()
pool.join()
return results
我将函数拆分为两个文件的原因是因为这样一切似乎都可以正常工作,而无需添加if __name__ == '__main__':处理多处理时通常所需的内容。
这段代码是几个月前编写的,无论是从 python 控制台还是运行 python 文件,都可以完美运行,例如:
import zz_parallel_function as pf
from sklearn.datasets import load_boston
boston = load_boston()
x = boston.data
y = boston.target
lambda1 = [0, 1e-3, 1e-2, 1e-1, 1, 1e2, 1e3]
r_parallel = pf.lm_lasso_parallel(x, y, lambda1)
最近我不得不格式化我的电脑,当我重新安装 python 2.7 并尝试运行之前描述的代码时,我遇到了以下错误:
如果我尝试直接从 python 控制台运行它:
import zz_parallel_function as pf
from sklearn.datasets import load_boston
boston = load_boston()
x = boston.data
y = boston.target
lambda1 = [0, 1e-3, 1e-2, 1e-1, 1, 1e2, 1e3]
r_parallel = pf.lm_lasso_parallel(x, y, lambda1)
如果我将其作为独立文件运行:
所以我的问题是:
为什么这段代码以前有效,现在无效?(可能)唯一改变的是安装的一些模块的版本,但我认为这无关紧要
关于如何让它再次工作的任何猜测?
一只萌萌小番薯
相关分类