【问题标题】:Error using multiprocessing library: "got multiple values for keyword argument 'x' "使用多处理库时出错:“为关键字参数 'x' 获取了多个值”
【发布时间】:2018-06-08 12:06:37
【问题描述】:

我正在尝试使用 python 中的多处理库并行化惩罚线性模型。

我创建了一个函数来解决我的模型:

from __future__ import division
import numpy as np
from cvxpy import *

def lm_lasso_solver(x, y, lambda1):
    n = x.shape[0]
    m = x.shape[1]
    lambda1_param = Parameter(sign="positive")
    betas_var = Variable(m)
    response = dict(model='lm', penalization='l')
    response["parameters"] = {"lambda_vector": lambda1}
    lasso_penalization = lambda1_param * norm(betas_var, 1)
    lm_penalization = 0.5 * sum_squares(y - x * betas_var)
    objective = Minimize(lm_penalization + lasso_penalization)
    problem = Problem(objective)
    lambda1_param.value = lambda1
    try:
        problem.solve(solver=ECOS)
    except:
        try:
            problem.solve(solver=CVXOPT)
        except:
            problem.solve(solver=SCS)
    beta_sol = np.asarray(betas_var.value).flatten()
    response["solution"] = beta_sol
    return response

在此函数中,x 是预测变量矩阵,y 是响应变量。 lambda1 是必须优化的参数,因此是我要并行化的参数。我将此脚本保存在一个名为“ms.py”的python文件中

然后我创建了另一个名为“parallelization.py”的 python 文件,并在该文件中定义了以下内容:

import multiprocessing as mp
import ms
import functools

def myFunction(x, y, lambda1):
    pool = mp.Pool(processes=mp.cpu_count())
    results = pool.map(functools.partial(ms.lm_lasso_solver, x=x, y=y), lambda1)
    return results

所以现在的想法是,在 python 解释器上执行:

from sklearn.datasets import load_boston
boston = load_boston()
x = boston.data
y = boston.target
runfile('parallelization.py')
lambda_vector = np.array([1,2,3])
myFunction(x, y, lambda_vector)

但是当我这样做时,我收到以下错误消息:

【问题讨论】:

  • 问题出在functools 模块的partial() 方法上。它按如下方式编辑了结果行并且它起作用了。 results = pool.apply_async(lm_lasso_solver, args=[x, y, lambda1])

标签: python-2.7 python-multiprocessing pool


【解决方案1】:

问题就出来了:

results = pool.map(functools.partial(ms.lm_lasso_solver, x=x, y=y), lambda1)

您正在使用关键字参数调用 functools.partial() 方法,而在您的 lm_lasso_solver 方法中,您没有将它们定义为关键字参数。您应该使用xy 作为位置参数来调用它,如下所示:

results = pool.map(functools.partial(ms.lm_lasso_solver, x, y), lambda1)

或者简单地使用池对象的apply_async()方法:

results = pool.apply_async(ms.lm_lasso_solver, args=[x, y, lambda1])

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-08-04
    • 2016-06-24
    • 2015-05-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-14
    相关资源
    最近更新 更多