Одновременно выполните несколько регрессий Пуассона в Python

#python #regression #mathematical-optimization #poisson

Вопрос:

У меня есть данные формы

 n = number of samples

features: n x 1 matrix
data: n x m matrix
 

Я хочу выполнить несколько регрессий Пуассона с одним и тем же features , где выходные значения различаются по столбцам данных. В настоящее время я выполняю одну регрессию Пуассона за раз, используя sklearn , например, мой код на Python выглядит примерно так

 from sklearn import linear_model

clf = linear_model.PoissonRegressor(fit_intercept=True,alpha=0)
for col in range(m):
    clf.fit(features,data[:,col])
 

Однако мне приходится выполнять многие из этих пуассоновских регрессий, и слишком медленно выполнять их все по отдельности. Итак, мой вопрос: есть ли способ (в Python), чтобы я мог одновременно выполнять все m этих регрессий Пуассона одновременно?

Если бы я вместо этого занимался линейной регрессией, то мог бы использовать хорошие матричные трюки, чтобы делать это одновременно. Однако ключевое различие здесь заключается в том, что регрессия Пуассона предполагает использование алгоритма оптимизации для максимизации функции правдоподобия. Поэтому, по сути, я хотел бы решить сразу несколько задач оптимизации.

Одна вещь, которую я пытался использовать scipy.optimize , заключалась в максимизации суммы (логарифмических) вероятностей для каждой регрессии Пуассона. Однако это было невероятно чувствительно к инициализации и не сходилось.

Таким образом, я надеюсь, что есть либо:

  1. лучший пакет оптимизации Python, который я могу использовать для максимизации целевой функции регрессии Пуассона (сумма вероятностей), или
  2. пакет Python, который позволяет выполнять одновременные регрессии Пуассона.

У кого-нибудь есть какие-нибудь идеи? Любая помощь была бы очень признательна. Спасибо!

Ответ №1:

Похоже, вы ищете многопроцессорную обработку.
это позволит вам одновременно выполнить N вычислений регрессии Пуассона.
Простой пример ниже:

 from multiprocessing import Pool

def f(x):
    return x*x

if __name__ == '__main__':
    with Pool(5) as p:
        print(p.map(f, [1, 2, 3]))
 

Комментарии:

1. Спасибо! Это очень полезно!