Я использую вариацию теоремы Байеса для обновления всех вероятностей состояний, основанных на самоопределяемой функции правдоподобия, и вводимые пользователем данные либо являются правильными, либо неверными (1, 0). Каждый ответ пользователя относится к конкретному вопросу о навыке (skill = a-z), который создает 2 ^ n = 2 ^ 26 = 67 108 864 возможных состояний, которые необходимо обновить. Для определения базы уравнения Байеса P (данные) = сумма произведения вероятности и предварительной вероятности каждого состояния на основе данных должна быть рассчитана. Новые вероятности - это просто каждое вероятностное время, предшествующее этому числу, которое я поместил в векторную запись. Этот процесс прост в вычислительном отношении, но каждое состояние должно анализироваться циклом for или функцией map каждый раз, что создает огромную горловину бутылки.
Вот что я пробовал: запомните len (states) = 67,108,864
def like(ans, d, match):
"""
calculates the liklihood function
:param ans: 1, 0 denoting correct or in correct response
:param d: quesiton difficulty
:param match: True if question space matches part of learning space
:return: liklihood value
"""
if ans == 1 and not match or ans == 0 and match:
return 1
else:
# if ans == 0 and not match or ans == 1 and match
return 1/(1-d)
def p_s_theta(ans, d, space):
"""
Calculates the data prob and return posterior prob of all spaces
:param ans: 1, 0 denoting correct or in correct response
:param d: quesiton difficulty
:param space: learning space of question asked(a-z)
:return: posterior probability of all learning spaces
"""
def p_prime(s):
if space in s[0]:
return like(ans, d, True) * s[1]
else:
return like(ans, d, False) * s[1]
p_theta = list(map(p_prime, states))
p_t = sum(p_theta)
return np.asarray(p_theta)/p_t
Ранее функция map была представлена менее эффективно в форме цикла for, которая была намного медленнее:
def p_s_theta(ans, d, space):
"""
Calculates the data prob and return posterior prob of all spaces
:param ans: 1, 0 denoting correct or in correct response
:param d: quesiton difficulty
:param space: learning space of question asked
:return: posterior probabiltity of all learning spaces
"""
p_theta = []
for s in states:
if space in s[0]:
p_theta.append(like(ans, d, True) * s[1])
else:
p_theta.append(like(ans, d, False) * s[1])
p_theta = list(map(p_prime, states))
p_t = sum(p_theta)
return np.asarray(p_theta)/p_t
Я также попробовал понимание списка и многопроцессорность без удачи. Мой вопрос: знает ли кто-нибудь о методе циклического перемещения по миллионам состояний с такими произвольными вычислениями быстрее, чем цикл for или карта? Также, если кто-то знает о методе параллельной обработки для этого, который может обрабатывать остальную часть программных издержек, что, я думаю, может сработать.