Код ниже предоставляет полный воспроизводимый пример. Мой вопрос (в основном) о моей функции 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)