Skip to content

Instantly share code, notes, and snippets.

@fasiha
Last active January 29, 2020 03:54
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save fasiha/e46a499ba564d0246213168016554848 to your computer and use it in GitHub Desktop.
Save fasiha/e46a499ba564d0246213168016554848 to your computer and use it in GitHub Desktop.
Converting a generic history of quizzes (times and results) to an Ebisu model (given initial half-life and model parameters) to a Memorize schedule
import ebisu
from memorizesrs import schedule
from datetime import datetime, timedelta
from math import inf
learnTime = datetime(2020, 1, 27, 0, 0, 0)
reviewTimes = [
learnTime + timedelta(hours=1.1), learnTime + timedelta(hours=4.4),
learnTime + timedelta(hours=22.0), learnTime + timedelta(days=2.4)
]
reviewResults = [False, True, True, True]
initialModel = ebisu.defaultModel(0.25, 2.0) # initial half-life = quarter-hour, α=β=2
def historyToEbisuModel(learnTime, initialModel, reviewTimes, reviewResults):
"""Convert history of quizzes to Ebisu model"""
assert len(reviewTimes) == len(reviewResults)
previousTime = learnTime
model = initialModel
for (reviewTime, result) in zip(reviewTimes, reviewResults):
model = ebisu.updateRecall(model, result, (reviewTime - previousTime).total_seconds() / 3600)
previousTime = reviewTime
return model
def ebisuModelToMemorizeInterval(model, q=10.0, T=inf):
"""Use an Ebisu model to draw a MEMORIZE interval"""
return schedule(lambda t: ebisu.predictRecall(initialModel, t, exact=True), q, T)
def ebisuModelToInterval(model, pRecall):
"""When with an Ebisu model decay to a certain recall probability?"""
return ebisu.modelToPercentileDecay(model, pRecall)
ebisuModel = historyToEbisuModel(learnTime, initialModel, reviewTimes, reviewResults)
dueIn = ebisuModelToMemorizeInterval(ebisuModel, q=10.0, T=inf)
print("MEMORIZE Quiz due in {} hours".format(dueIn))
print("Ebisu Quiz due in {} hours".format(ebisuModelToInterval(ebisuModel, 0.25)))
try:
import pandas as pd
print("\n\nMonte Carlo analysis:\n")
for model in [initialModel, ebisuModel]:
print("Ebisu halflife={} hours".format(ebisu.modelToPercentileDecay(model)))
print(pd.DataFrame([ebisuModelToMemorizeInterval(model) for n in range(10_000)]).describe())
except:
print("Didn't run pandas analysis")
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment