Медленный расчет glm при использовании rpy2

Я хочу рассчитать параметры логистической регрессии с помощью пакета R glm. Я работаю с python и использую для этого rpy2. По какой-то причине, когда я запускаю функцию glm с помощью R, я получаю гораздо более быстрые результаты, чем при использовании rpy2. Вы знаете, почему вычисления с использованием rpy2 намного медленнее? Я использую R - V2.13.1 и rpy2 - V2.0.8 Вот код, который я использую:

import numpy
from rpy2 import robjects as ro
import rpy2.rlike.container as rlc

def train(self, x_values, y_values, weights):
        x_float_vector = [ro.FloatVector(x) for x in numpy.array(x_values).transpose()]
        y_float_vector = ro.FloatVector(y_values)   
        weights_float_vector = ro.FloatVector(weights)
        names = ['v' + str(i) for i in xrange(len(x_float_vector))]
        d = rlc.TaggedList(x_float_vector + [y_float_vector], names + ['y'])
        data = ro.RDataFrame(d)
        formula = 'y ~ '
        for x in names:
            formula += x + '+'
        formula = formula[:-1]
        fit_res = ro.r.glm(formula=ro.r(formula), data=data, weights=weights_float_vector,  family=ro.r('binomial(link="logit")'))

person user5497    schedule 19.06.2012    source источник


Ответы (1)


Без полного кода R, с которым вы проводите сравнительный анализ, трудно точно указать, где может быть проблема.

Возможно, вы захотите запустить это через профилировщик Python, чтобы увидеть, где находятся узкие места.

Наконец, текущая версия rpy2 - 2.2.6. Помимо изменений API, он работает быстрее и имеет (предположительно) меньше ошибок, чем 2.0.8.

Изменить: Из ваших комментариев я теперь подозреваю, что вы вызываете свою функцию в цикле, и большая часть времени тратится на построение R-векторов (которые, возможно, нужно построить только один раз).

person lgautier    schedule 20.06.2012
comment
Я использую: glm (y ~ v1 + v2 + ..., data = data) (в этом случае данные - это фрейм данных, который был загружен из файла CSV и содержал те же данные, которые были отправлены в функцию поезда в python . - person user5497; 20.06.2012
comment
Так же попробую проверить новую версию - person user5497; 20.06.2012
comment
Мы пробовали использовать новую версию и получили тот же результат (та же скорость). Кроме того, профилировщик показывает, что большую часть времени уходит на последнюю строку (fit_res = ro.r.glm (формула = ro.r (формула), data = data, weights = weights_float_vector, family = ro.r ('binomial (ссылка = логит) '))) - person user5497; 17.07.2012
comment
Без кода R для сравнения труднее определить причину. - person lgautier; 17.07.2012