Как оптимизировать мою функцию для оптимизации чисел c? - PullRequest
0 голосов
/ 28 апреля 2020

Код ниже предоставляет полный воспроизводимый пример. Мой вопрос (в основном) о моей функции thetaMax(). Это функция, которая минимизирует логарифмическую вероятность процесса психометрии c.

Я учу Python и делаю это, переводя мои функции R в python. Код ниже работает как ожидалось. Однако, потому что я изучаю Python, но мой вопрос касается стиля и качества.

Функция thetaMax будет работать с сотнями тысяч людей, и в моем коде R она эффективна и разбита на несколько сердечники. Но прежде чем думать о параллельной обработке, моя первая цель - сделать код python максимально быстрым и эффективным.

Возможно, есть много частей моей функции thetaMax, которые можно улучшить, но один аспект Меня больше всего беспокоит:

for i in range(0,len(x2)):
     result[i] = (gpcm(theta, d = d[i], score = x2[i], a = 1, D = D))

Я думаю, что делать это как al oop, вероятно, плохо, и его можно улучшить с помощью некоторой формы векторизации. Ниже приводится полное содержание, необходимое для реализации этого кода, и спасибо всем, кто готов предложить свои предложения по улучшению кода.

import numpy as np
from scipy.stats import binom
from scipy.optimize import minimize

def prob3pl(theta, a, b, c, D = 1.7):
    result = c + (1 - c) / (1 + np.exp(-D * a * (theta - b)))
    return(result)


def gpcm(theta, d, score, a, D = 1.7):
    Da = D * a
    result = np.exp(np.sum(Da * (theta - d[0:score])))/np.sum(np.exp(np.cumsum(Da * (theta - d))))
    return(result)

d = np.array([[0, -1, .5, 1],[0,-.5,.2,1]])
a = np.array([1,1,1,1,1])
b = np.array([-1,.5,-.5,0,2])
c = np.array([0,0,0,0,0])
x = np.array([1,1,0,1,0,1,1])
indDichot = range(0,5,1)

def thetaMax(x, indDichot, a, b, c, D, d):
    x1 = x[indDichot]
    x2 = np.delete(x, indDichot)
    result = [0] * len(x2)
    def fn(theta):
        if(len(x1) > 0):
            p = prob3pl(theta, a, b, c, D = D)
            logDichPart = sum(np.log(binom.pmf(x1,1,p)))
        else:
            logPolyPart = 0
        if(len(x2) > 0):
            for i in range(0,len(x2)):
                result[i] = (gpcm(theta, d = d[i], score = x2[i], a = 1, D = D))
            logPolyPart = sum(np.log(result))
        else:
            logPolyPart = 0
        LL = -(logDichPart + logPolyPart)
        return(LL)
    out = minimize(fn, x0=0)
    return(out)


thetaMax(x,indDichot,a,b,c,D=1,d = d)
...