2022-04-10 週記
本週六極速「線上」看房,週日極速簽約搞定下半年居所問題。剩下的就是搬家相關的事情了。
專科考試準備進度
通過如下的 dataview 模板,計算以及做了的題目數量,差不多是 1/4 多一些,實在是太落後了。雖然一部分題目通過 space repetition 看了好幾次。目前的策略依然不變,也就是通過記憶卡來避免遺忘(前功盡棄),但是要更加的「專注」於做卡、解卡。
TABLE length(rows) as Number
FROM "Radiology"
WHERE contains(file.name, "CE 20") and category
SORT file.name
GROUP BY true
SM-2 演算法
參考的是如下 repo:Explanation of the SM-2 spaced repetition algorithm。簡單來說,SM-2 算法是包括 Anki 在內的多數閃卡軟體所採用的卡片權重計算機制,用來評估使用者對一張卡片的熟悉程度,據此決定需要在多久時間進行複習以維持最大的記憶效力。
- q: user grade 使用者自覺熟悉程度,0 最低(完全忘記),5 最高(輕而易舉)
- n: repetition number 成功複習的次數
- EF: easiness factor 容易程度 - 越容易,間隔就越久
- I: interval 下次複習間隔
def SM2(q, n, EF, I):
if q >= 3:
if n = 0:
I = 1
elif n = 1:
I = 6
else:
I = round(I * EF) # 四捨五入取整數天數
else:
n = 0
I = 1
EF = EF + (0.1 − (5 − q) × (0.08 + (5 − q) * 0.02))
EF = 1.3 if EF < 1.3 else EF
return (n, EF, I)
大概就是根據熟悉程度決定分數以及下次複習間隔,然而最關鍵的 EF 分數調整我還是沒有看懂為什麼那樣設計。Obsidian 的 spaced repetition 相對簡化了許多(答題只有難、中、易三個選項)。我自己是如果完全忘了會選擇重置進度(reset)。下面的 TypeScript 是此插件的核心部分算法:
- Easy(綠):ease + 20
- Good(藍):ease 分數不變
- Hard(紅):ease - 20(最低 130)
然後據此重新計算 interval 間隔天數。
if (response === ReviewResponse.Easy) {
ease += 20;
interval = ((interval + delayBeforeReview) * ease) / 100;
interval *= settingsObj.easyBonus;
} else if (response === ReviewResponse.Good) {
interval = ((interval + delayBeforeReview / 2) * ease) / 100;
} else if (response === ReviewResponse.Hard) {
ease = Math.max(130, ease - 20);
interval = Math.max(
1,
(interval + delayBeforeReview / 4) * settingsObj.lapsesIntervalChange
);
}