news 2026/10/15 6:38:10

DINA认知诊断模型:从总分到知识点画像的题诊断研究

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
DINA认知诊断模型:从总分到知识点画像的题诊断研究

简介:这是一篇发表于《中国考试》2013年第1期的认知诊断DINA模型研究综述,作者为南京师范大学张潇、沙如雪,适合心理测量学、教育统计与个性化教学研究者阅读。资源以PDF格式提供,包含期刊原文共1个文件,压缩包约1.31MB,内容系统梳理DINA模型的原理、Q矩阵、失误与猜测参数,并重点介绍HO-DINA、P-DINA、G-DINA等改进方向,还结合分数减法认知属性示例说明模型应用方式。已有517人学习,适合作为认知诊断模型入门与论文写作参考,可帮助读者快速把握DINA模型从基础定义到前沿进展的整体脉络,并为后续开展相关实证研究提供文献线索。

1. 认知诊断DINA模型:从「总分90分」到「知识点画像」的题诊断研究

期末考试结束了,某班一名学生总分90分,应用题全对,「一元二次方程判别式」相关的四道选择题却全部做错。传统测验只报告一个总分,这个问题被完全掩盖。认知诊断DINA模型要解决的,不是把分数算得更准,而是把一次测验拆解成可解释的知识状态——每位被试到底掌握了哪几个属性,缺了哪几个。这类模型在过去十几年里成为教育测量与智能题库研究中最活跃的方向之一,而DINA是其中最经典、最适合当落地起点的那个:结构简单、参数可解释、R语言生态成熟。适合读这篇笔记的人有三类:做学业诊断研究的量化研究者、题库系统或自适应学习产品的算法工程师、以及正在为「怎么给学生出诊断报告」发愁的教研团队。前提是你手上有二值计分的作答数据,和一份大致靠谱的题目-知识图谱。

2. DINA模型机制拆解:Q矩阵、与门规则与两个噪声参数的由来

2.1 题目的知识画像:Q矩阵与理想作答向量

DINA全称是 Deterministic Input, Noisy AND gate,中文常译作「确定性输入、噪声与门模型」。名字里的每一个词都对应一个具体设计:Deterministic Input 指的是,在理想情况下(不考虑猜测和失误),被试能不能答对某道题是完全确定的,由他是否掌握题目涉及的全部属性决定;Noisy AND gate 则说明这个确定性规则被两个噪声参数污染,模型在「全或无」的理想作答外,允许犯错。

整个模型的第一个地基是 Q 矩阵。Q 是一个 J×K 的 0/1 矩阵,J 是题目数,K 是属性数(也就是知识点数或认知属性数)。第 j 行第 k 列取 1,表示题目 j 测查了属性 k;取 0 表示没测。比如一份 4 题、3 个属性的 Q 矩阵:

题目A1(概念理解)A2(公式记忆)A3(计算执行)
I1100
I2011
I3110
I4111

这个矩阵决定了两个关键东西:一是每道题需要哪些属性的组合,二是被试的属性向量 α_i 如何映射到理想作答。属性向量是每位被试的 K 维 0/1 向量,α_ik = 1 表示被试 i 掌握了属性 k。理想作答 η 的计算规则是「与门」:只有被试掌握了题目 j 所要求的全部属性,η_ij 才等于 1,否则为 0。公式写作:

$$\eta_{ij} = \prod_{k=1}^{K} \alpha_{ik}^{q_{jk}}$$

这个连乘看起来抽象,实际就是「缺一不可」。题目 I4 同时要求三个属性,那么只掌握其中两个的被试,理想作答就是 0。这是 DINA 与后面要提的 DINO 最本质的区别,也是它名字里 AND gate 的来源。建模之前先问自己一句:我设计的题目是不是真的满足「缺一不可」?如果某道题掌握了任意一个属性都有较大概率做出来,那它就不适合用 DINA 描述。

2.2 两个噪声参数如何刻画「会而不对、不会而蒙」

有了理想作答 η,模型还远没有结束,因为真实作答和理想作答之间总有偏差。有人掌握了全部属性但粗心算错,有人一个属性都没掌握但蒙对了选项。DINA 用两个题目参数分别刻画这两种情况:

  • 失误参数 s_j:被试掌握了题目要求的所有属性,却答错的概率;
  • 猜测参数 g_j:被试没有掌握全部要求属性,却答对的概率。

于是被试 i 在题目 j 上答对的概率可以写成很对称的形式:

$$P(X_{ij}=1 \mid \alpha_i) = (1 - s_j)^{\eta_{ij}} , g_j^{,1 - \eta_{ij}}$$

当 η=1 时,答对概率是 1 - s_j;当 η=0 时,答对概率是 g_j。这两个参数合在一起,构成了 DINA 的完整似然。每条题目只有两个参数,所以 DINA 是认知诊断模型族里参数最节俭的一类,样本量要求相对友好。落地时有个经验判据值得记下来:g_j + s_j 越接近 1,这道题提供的信息越少;当 g + s 超过 0.5 时,被试答对与否和是否掌握属性几乎没关系了。我自己做估计时,第一步永远是看 item 参数表里有没有 g 和 s 相加接近甚至超过 0.5 的题,这种题要么是题目表述有问题,要么是 Q 矩阵标定错了。

2.3 从DINA到DINO、G-DINA:模型族怎么选

DINA 只是认知诊断模型族中的一员。理解它为什么被称作「研究进展的起点」,需要把它和邻近模型放在一起看。DINO(Deterministic Input, Noisy OR gate)把「与门」换成「或门」:只要掌握了题目要求的任意一个属性,理想作答就是 1。对应到现实场景,就是「会其中一个方法就能解题」的题目,比如一道题既可以用代入法也可以用排除法,两种知识技能任一掌握都能做出来。DINO 的参数结构同样是每道题两个参数,但理想作答的计算完全不同,用错模型会导致参数估计整体偏移,而不是某个值错了。

再往上走是 G-DINA(Generalized DINA),它不再预设「与门」或「或门」,而是把每个属性及其交互项都放进线性展开里,让数据自己说话。G-DINA 里 DINA 只是其中一个特殊情形——只保留形如 α_1α_2...α_K 的最高阶交互相,其余项系数不参与。实际选型时,我的习惯是:样本量在 500 以上且不确定题目机制,就用 G-DINA 作为基准,再看简化成 DINA 后拟合是否明显变差;样本量只有两三百,优先 DINA,因为它的参数少,估计稳定性明显更高。下面用一张表总结这几个模型的差异:

模型理想作答规则适用题目特征每题目参数个数
DINA与门,缺一不可综合性强的题目,技能不可替代2
DINO或门,任一即可解题方法可替换2
ACDM属性线性可加各属性独立贡献答对概率K+1
G-DINA完全展开含交互机制不确定时优先尝试最多 2^K

研究进展的脉络也很清晰:先有 DINA 这类简洁模型,然后被推广到 G-DINA 这样的统一框架,再往高阶扩展出带高阶潜变量的模型、允许属性连续掌握的部分掌握模型、以及处理多次测评的动态认知诊断模型。对新入门的人来说,直接追最新的模型等于跳过了地基,建议从 DINA 跑通全流程,再把同样的 Q 矩阵丢给 G-DINA 做对比,至少能在一天内看到「更复杂的模型是否值得」。

3. 搭好数据底座:作答矩阵、Q矩阵编码与模拟数据生成

3.1 最小可运行的数据形态:dat 与 q.matrix 的组织规范

R 里所有认知诊断包(无论 CDM 还是 GDINA)对数据的要求都大同小异,最少需要两个对象:作答矩阵和 Q 矩阵。作答矩阵习惯命名为 dat,行是被试,列是题目,取值只有 0 和 1,1 表示答对;Q 矩阵行是题目,列是属性,1 表示该题测查该属性。这个方向不能搞反,否则一切计算都是错的。我第一次上手时就是把 Q 矩阵转置之后直接传进去,结果模型跑了很久不收敛,后来才发现是行列方向反了。

两个矩阵之间还有一个硬性约定:dat 的列名必须和 Q 矩阵的行名完全一致。换句话说,作答矩阵里第一列的题目 ID,必须能在 Q 矩阵的行名里找到对应条目。这个约定看上去简单,实际很容易翻车,尤其是从 Excel 或 CSV 读入数据时,表格的行名可能被悄悄改成了数字。读取后第一件事就是做一致性检查,我一般直接在代码里写一个 stopifnot 断言:

dat <- read.csv("answer.csv", row.names = 1) # 行是被试ID Q <- read.csv("qmatrix.csv", row.names = 1) # 行是题目ID # 检查:题目一致且顺序一致 stopifnot(identical(colnames(dat), rownames(Q))) # 检查:Q矩阵不能有全零行,不允许出现不测任何属性的题目 stopifnot(all(rowSums(Q) > 0))

这段代码的逻辑是先用 row.names = 1 保证读进来的行名是 ID 而不是默认的数字序号,然后用 identical 比对两个矩阵的行列名。注意这里用的是 identical,要求完全一致且顺序一致,而不是用 %in% 只判断「都存在」。因为认知诊断模型假设 Q 矩阵第 j 行就是数据第 j 列对应题目的属性编码,顺序错位不会报错,但估计结果全错,属于最典型的「静默翻车」。

3.2 属性层级怎么标:线性、收敛、发散三种结构的矩阵写法

Q 矩阵只描述了「题目测了什么」,但属性之间往往不是互相独立的。比如「计算执行」以「公式记忆」为前提,那一个被试被估计为「掌握计算执行但没掌握公式记忆」就不符合认知逻辑。这种先决关系叫属性层级,在建模时不该被忽略。常见的层级结构有三种:线性型、收敛型、发散型。

线性型意味着属性一条链式递进,A1 是 A2 的前提,A2 是 A3 的前提,合法的属性模式只有 4 种而不是 8 种,少了所有「跳级」的组合。收敛型是多个前提属性汇聚到一个高层属性,发散型则是一个公共前提分别通向多个后继。无论哪种结构,处理方式都是在拟合时传入一个合法模式集合,把不合逻辑的属性模式排除掉。

# 以3个属性、线性层级 A1 -> A2 -> A3 为例 legal_patterns <- matrix( c(0,0,0, 1,0,0, 1,1,0, 1,1,1), ncol = 3, byrow = TRUE, dimnames = list(NULL, c("A1", "A2", "A3")) ) # 在 din() 中通过 skillclasses 参数约束合法模式空间 res <- CDM::din(dat = dat, q.matrix = Q, skillclasses = legal_patterns)

这里 skillclasses 参数接受一个 2^K 的合法模式子集,每一行是一个允许出现的属性模式。加上约束之后,估计结果里不会出现「跳级」的画像,这也让输出更符合教学常识。不过有一点要提醒:层级结构如果标错,等价于给模型加了错误的约束,比不加约束更糟。稳妥做法是先跑一个不加约束的模型,看估计出的属性模式里有多少比例落在合法集合外;如果比例很低,说明数据本身支持层级假设,再正式加入约束。

3.3 先用模拟数据验证估计器:一套可复现的生成代码

在拿真实数据拟合之前,强烈建议先用模拟数据跑通一遍流程:给定真实的 Q 矩阵、真实的属性分布和真实的 g/s 参数,按 DINA 机制生成作答数据,再去拟合,看估计值能否回到真实值附近。这个过程能同时验证你的数据格式是否正确、代码链路是否通畅、对输出字段的理解是否准确。下面是一套可以直接复制运行的模拟代码:

set.seed(20240601) # 固定随机种子,结果可复现 K <- 4 # 属性个数 J <- 12 # 题目个数 N <- 500 # 被试人数 # 1) 生成属性向量:每个属性独立地以0.5概率被掌握 alpha <- matrix(rbinom(N * K, size = 1, prob = 0.5), nrow = N, ncol = K) colnames(alpha) <- paste0("A", 1:K) # 2) 设计Q矩阵:单属性、双属性、三属性、四属性题混合 Q <- matrix(0, nrow = J, ncol = K, dimnames = list(paste0("I", 1:J), paste0("A", 1:K))) Q[1, 1] <- 1 # 单属性题 Q[2, 2] <- 1 Q[3, 3] <- 1 Q[4, 4] <- 1 Q[5, c(1, 2)] <- 1 # 双属性题 Q[6, c(2, 3)] <- 1 Q[7, c(3, 4)] <- 1 Q[8, c(1, 4)] <- 1 Q[9, c(1, 2, 3)] <- 1 # 三属性题 Q[10, c(1, 3, 4)] <- 1 Q[11, c(2, 3, 4)] <- 1 Q[12, c(1, 2, 3, 4)] <- 1 # 四属性题 # 3) 设置每题真实参数,范围控制在0.05~0.15之间 s <- runif(J, 0.05, 0.15) # 失误参数 g <- runif(J, 0.05, 0.15) # 猜测参数 # 4) 计算理想作答:与门规则 eta <- matrix(0, nrow = N, ncol = J) for (j in 1:J) { req <- which(Q[j, ] == 1) # 第j题考察哪些属性 eta[, j] <- as.numeric( rowSums(alpha[, req, drop = FALSE]) == length(req) ) } # 5) 按题目参数生成作答 Y <- matrix(0, nrow = N, ncol = J, dimnames = list(paste0("stu", 1:N), paste0("I", 1:J))) for (j in 1:J) { p <- ifelse(eta[, j] == 1, 1 - s[j], g[j]) Y[, j] <- rbinom(N, size = 1, prob = p) }

这段代码的关键在第 4 步:对每道题,先找出它要求的属性列,再逐个被试检查这些列上是否全部为 1,全部为 1 才记录理想作答为 1。drop = FALSE 是为了防止 Q 矩阵某行只有一个 1 时,取出的子矩阵退化成向量导致 rowSums 报错。第 5 步里 ifelse 是对向量化的熟练运用——eta 为 1 的被试按失误概率答错,eta 为 0 的按猜测概率答对。生成完数据后,你可以把真实 g/s 存下来,后面拟合完对比看看差了多少,这是验证整个流程是否走通的黄金标准。

4. 跑通DINA估计:CDM包的完整命令链与参数解读

4.1 首跑命令:din()最小调用与关键输出字段

R 里拟合 DINA 最常用的是 CDM 包,它同时支持 DINA、DINO、G-DINA 等多个模型,接口统一。最小调用只需要把作答矩阵和 Q 矩阵传进去:

library(CDM) res <- CDM::din(dat = Y, q.matrix = Q, maxit = 500) summary(res)

din() 的核心参数就三个:dat 传入二值作答矩阵,q.matrix 传入 Q 矩阵,maxit 控制 EM 算法最大迭代次数。运行结束后,summary(res) 会显示模型的对数似然、题目参数估计值和属性掌握比例。初次跑通后,先别急着看别的,直接看 res$item 这个字段,它是题目参数的估计结果表。

# 查看每题估计的猜测与失误参数 round(res$item, 3)

res$item 是一个 J 行、多列的矩阵,核心列包含 guess(g 的估计值)、slip(s 的估计值)以及它们的标准误。把这几列和模拟时设置的真实值对比,如果偏差在 0.03 以内说明估计链路正常;如果 g/s 明显偏离真实值甚至跑到 0.5 以上,就要回去检查 Q 矩阵和数据的列名匹配了。我在模拟验证时习惯把真实 g/s 用 cbind 和估计值放同一张表里,一眼就能看出哪些题目估计得不准。

4.2 把结果变成画像:MAP属性模式与后验概率的用法

DINA 估计完成后,模型给出的不仅是几个参数,每个被试还会得到一个属性模式。输出对象中的 attribute 字段直接给出了每一位被试最可能的 0/1 属性画像,这是后端出报告最直接的输入:

# 取出每位被试的MAP属性模式 profile <- res$attribute head(profile, 10) # 统计每种属性画像的人数分布 apply(profile, 1, paste, collapse = "") |> table() |> sort(decreasing = TRUE)

attribute 字段的行对应被试,列对应属性,取值 0 或 1。第二段代码把每一行的画像拼成 A1A2A3A4 这样的字符串再计数,能快速看到样本里最多的掌握类型是哪些。比如结果里「1111」占了 320 人,「0000」只有 15 人,说明这批被试整体掌握情况较好。

不过要注意,MAP 只是按后验概率取最大值,它不告诉你这个最大值有多可靠。一个被试在两个属性模式上的后验概率分别是 0.49 和 0.48,MAP 会硬把他分到前者,但实际他对自己的状态几乎不确定。更稳妥的做法是同时看 posterior 字段里「第二大概率」有多大。如果最大和第二大的差距小于 0.1,这类被试的画像就属于边界个案,出诊断报告时应降低结论强度,或者在报告中标注「状态存疑」。

4.3 参数调整:迭代上限、随机种子、合法模式约束

第一次跑完如果结果看起来不对劲,最常见的原因是 EM 算法没有收敛,或者收敛到了局部极值。这时要检查的首先是 maxit 是否足够。默认值在某些版本里偏保守,数据复杂时容易提前停止。我一般把 maxit 设为 500,并且把 progress 参数打开,观察每一轮的对数似然是否还在明显下降:

res <- CDM::din(dat = Y, q.matrix = Q, maxit = 500, progress = TRUE)

progress = TRUE 会在控制台实时打印迭代过程的似然值。如果最后一轮似然相比前一轮的变化还超过 conv.crit 的数量级,说明迭代不够,把 maxit 往上加到 1000 再跑。另一个隐蔽问题是随机种子。EM 算法如果初始化方式带随机性,不同种子可能给出略微不同的结果。但 CDM 包本身默认初始化较稳定,真正需要关心的是你自己在模拟数据环节的种子设置,保证复现一致。

参数调整里还有一个容易被忽略的入口:前一章提到的 skillclasses 合法模式约束。真实数据中属性之间存在先决关系时,把合法模式集合传进去,模型的自由参数会减少,小样本下估计更稳健。需要提醒的是,加约束后不能直接和未加约束的模型比对数似然,因为两个模型的复杂度不同,要比较信息准则或做似然比检验,而不是看谁似然更大。

5. DINA落地排查清单:本地复现最容易翻车的五个环节

5.1 报错「列名不匹配」:dat 与 Q 矩阵的行列名核对

现象:运行 din() 时报错,提示找不到某个题目 ID,或者提示数据列名与 Q 矩阵行名不一致。原因几乎都是同一类:读入 CSV 时没有指定 row.names,或者原始表里题目 ID 列被当作普通数据列读进来了。这种情况下 dat 的列名可能是 X1、X2 这类自动生成的编号,而 Q 矩阵的行名是 I1、I2,两者对不上。解决方法是回到读取步骤统一 ID:

dat <- read.csv("answer.csv", row.names = 1, check.names = FALSE) Q <- read.csv("qmatrix.csv", row.names = 1, check.names = FALSE) # 命名不一致时先统一顺序 common_id <- intersect(colnames(dat), rownames(Q)) dat <- dat[, common_id] Q <- Q[common_id, , drop = FALSE]

check.names = FALSE 的作用是防止 R 把 I1 这类列名自动改成带前缀的合法变量名。统一顺序那两行是为了兼容「数据列更多」或「Q 矩阵行更多」的情况,保证两组题目完全对齐。

5.2 Q矩阵标定依赖主观判断:同一道题不同人标出不同结果

现象:同一个数据集,换个标定者重新写一份 Q 矩阵,估计出的被试掌握比例差很多。原因在于 Q 矩阵本来就是专家判断的结果,同一道题到底是「只测 A1」还是「测 A1 和 A3」,不同教研人员经常有分歧,而 DINA 对 Q 矩阵错误非常敏感,一个属性标错会连带影响所有涉及该属性的题目和被试。这也是认知诊断领域把 Q 矩阵修正单独做成一个研究方向的原因。

解决思路是把 Q 矩阵当作可迭代的对象而不是一次性定稿。常见做法是让两位教研人员独立标定,对不一致的题目逐个讨论;对于拿不准的题目,分别用两版 Q 矩阵跑模型,比较 AIC/BIC,再看估计出的 g/s 是否合理。如果某道题在某一版 Q 矩阵下 g 或 s 特别大,往往说明这版标定有问题。这步虽然费时间但值得做,因为 Q 矩阵错了,后面的报告再精美都是错的。

5.3 小样本下参数漂移:规律与缓解策略

现象:被试人数只有 100 左右时,估计出的 g/s 忽高忽低,换一组被试结果差异很大,属性画像也不稳定。原因很直接:DINA 虽然参数少,但每个被试贡献的信息量有限,尤其是那些只有单属性题覆盖的属性,样本量不足时后验分布尖锐不起来。这属于模型信息量问题,不是代码 bug。

缓解策略按优先级排序:首先增加样本量,N 低于 200 的 DINA 结果只能当探索性参考;其次考虑减少属性数量,把标定过细的属性合并,比如「公式记忆」和「概念理解」如果高度相关,合并成一个属性能显著降低模型复杂度;最后可以改用带先验的贝叶斯估计思路,给 g/s 加 Beta 先验,把参数拉回合理区间。实际项目中,我见过不少团队用 Q 矩阵 + 300 个被试的数据强行跑 DINA 出了报告,里面的画像可信度很低。遇到样本量不足,宁可用规则法直接按题目得分率给用户做粗粒度提示,也比给一个看似精确实则漂移的画像好。

5.4 把DINA当万能模型:AND门假设的适用边界

现象:模型拟合指标还行,但部分被试的画像明显不符合常理——比如一个学生被标成「未掌握 A2 公式记忆」,可是他在只考 A2 的题目上全部答对。这时候往往不是估计错了,而是模型假设和题目机制不一致:如果那道题实际上只要会一点 A2 就能做,或者可以用 A3 的方法替代,DINA 的「缺一不可」就不成立。

这类问题的根子不在统计而在题目设计。DINA 的 AND 门假设意味着每道题的所有属性缺一不可,且属性内部没有部分掌握。如果实际题目中存在「方法替代」「部分给分」「渐进式推理」,那用 DINO 或 G-DINA 更合理。判断方法也很简单:把每道题的 g 和 s 估计出来,如果某题 g 特别高,可能意味着「没有掌握全部属性也能做对一部分」,也就是 AND 门被违反了。解决路径是重新审视题目,或者换模型族,而不是硬调参数。

5.5 版本差异与换包风险:CDM 与 GDINA 对象结构不同

现象:网上两份教程,一份用 CDM 包,一份用 GDINA 包,代码看着差不多,混着用就报错,比如取不到某个字段,或者 anova 方法失效。原因在于这两个包虽然都做认知诊断,但输出对象的类结构完全不同,CDM 的 din() 返回对象和 GDINA 包的 GDINA() 返回对象不是同一套接口。GDINA 包功能更新快,支持更多变体模型,但对 DINA 的输出字段命名方式与 CDM 不一致。

我的习惯是:一个项目只选一个包,不要混合调用。做标准 DINA 且需要 G-DINA 对比时,首选 CDM 包,因为它用一套函数覆盖多个模型;需要用到 GDINA 包独有的自定义模型或更新算法时,就全程用 GDINA。切换包时先运行 names() 或 str() 查看对象结构,再写提取字段的代码。两个包导出的同名函数存在冲突时,显式用 包名::函数名 的方式调用,避免后加载的包屏蔽前一个包。

6. 模型验证不要只看拟合指标:DINA结果可靠性的三条实用检查

6.1 一把尺子:g+s 越接近 0.3 越要警惕题目质量

模型估计完成后,我做的第一件事不是看被试画像,而是拿一张纸列出每道题的 g 和 s,算它们的和。这是一个非常有信息量的单一指标:g + s 接近 0.5,意味着答对概率几乎与是否掌握无关,题目严重失效;g + s 在 0.3 附近,这道题基本可以判定有问题。用法很简单,直接在 R 里算:

item <- res$item item$gs <- item$guess + item$slip print(item[order(item$gs, decreasing = TRUE), ])

如果发现某题 gs 超过 0.4,优先检查这道题的 Q 矩阵标定是否合理,其次考虑题目本身是否存在歧义。这个步骤不需要任何额外工具,却能把「模型整体拟合不错」背后的单题问题挖出来。

6.2 一边看拟合一边看实际效标:可落地的验证流程

模型选择上,可以把 DINA 和 G-DINA 同时拟合,用 anova 做似然比检验,DINA 是 G-DINA 的约束版本,嵌套关系成立:

res_dina <- CDM::din(dat = Y, q.matrix = Q) res_gdina <- CDM::gdina(dat = Y, q.matrix = Q) anova(res_dina, res_gdina)

输出结果里 p 值显著,说明 G-DINA 更贴合数据;p 值不显著,说明简化成 DINA 不损失太多解释力,优先用 DINA。拟合指标之外,必须做实际效标验证:把模型输出的画像与任课教师对学生的判断做对比,选一批边界个案交给教研组复核。如果模型说某个学生「未掌握 A2」,但多位教师一致认为他掌握得不错,那大概率不是模型的问题,而是 Q 矩阵对这个属性的定义和教师认知不一致。

6.3 下一步的两个方向:CD-CAT与动态诊断

如果 DINA 全家桶已经跑通,下一步值得投入的方向一是 CD-CAT(认知诊断自适应测验):根据已估计的属性状态动态选题,只测还不确定的属性,能在更短题量下得到同等精度的画像;二是动态认知诊断:把多次测评串起来,用马尔可夫结构建模知识状态的转移,回答「学生从 A 状态进步到 B 状态的概率是多少」这类时序问题。两个方向都建立在 DINA 这套基础认知上,学过的 Q 矩阵、参数估计和后验推断全用得上。

做这类模型这几年,我最大的教训是:模型跑出数字只是开始,数字背后那道题的 Q 矩阵标定、样本量和题目机制,才是决定结果可信度的根本因素。先怀疑数据,再怀疑模型,最后才是调参数;磨刀永远比砍柴重要。希望帮到你。

本文还有配套的精品资源,点击获取

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/15 6:38:07

堆排序原理解析:完全二叉树、堆化与下沉调整的底层逻辑

1. 为什么堆排序值得你花20分钟真正搞懂——它不是“另一个排序”&#xff0c;而是数据结构思维的分水岭很多人学堆排序&#xff0c;止步于“建堆→交换→调整”这九个字。背过代码&#xff0c;跑过Demo&#xff0c;考试能写&#xff0c;但一问“为什么非得用完全二叉树结构”“…

作者头像 李华
网站建设 2026/10/15 6:37:45

电话号码字母组合:回溯算法入门与代码实战

刷过LeetCode的同学应该都绕不开这道“电话号码的字母组合”。它排在第17位&#xff0c;题面短、一眼能看懂&#xff0c;但它真正教你的不是字符串拼接&#xff0c;而是一整套回溯遍历的思路。很多人在这一步就把“回溯模板”刻进了脑子里&#xff0c;后面做全排列、子集、组合…

作者头像 李华
网站建设 2026/10/15 6:37:43

C++类型擦除实践:std::any原理、any_cast用法与性能深度剖析

C 里有这么一类需求&#xff1a;你写了一套框架&#xff0c;希望调用方把“任意一种类型”的数据交给你&#xff0c;你再原样还回去&#xff0c;中间不关心它是什么。存倒是好存&#xff0c;关键是取的时候还能知道它原来是什么&#xff0c;而且生命周期不需要调用方操心。这就…

作者头像 李华
网站建设 2026/10/15 6:37:30

PS5远程游玩实战:从局域网到外网的串流搭建与调优

每次出差或躺在卧室不想动的时候&#xff0c;我都会盯着客厅那台PS5发呆。游戏机本身没问题&#xff0c;问题在于它被固定在一个位置&#xff0c;而我想在不同房间、不同设备上随时接着玩。这个需求听起来不算刚需&#xff0c;可真当你打了一半流程被迫存档关机的次数多了&…

作者头像 李华
网站建设 2026/10/15 6:37:30

MTK SoC平台开发实战:启动链路、编译环境与刷机避坑指南

简介&#xff1a;这是一份源自2024年国际固态电路会议&#xff08;ISSCC&#xff09;的官方论文&#xff0c;聚焦联发科技基于4纳米工艺打造的3.4GHz Tri-Gear全乱序ARMv9.2 CPU子系统&#xff0c;并说明其在5G移动SoC中的集成方案。内容适合芯片设计、移动处理器架构方向的工程…

作者头像 李华
网站建设 2026/10/15 6:37:03

基于大数据的重庆旅游推荐与可视化平台开题报告核心要点解析

一个"基于大数据的重庆旅游推荐与可视化平台"开题报告&#xff0c;最容易犯的错就是把"推荐系统"和"可视化"当成两个独立模块来写。实际上&#xff0c;推荐算法需要数据支撑&#xff0c;可视化要把推荐理由说清楚&#xff0c;数据采集则决定了这…

作者头像 李华