NB-2 — parameetri tundlikkus
vaikeväärtused 0,2 / 0,1 / 0,1 / 0,2 ei ole maagiline ega kõverale sobiv mütoloogia. See märkmik murdab iga nupu ja näitab, mis klõpsab.
Seadistamine
Jaotis «Seadistamine»import numpy as npimport matplotlib.pyplot as pltfrom itertools import product
def bkt_update(pL, observed, p): pS, pG, pT = p['pSlip'], p['pGuess'], p['pTransit'] if observed: post = (pL * (1 - pS)) / (pL * (1 - pS) + (1 - pL) * pG) else: post = (pL * pS) / (pL * pS + (1 - pL) * (1 - pG)) return post + (1 - post) * pT
def trajectory(p, answers, pL0=None): pL = pL0 if pL0 is not None else p['pInit'] trace = [pL] for a in answers: pL = bkt_update(pL, a, p) trace.append(pL) return trace1. katse – “arvamuste usaldamine” ()
Jaotis «1. katse – “arvamuste usaldamine” (P(G)=0.5P(G) = 0.5P(G)=0.5)»Õpilane vastab õigesti kümme korda järjest.
defaults = {"pInit": 0.2, "pTransit": 0.1, "pSlip": 0.1, "pGuess": 0.2}broken_g = {**defaults, "pGuess": 0.5}
answers = [True] * 10t_def = trajectory(defaults, answers)t_brk = trajectory(broken_g, answers)
print(f"После 10 ✓ — defaults: P(L) = {t_def[-1]:.3f}")print(f"После 10 ✓ — P(G)=0.5: P(L) = {t_brk[-1]:.3f}")# defaults: 0.881 ← модель «поверила» в обучение# P(G)=0.5: 0.612 ← модель «угадывание объясняет всё», ученик не учитсяAadressil mudel umbusaldab õigeid vastuseid – isegi pärast kümmet kordaminekut ei jõua 0,7-ni. Õpilased teevad harjutusi igavesti.
2. katse – “lubade usaldamine” ()
Jaotis «2. katse – “lubade usaldamine” (P(S)=0.5P(S) = 0.5P(S)=0.5)»Sama õpilane, kümme valet vastust.
broken_s = {**defaults, "pSlip": 0.5}
answers = [False] * 10t_def = trajectory(defaults, answers)t_brk = trajectory(broken_s, answers)
print(f"После 10 ✗ — defaults: P(L) = {t_def[-1]:.3f}")print(f"После 10 ✗ — P(S)=0.5: P(L) = {t_brk[-1]:.3f}")# defaults: 0.072 ← модель видит «он не знает»# P(S)=0.5: 0.181 ← модель «слипа объясняет всё», даёт сложныеmudel umbusaldab vigu — isegi kümme ebaõnnestumist jätavad meisterlikkuse üle paisutatud. Nõrgad õppijad saavad ülesandeid, mis on liiga rasked – demoraliseerivad.
3. katse – “külmunud õppija” ()
Jaotis «3. katse – “külmunud õppija” (P(T)=0P(T) = 0P(T)=0)»no_transit = {**defaults, "pTransit": 0.0}
answers = [True] * 50t_def = trajectory(defaults, answers)t_brk = trajectory(no_transit, answers)
print(f"50 ✓ — defaults: P(L) = {t_def[-1]:.3f}")print(f"50 ✓ — P(T)=0: P(L) = {t_brk[-1]:.3f}")# defaults: 0.999 ← ученик может «учиться», достигает мастерства# P(T)=0: 0.998 ← BTW даже без transit достигает, через демонстрацию...# но: разница в скорости — defaults быстрееPeenus: ei keela kõrgele jõudmist – demonstratsioon tõstab siiski tõenäosust –, kuid kiirus kannatab ja varane trajektoor tasaneb.
fig, ax = plt.subplots(figsize=(8, 4))ax.plot(t_def, label='defaults (P(T)=0.1)', color='#9333ea', linewidth=2)ax.plot(t_brk, label='P(T)=0', color='#ef4444', linewidth=2, linestyle='--')ax.set_xlabel('шаг'); ax.set_ylabel('P(L)')ax.legend(); ax.grid(alpha=0.3)plt.show()4. katse – „hüperõppija” ()
Jaotis «4. katse – „hüperõppija” (P(T)=0.5P(T) = 0.5P(T)=0.5)»fast_transit = {**defaults, "pTransit": 0.5}
answers = [True] * 5t_def = trajectory(defaults, answers)t_brk = trajectory(fast_transit, answers)
print(f"5 ✓ — defaults: P(L) = {t_def[-1]:.3f}")print(f"5 ✓ — P(T)=0.5: P(L) = {t_brk[-1]:.3f}")# defaults: 0.628# P(T)=0.5: 0.981 ← осваивает за 3-4 правильных ответаpole koolimatemaatika jaoks realistlik – võib-olla sobib täiskasvanute tühiste mikrooskuste jaoks.
Heatmap — parameetrid × vastuste mustrid
Jaotis «Heatmap — parameetrid × vastuste mustrid»patterns = { 'все правильно': [True] * 10, 'все ошибки': [False] * 10, 'через один': [True, False] * 5, 'старт ошибками': [False] * 5 + [True] * 5, 'старт верно': [True] * 5 + [False] * 5,}configs = { 'defaults': defaults, 'P(G)=0.5': {**defaults, 'pGuess': 0.5}, 'P(S)=0.5': {**defaults, 'pSlip': 0.5}, 'P(T)=0': {**defaults, 'pTransit': 0.0}, 'P(T)=0.5': {**defaults, 'pTransit': 0.5},}
mat = np.zeros((len(configs), len(patterns)))for i, (cn, cp) in enumerate(configs.items()): for j, (pn, ans) in enumerate(patterns.items()): mat[i, j] = trajectory(cp, ans)[-1]
fig, ax = plt.subplots(figsize=(9, 4))im = ax.imshow(mat, cmap='RdYlGn', vmin=0, vmax=1, aspect='auto')ax.set_xticks(range(len(patterns))); ax.set_xticklabels(patterns.keys(), rotation=20)ax.set_yticks(range(len(configs))); ax.set_yticklabels(configs.keys())for i in range(mat.shape[0]): for j in range(mat.shape[1]): ax.text(j, i, f'{mat[i,j]:.2f}', ha='center', va='center', fontsize=9)plt.colorbar(im, label='итоговый P(L)')plt.title('Финальный P(L) после 10 ответов: параметры × паттерн')plt.tight_layout(); plt.show()Esita: pühkige
Jaotis «Esita: pühkige P(S),P(G)P(S), P(G)P(S),P(G)»Sama pSolve(pL) vidin nagu peatükk 4. Liugurite lohistamine — intuitsiooni kontroll: muudab joone kalde alla — suurem meisterlikkus vähendab lahendamise tõenäosust — jama.
Sirgjoon. P(solve) on P(L)=0 juures P(G) ja P(L)=1 juures 1−P(S). Tõus = 1−P(S)−P(G).
Takeaways
Jaotis «Takeaways»| Parameeter | Liiga madal | Liiga kõrge |
|---|---|---|
| uustulnukad näevad nõrgad välja → ülesanded on liiga lihtsad | esimesed ülesanded liiga rasked → frustratsioon | |
| “pole õppimist”, stagnatsioon | ebareaalselt kiire meisterlikkus | |
| usaldab iga õiget vastust — ajab meisterlikkuse segi õnnega | ei usalda kunagi vigu — nõrgad õppijad sunnitakse ülespoole | |
| ei usalda kunagi õigeid vastuseid → lõpmatu drill | vabandused pimedaks arvamiseks |
Miks vaikeseaded töötavad: Corbett & Anderson (1995) näitavad EM-iga sobitatud parameetreid kõigis domeeniklastrites ~0,1–0,3. Vaikimisi 0,2 / 0,1 / 0,1 / 0,2 asuvad selle keskuse lähedal.
Järgmine
Jaotis «Järgmine»- NB-3 — EM sobitamine (peagi): taastage parameetrid reaalsetest andmetest ilma arvamata.
- NB-1 – BKT nullist – baasrakendus, mis toetab iga katset.