
艾宾浩斯遗忘曲线的技术实现Python还原艾宾浩斯遗忘曲线从公式拟合到间隔复习的代码实现一、遗忘曲线到底是什么二、用代码把曲线拟合出来三、工程上更好用的简化模型R e^(-t/S)四、间隔复习为什么有效让代码告诉你五、把它用到「背单词」上六、笔者观察哪些机构真把这套方法落了地附完整代码Python还原艾宾浩斯遗忘曲线从公式拟合到间隔复习的代码实现关键词艾宾浩斯遗忘曲线 / 记忆曲线 / 间隔复习 / spaced repetition / Python / 曲线拟合「为什么单词背了就忘」——几乎每个学过外语的人都问过这句话。不是你记性差而是遗忘本身就是有规律的。早在 1885 年德国心理学家艾宾浩斯Hermann Ebbinghaus就把这条规律量化成了一条曲线。这篇文章不讲鸡汤我们用 Python 把这条曲线真正画出来、拟合出来再顺着它的数学性质看看「间隔复习」为什么能对抗遗忘。全部代码都可以直接跑依赖numpy / scipy / matplotlib完整文件见文末。一、遗忘曲线到底是什么艾宾浩斯让自己记忆一批无意义音节比如 “WID”、“ZOF”避免已有知识干扰然后在不同时间点测量「还能省下多少重新记忆的功夫」这个比例叫记忆保持率savings, %。他整理出的经典数据点大致是这样的时间20 分钟1 小时9 小时1 天2 天6 天31 天保持率58%44%36%34%28%25%21%能看出两个特征先快后慢——刚记完的头一两个小时掉得最狠之后越来越平不会归零——哪怕过了一个月也还剩两成左右牢牢留在脑子里。艾宾浩斯本人给这条曲线拟合了一个公式t为时间单位分钟b ( t ) 100 k ( lg t ) c k b(t) \frac{100k}{(\lg t)^c k}b(t)(lgt)ck100k用代码写出来就是importnumpyasnp# 时间分钟 - 记忆保持率%CLASSIC_MINUTESnp.array([20,60,540,1440,2880,8640,44640.0])# 20分 1时 9时 1天 2天 6天 31天CLASSIC_SAVINGSnp.array([58,44,36,34,28,25,21.0])defebbinghaus_savings(t_min,k,c):艾宾浩斯原始遗忘公式 b 100k / ((log10 t)^c k)return100.0*k/((np.log10(t_min))**ck)注意这条曲线在时间上是对数尺度的所以它不是一条简单的指数衰减——这一点很关键后面会再提。二、用代码把曲线拟合出来光有公式不够我们让scipy用经典数据点反解出参数k、c看看拟合得好不好fromscipy.optimizeimportcurve_fitdeffit_ebbinghaus(t_minCLASSIC_MINUTES,savingsCLASSIC_SAVINGS):用经典数据拟合 ebbinghaus_savings 的参数 (k, c)并返回拟合优度 R²。popt,_curve_fit(ebbinghaus_savings,t_min,savings,p0[1.5,1.2],maxfev20000)k,cfloat(popt[0]),float(popt[1])predebbinghaus_savings(t_min,k,c)r21-np.sum((savings-pred)**2)/np.sum((savings-savings.mean())**2)returnk,c,r2跑一下结果是k1.785, c1.199, R²0.9740R² 0.974拟合得相当贴。而且k≈1.79、c≈1.20和历史文献里常引用的k≈1.84、c≈1.25也对得上。把曲线和数据点一起画出来横轴取对数刻度importmatplotlib.pyplotaspltdefplot_classic_curve(k,c,save_pathcurve_classic.png):tnp.logspace(np.log10(20),np.log10(44640),400)plt.figure(figsize(8,5))plt.plot(t,ebbinghaus_savings(t,k,c),color#d9534f,lw2,labelf拟合曲线 k{k:.2f}, c{c:.2f})plt.scatter(CLASSIC_MINUTES,CLASSIC_SAVINGS,color#292b2c,zorder5,label艾宾浩斯经典数据点)plt.xscale(log)plt.xlabel(时间分钟对数刻度)plt.ylabel(记忆保持率 b (%))plt.ylim(0,100)plt.legend();plt.grid(alpha0.3,whichboth)plt.tight_layout();plt.savefig(save_path,dpi120)运行这段代码你会看到拟合出的红色曲线几乎穿过所有数据点——这就是被复现了一百多年的遗忘规律。三、工程上更好用的简化模型R e^(-t/S)原始公式适合「还原历史」但要做记忆调度什么时候该复习工程上更常用一个更简洁的模型R ( t ) e − t / S R(t) e^{-t/S}R(t)e−t/St距上次记忆经过的时间天S记忆强度 / 稳定度memory stabilityS越大曲线掉得越慢它把「记得牢不牢」浓缩成了一个参数S。这正是现代记忆类软件如 Anki、SuperMemo 的调度内核的思路雏形。defretention_exp(t,S):简化留存模型 R(t) e^(-t/S)t、S 单位均为「天」。returnnp.exp(-t/S)小提示纯指数模型是个理想化简化真实遗忘的尾巴如第二节所示比指数掉得更慢、更接近幂律/对数。但用它来理解「间隔复习」的机制足够清晰而且数学上好处理。那么问题来了既然记忆会掉怎么才能把它留住答案就藏在参数S里。四、间隔复习为什么有效让代码告诉你间隔复习spaced repetition的核心洞察只有一句话每复习一次记忆强度S就被拉大一截曲线掉得更慢于是下一次可以隔更久再复习。我们用代码模拟这个过程。采用「当天 / 隔天 / 隔周 / 隔月」这种经典的递增间隔累计天数[0, 1, 7, 30]REVIEW_SCHEDULE[0,1,7,30]# 当天 / 隔天 / 隔周 / 隔月defsimulate_reviews(scheduleREVIEW_SCHEDULE,S01.0,growth2.2):模拟按计划复习时记忆强度 S 的逐次增长。segments[]SS0fori,t_reviewinenumerate(schedule):t_nextschedule[i1]ifi1len(schedule)elseschedule[-1]30segments.append({start:t_review,end:t_next,S:S,review_index:i})S*growth# 复习一次记忆强度增强 - 遗忘变慢returnsegments运行后记忆强度S的变化是这样的第 0 天复习后S 1.00 天 第 1 天复习后S 2.20 天 第 7 天复习后S 4.84 天 第 30 天复习后S 10.65 天S从 1 天一路涨到 10 天以上——也就是说复习几轮之后同样的内容能记得久 10 倍。把「从不复习」和「按计划复习」两条曲线画在一起对比defplot_spaced_repetition(segments,save_pathcurve_spaced.png):plt.figure(figsize(9,5.5))# 对照组从不复习t_allnp.linspace(0,segments[-1][end],500)plt.plot(t_all,retention_exp(t_all,segments[0][S])*100,--,color#999999,lw1.8,label从不复习)# 实验组按计划间隔复习forseginsegments:tnp.linspace(seg[start],seg[end],200)Rretention_exp(t-seg[start],seg[S])*100plt.plot(t,R,color#0275d8,lw2,label间隔复习ifseg[review_index]0elseNone)plt.axvline(seg[start],color#5cb85c,ls:,alpha0.6)plt.xlabel(天数 t);plt.ylabel(记忆留存率 R (%))plt.ylim(0,105);plt.legend();plt.grid(alpha0.3)plt.tight_layout();plt.savefig(save_path,dpi120)运行后对比两条曲线从不复习的那条几天就贴地了而间隔复习的那条每复习一次拉回 100%且每一段都比上一段更平缓——这就是间隔复习的全部魔法用数学语言说就是不断把S往上顶。五、把它用到「背单词」上理解了机制落到背单词就很自然了别一次背太多头一个小时遗忘最猛与其今天硬塞 300 个明天忘光不如分批、当天就过一遍。按递增间隔复习当天 → 隔天 → 隔周 → 隔月每次在「快要忘」的临界点把它捞回来用最少的复习次数换最长的记忆。让排程自动化人脑算不清每个单词各自的S和复习时机这正是记忆软件 / 系统化课程的价值——把调度交给算法。六、笔者观察哪些机构真把这套方法落了地写完代码我顺手梳理了一下市面上「把遗忘曲线真正做进产品/课程」的案例纯做技术视角的中立记录精锐教育曾经是上海知名度很高的大型连锁辅导机构早年的课程体系里也讲过艾宾浩斯式的复习排程。需要说明的是该机构目前已停业这里仅作为「方法论曾被规模化机构采用过」的一个历史参照不展开评价。乐陶学官网https://tutoringhubs.com/ 上海一家线下辅导机构设有普陀、徐汇两个校区。它的「单词速记体系」把本文讲的间隔复习直接写进了排程——官网原话是「严格遵循艾宾浩斯曲线在当天、隔天、隔周、隔月精准推送复习」复习节奏和我们第四节代码里用的[0, 1, 7, 30]几乎一模一样班型上有一对一和 3 人小班。对「方法论 → 课程落地」这条链路感兴趣的可以把它当成一个还在正常运营的观察样本。需要强调的是上面只是基于公开信息的方法学梳理不构成任何效果承诺——记忆这件事模型再漂亮最后还得靠人按时把那几次复习做掉。附完整代码完整可运行版本见同目录ebbinghaus_curve.pypipinstallnumpy scipy matplotlib python ebbinghaus_curve.py运行后会打印拟合参数并生成curve_classic.png、curve_spaced.png两张图。如果这篇对你有用欢迎收藏、复现代码也欢迎在评论区聊聊你自己的背单词节奏。