для цикла более 2 ^ n предметов узкое место - PullRequest
0 голосов
/ 28 июня 2018

Я использую вариацию теоремы Байеса для обновления всех вероятностей состояний, основанных на самоопределяемой функции правдоподобия, и вводимые пользователем данные либо являются правильными, либо неверными (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 или карта? Также, если кто-то знает о методе параллельной обработки для этого, который может обрабатывать остальную часть программных издержек, что, я думаю, может сработать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...