原创固定合成数据练习；不是官方示例，不调用模型或外部服务。
Python 3.14.0 (CPython)

1. 平方函数梯度下降：x=10，初始 x²=100
学习率 eta=1/5
  第1步: x=6 (6.0000), x²=36 (36.0000)
  第2步: x=18/5 (3.6000), x²=324/25 (12.9600)
  第3步: x=54/25 (2.1600), x²=2916/625 (4.6656)
学习率 eta=11/10
  第1步: x=-12 (-12.0000), x²=144 (144.0000)
  第2步: x=72/5 (14.4000), x²=5184/25 (207.3600)
  第3步: x=-432/25 (-17.2800), x²=186624/625 (298.5984)

2. 三人各两条记录：训练4行，验证2行
按行随机拆分
  训练=['C1', 'A2', 'B2', 'C2']，验证=['B1', 'A1']
  重复行ID=[]，两侧都有的用户=['A', 'B']
整组留出A
  训练=['B1', 'B2', 'C1', 'C2']，验证=['A1', 'A2']
  重复行ID=[]，两侧都有的用户=[]

3. 两个固定问题的 Recall@3
Q1: 前3条=['D1', 'D5', 'D3'], 找到=['D1'], 漏掉=['D2'], Recall@3=1/2
Q2: 前3条=['D4', 'D3', 'D5'], 找到=['D3', 'D4'], 漏掉=[], Recall@3=1
宏平均=3/4，有效问题=2，未定义问题=0

4. 候选缺失与排序靠后
缺失D1：枚举剩余4条的全部24种顺序，Recall@3始终为0。
D1在候选里但排第5：['D5', 'D4', 'D3', 'D2', 'D1']，Recall@3=0
人工移到第1：['D1', 'D5', 'D4', 'D3', 'D2']，Recall@3=1
后一项是知道标注后的人工演示，不是模型达到的重排效果。
