根据先前的统计数据获取测验中下一个问题的公式
Formula to get next question in quiz basing on previous statistics
我的目标是通过使用以前答案的统计数据动态确定测验中的下一个问题
所以,我有:
- 题目难度字段 (1-100)
- 你能得到的最高分数(假设是256)
- 分数用户已达到问题(x out of max)
我想以某种方式在公式中组合这些参数来为用户选择最合适的下一个问题
我该怎么做?
我的想法是给用户一个中等难度的问题作为第一个问题,然后检查用户得分是否低于最大值的 50%,然后获得难度为 25% 的问题,否则获得 75% 的问题。然后在较小的范围内重复此模式(25-50 个百分点或 50-75 个百分点等等)
让我们假设玩家有一个固定函数 score = f(difficulty)
为每个难度给出预期得分百分比。一旦我们知道了这个函数,我们就可以反转它并找到会给我们想要的预期分数的难度级别。
但是,功能未知。但是我们以我们之前的问题的形式有这个功能的样本。因此,我们可以为这些样本拟合一个函数。如果您了解依赖关系的形式,则可以将该知识包含在拟合函数的形状中。我将简单地假设一个截断的线性函数:
score = f(difficulty) = max(0, min(m * difficulty + n, 1))
我们需要找到的两个参数是m
和n
。如果我们删除用户得分为 100% 或 0% 的所有示例问题,我们可以忽略截断。然后,我们有一个构成线性方程组的样本列表:
score1 = m * difficulty1 + n
score2 = m * difficulty2 + n
score3 = m * difficulty3 + n
...
这个系统通常不会有解决方案。因此,我们可以求解最小二乘解。为此,我们将逐步构建一个 2x2 矩阵 A
和一个表示系统 A * x = b
的二维向量 b
。我们将从零矩阵和零向量开始。对于每个问题,我们将更新:
/ A11 A12 \ += / difficulty * difficulty difficulty \
\ A21 A22 / \ difficulty 1 /
/ b1 \ += / difficulty * score \
\ b2 / \ score /
一旦我们添加了至少两个问题,我们就可以解决:
m = (A12 * b2 - A22 * b1) / (A12 * A12 - A11 * A22)
n = (A12 * b1 - A11 * b2) / (A12 * A12 - A11 * A22)
我们可以找到 P
的预期分数的难度为:
difficulty = (P - n) / m
我们来举个例子。下面table包含了几个问题以及添加问题后的功能状态。
diff score | A11 A12 A22 b1 b2 | m n
--------------+----------------------------+-------------
70 0.3 | 4900 70 1 21 0.3 |
50 0.4 | 7400 120 2 41 0.7 | -0.005 0.65
40 0.5 | 9000 160 3 61 1.2 | -0.006 0.74
35 0.7 | 10225 195 4 85.5 1.9 | -0.010 0.96
这里是拟合函数和示例问题:
如果我们想找到预期分数的难度,例如75%,我们得到:
difficulty(0.75) = 21.009
我的目标是通过使用以前答案的统计数据动态确定测验中的下一个问题
所以,我有:
- 题目难度字段 (1-100)
- 你能得到的最高分数(假设是256)
- 分数用户已达到问题(x out of max)
我想以某种方式在公式中组合这些参数来为用户选择最合适的下一个问题
我该怎么做?
我的想法是给用户一个中等难度的问题作为第一个问题,然后检查用户得分是否低于最大值的 50%,然后获得难度为 25% 的问题,否则获得 75% 的问题。然后在较小的范围内重复此模式(25-50 个百分点或 50-75 个百分点等等)
让我们假设玩家有一个固定函数 score = f(difficulty)
为每个难度给出预期得分百分比。一旦我们知道了这个函数,我们就可以反转它并找到会给我们想要的预期分数的难度级别。
但是,功能未知。但是我们以我们之前的问题的形式有这个功能的样本。因此,我们可以为这些样本拟合一个函数。如果您了解依赖关系的形式,则可以将该知识包含在拟合函数的形状中。我将简单地假设一个截断的线性函数:
score = f(difficulty) = max(0, min(m * difficulty + n, 1))
我们需要找到的两个参数是m
和n
。如果我们删除用户得分为 100% 或 0% 的所有示例问题,我们可以忽略截断。然后,我们有一个构成线性方程组的样本列表:
score1 = m * difficulty1 + n
score2 = m * difficulty2 + n
score3 = m * difficulty3 + n
...
这个系统通常不会有解决方案。因此,我们可以求解最小二乘解。为此,我们将逐步构建一个 2x2 矩阵 A
和一个表示系统 A * x = b
的二维向量 b
。我们将从零矩阵和零向量开始。对于每个问题,我们将更新:
/ A11 A12 \ += / difficulty * difficulty difficulty \
\ A21 A22 / \ difficulty 1 /
/ b1 \ += / difficulty * score \
\ b2 / \ score /
一旦我们添加了至少两个问题,我们就可以解决:
m = (A12 * b2 - A22 * b1) / (A12 * A12 - A11 * A22)
n = (A12 * b1 - A11 * b2) / (A12 * A12 - A11 * A22)
我们可以找到 P
的预期分数的难度为:
difficulty = (P - n) / m
我们来举个例子。下面table包含了几个问题以及添加问题后的功能状态。
diff score | A11 A12 A22 b1 b2 | m n
--------------+----------------------------+-------------
70 0.3 | 4900 70 1 21 0.3 |
50 0.4 | 7400 120 2 41 0.7 | -0.005 0.65
40 0.5 | 9000 160 3 61 1.2 | -0.006 0.74
35 0.7 | 10225 195 4 85.5 1.9 | -0.010 0.96
这里是拟合函数和示例问题:
如果我们想找到预期分数的难度,例如75%,我们得到:
difficulty(0.75) = 21.009