打开购物软件,同一个商品总有好几个版本:基础款、进阶款、豪华款……价格差一大截,功能却越加越多,到底选哪个?数据科学里也面临同样的纠结——面对一堆候选模型,总不能靠掷骰子拍板。今天要讲的MDL(Minimum Description Length,最小描述长度)给出一条朴素而优雅的思路:把每个模型当成一种“打包方案”,把数据当成要寄送的物品,谁能把包裹打得又小又结实,谁就胜出。 这个比喻贯穿全文:过于简单的模型像小号硬纸箱,东西塞不进去,剩下塞不下的物品还得另找包装,总成本反而高;过于复杂的模型像超大号箱子加十几层气泡膜,装是装得下,但包装材料和说明书本身就让人头疼。MDL算的正是“说明书长度 + 装箱后的体积”,总长度最短的那个方案,往往就是既能装好数据、又不过度包装的好模型。本文将从描述长度的源头讲起,拆解两阶段编码的每一步,与AIC/BIC对比差异,最后落到特征筛选、结构选择等实战。读完你会收获一把客观的“尺子”,在数据有限、过拟合风险高的建模任务里少走弯路。

岗位关联

对AI从业者:MDL提供了一套不过分依赖先验的模型选择标准,掌握后能在特征筛选、结构选择、正则化等场景做出更有解释力的决策,是建模基本功里“定胜负”的一环。

目录
  1. 可视化演示
  2. 描述长度起源
  3. 两阶段编码
  4. 模型拟合度
  5. MDL公式
  6. 与AIC比较
  7. 应用场景
  8. 实践步骤
  9. 局限与展望
  10. AI 应用场景
  11. Python 演示
  12. 常见误区
  13. 面试题

可视化演示

动态演示模型太多选哪个?MDL来帮忙的核心机制,通过架构/数据/状态/性能四种模式展示关键概念与交互流程。

本节配有交互动效(进入视口后自动加载,约 3KB)。

模型太多选哪个?MDL来帮忙:MDL原 MDL原则的基本概念 MDL的数学形式与编码方案 核心机制可视化 模型太多选哪个?MDL来帮忙整体架构与关键组件

描述长度起源

寄快递时,每种物品都有它自己的“本质体积”。一只真空压缩枕,压扁后只有小小一卷;一台塞满零件的冰箱,怎么压也变不成豆腐块。数据建模同样如此——每一组数据背后都有“本质信息量”:如果里面藏着规律,就总能用一段很短的描述讲清楚;如果纯粹是乱码,那唯一诚实的描述方式就是把每个比特原样抄一遍。认识这个“本质重量”,是MDL的第一步。

计算机科学早就思考过这个问题。柯氏复杂度(Kolmogorov Complexity)给“本质信息量”下了精确的定义:一个字符串 s 的最短描述,等于所有能生成它的程序里最短那个的长度。听起来像哲学,但它引出了一个关键视角——建模本质上就是“找能压缩数据的程序”。模型越好,数据被压缩得越短。这也呼应了奥卡姆剃刀:若无必要,勿增实体。

MDL正是“可计算的柯氏复杂度”:我们无法遍历所有程序,但可以遍历候选模型。模型就是那份“压缩程序”,选总描述最短的模型,就是用比特记账的方式践行奥卡姆剃刀——能简则简,简无可简时,那个长度便是底线。

K(s)=min⁡{ ∣p∣:U(p)=s }K(s) = \min\{\,|p| : U(p) = s\,\}
通俗说明:在所有能生成字符串 s 的程序 p 中,取最短程序的长度,那就是 s 的“本质重量”。
  1. K(s)字符串 s 的柯氏复杂度,衡量它的“本质重量”,单位是比特
    K(s)K(s)
  2. min在所有候选程序 p 中取最小值,相当于不断寻找更聪明的压缩方法
    min⁡{ }\min\{\,\}
  3. |p|程序 p 的二进制长度,也就是这份“压缩说明书”占了多少比特
    ∣p∣|p|
  4. U(p)=s通用计算机 U 运行程序 p 恰好输出 s,说明 p 确实是 s 的一种有效描述
    U(p)=sU(p) = s

两阶段编码

负责任的快递员打包时,会先拍一张“物品清单”,再把物品装箱。收件人拿到包裹,先读清单,再核对物品,才能完整还原货物。整个过程的总成本是:清单照片的大小 + 装好物品后的占用体积。MDL描述数据时同样分为两步:先描述模型本身,再描述数据在模型之下的“剩余信息”。

为什么非要分两步?因为纯数据没有模型就是一团乱码。就像收件人没有清单就不知道箱子里是什么一样,解码端没有模型,就不知道这串比特代表什么规律。两阶段编码把“结构”和“细节”分开支付成本,总描述长度因此成为模型选择的一把统一标尺。

两阶段编码的精髓在于“先模型后数据”的顺序。模型承担结构性描述,数据承担差异描述,二者此消彼长——这就是之后所有公式的骨架。

L(M,D)=L(M)+L(D∣M)L(M, D) = L(M) + L(D \mid M)
通俗说明:总成本 = 打包说明书长度 + 装好物品后还需描述的剩余信息长度。
  1. L(M)模型 M 自身的描述长度,比特数,对应“说明书写了几页”
    L(M)L(M)
  2. L(D|M)已知模型 M 后,描述数据 D 还需要多少比特;模型拟合得越好,这个值越小
    L(D∣M)L(D \mid M)
  3. 加和两阶段的总代价,正是 MDL 要最小化的对象
    L(M,D)L(M, D)

模型拟合度

箱子选得合不合适,看东西装进去还剩多少空隙。空隙越多,说明包装方案与物品形状越不匹配,需要塞更多填充物来填。这些“填充物”在MDL里就是数据编码长度 L(D|M)。一个模型如果与数据规律贴合得严丝合缝,剩余要描述的东西就少;如果驴唇不对马嘴,剩余信息就堆积如山。

统计上怎么度量“贴合度”?用似然。数据在当前模型参数下出现的概率越大,说明模型越接近真实规律。香农的信息论告诉我们:发生概率为 p 的事件,最优编码长度是 -log p 比特。把似然转成比特数,就得到数据编码长度:

回到打包比喻:一个定制泡沫箱,空隙几乎为零,填充物描述自然短;随手抓的纸箱,空隙大,填充物就多。所谓“拟合度”,本质就是包装与物品的贴合程度。

L(D∣M)=−log⁡P(D∣θ^)L(D \mid M) = -\log P(D \mid \hat{\theta})
通俗说明:数据越“意外”(似然越低),描述它的编码就越长;模型拟合得越好,数据越“不意外”,编码越短。
  1. P(D|θ̂)在参数 θ̂ 下观测到数据 D 的似然,衡量数据与模型的匹配程度
    P(D∣θ^)P(D \mid \hat{\theta})
  2. θ̂极大似然估计,让似然最大的参数
    θ^=arg⁡max⁡θP(D∣θ)\hat{\theta} = \arg\max_\theta P(D \mid \theta)
  3. -log把概率换算成比特数,事件概率越大,编码长度越短
    −log⁡P(D∣θ^)-\log P(D \mid \hat{\theta})

MDL公式

现在把两阶段成本合在一起核算。每个候选打包方案都有“总包裹大小”,MDL要做的,就是量遍所有方案,挑最小的那一个。这一比价过程自动惩罚了过复杂模型——多出来的包装成本如果换不来数据描述上的节省,就会被判出局。

这个公式就是“快递比价单”:左边是说明书的页数,右边是填充物的体积。想要右边小,就得升级更贴合的箱子(复杂的模型);但升级箱子本身也贵。最优解落在中间的平衡点——这正是MDL能自动防止过拟合的数学本因。

M∗=arg⁡min⁡M[ L(M)−log⁡P(D∣θ^) ]M^* = \arg\min_{M} \bigl[\, L(M) - \log P(D \mid \hat{\theta}) \,\bigr]
通俗说明:最优模型 = 在“模型描述长度 + 数据不拟合程度”这个联合账单上花费最小的那个。
  1. argmin_M在所有候选模型 M 中,找使中括号内数值最小的那一个
    arg⁡min⁡M\arg\min_{M}
  2. L(M)模型复杂度项,参数越多、结构越复杂,这项越大
    L(M)L(M)
  3. -log P(D|θ̂)拟合不足项,模型与数据越不匹配,这项越大
    −log⁡P(D∣θ^)-\log P(D \mid \hat{\theta})

与AIC比较

不同快递公司计费规则不同:AIC像“每单固定收包装费X元”,BIC像“超过一定重量按阶梯加价”,MDL则是把包装方案和空隙填充都实测称重。它们的目的都一样——在拟合与简洁之间找平衡,但惩罚权重的设定各有侧重。

AIC(赤池信息准则)与BIC(贝叶斯信息准则)是实践中更常见的模型选择工具。它们形式上都是“拟合项 + 惩罚项”,只是惩罚项不同,而且BIC的惩罚项在样本量增大时会更重。把两者写在一起对比:

MDL与它们的关系是:AIC/BIC只按参数个数 k 粗略收包装费(把每个参数视为同等复杂度),而MDL还考虑参数精度、编码方式等细节。在样本量较大时,BIC的 k ln n 其实是对MDL中模型编码部分的渐近近似——所以很多人把BIC直接当作MDL的实用版本。

AIC=−2ln⁡L^+2k,BIC=−2ln⁡L^+kln⁡n\mathrm{AIC} = -2\ln\hat{L} + 2k, \quad \mathrm{BIC} = -2\ln\hat{L} + k\ln n
通俗说明:AIC对每个参数固定收“2块”包装费;BIC的收费与样本量挂钩,数据越多,每个参数越贵。
  1. -2 ln L̂拟合项,负两倍对数似然,拟合越好这项越小
    −2ln⁡L^-2\ln\hat{L}
  2. 2kAIC的惩罚项,k是参数个数,每多一个参数固定增加2单位成本
    2k2k
  3. k ln nBIC的惩罚项,样本量 n 越大,每多一个参数的代价越高
    kln⁡nk\ln n

应用场景

打包不只是选箱子,还涉及“带哪些物品”(特征筛选)、“换成几个中箱”(结构选择)。MDL在这些问题上依旧是同一个思路:比总成本。每个特征、每个簇中心、每个树节点都需“自证其值”——若它的加入让总描述长度上升,就说明它带来的细节描述节省抵不过自身的复杂度开销。

在特征筛选中,MDL让每个特征“付账单”——增加特征若不降低 L(D|S),总长变长,就删掉。在聚类中,K太小数据描述长,K太大模型描述长,MDL自动选出中间那个自然的K。在决策树剪枝里,某个子树如果让总编码不降反升,就说明它只是在背噪声。所有“选什么”的问题,都被MDL变成了一次客观的比价。

S∗=arg⁡min⁡S[ L(S)+L(D∣S) ]S^* = \arg\min_{S} \bigl[\, L(S) + L(D \mid S) \,\bigr]
通俗说明:S 可以是特征子集、聚类数、树结构,MDL的做法完全统一:找总描述长度最小的那个结构。
  1. S待选择的候选结构,比如特征子集、聚类个数、决策树的具体形态
    SS
  2. L(S)描述这个结构本身的编码长度
    L(S)L(S)
  3. L(D|S)给定该结构后,描述数据还需要的编码长度
    L(D∣S)L(D \mid S)

实践步骤

具体寄一件包裹的流程是:清点物品 → 记下候选箱子规格 → 逐个试装并量体积 → 选最省的。MDL的实践也遵循同样节奏。以多项式回归为例,我们一步一步走完这个过程。

第一步,预处理数据:标准化、去噪、切分。第二步,生成候选模型集:1阶、2阶、3阶多项式都纳入考量。第三步,对每个候选模型做拟合,然后分别计算 L(M) 和 L(D|M)。第四步,把所有总长度摆在一起,挑最小的。比如二次模型算出来的结果可能是:

实践中还有几个关键细节:参数的精度位数会影响 L(M),因此要约定统一的量化方式;样本量 n 不同,模型编码部分的计算方式也会随BIC近似而调整。只要坚持“每个模型一张账单”,模型选择就从“凭感觉”变成了“有账可查”。

Ltotal(M2)=25+48=73 bitsL_{\mathrm{total}}(M_2) = 25 + 48 = 73\ \text{bits}
通俗说明:一个具体示例:二次模型的参数说明书需要25 bit,残差描述需要48 bit,总长73 bit。
  1. 25二次模型描述参数(三个系数)所需的模型编码长度
    L(M2)=25L(M_2) = 25
  2. 48拟合后的残差编码长度,残差越小这项越小
    L(D∣M2)=48L(D \mid M_2) = 48

局限与展望

快递也不是万能的:有些物品形状不规则到难以标准化测量,有些计费规则不透明,不同快递公司的定价各说各话。MDL同样有天花板。最大的麻烦来自柯氏复杂度的不可计算性——真正的“最短”是无法逐一遍历所有可能程序求出来的,我们只能在候选模型范围内做“有限赛马”。

于是就有了几种妥协:一是计算复杂度,模型空间稍大,逐个拟合和编码的成本就很高;二是先验依赖,选什么样的编码方案(比如参数用几位精度)会直接影响 L(M) 的结果;三是工程中常用渐近近似来替代精确MDL,也就是前面提到的BIC路线。在渐近条件下,模型编码近似为:

MDL不是万能的魔法,但它给模型选择提供了扎实的参照系。就像打包功夫再高也不能让冰箱变小,MDL的价值在于:在能测量的范围内,给出尽量客观的“该选哪个”。未来随着变分推断、可学编码等技术的成熟,MDL的精确版本也有望在更大模型空间里落地。

L(M)≈k2log⁡nL(M) \approx \frac{k}{2}\log n
通俗说明:渐近条件下,模型编码长度约等于参数个数的一半乘以样本量的对数,这是BIC惩罚项的由来,也是精确MDL的廉价替身。
  1. k模型可调参数的个数,模型越复杂越大
    kk
  2. log n样本量的对数,体现每个参数的精度会随数据量增长而可以进一步细化
    k2log⁡n\frac{k}{2}\log n

AI 应用场景

信贷风控特征筛选

阶段:特征工程 / 模型选择

解决的问题:信贷数据动辄数百个特征,人工挑选既费时又主观,还容易把噪声特征带进模型导致过拟合。用MDL为每个特征子集计算总描述长度,让特征自己“证明价值”——加进来不能缩短数据描述的,直接剔除。

具体案例:某金融风控团队对260个行为特征做MDL筛选,最终保留28个。模型AUC从0.72提升到0.76,训练时间缩短约一半,且线上稳定性显著提高。MDL选出来的特征组合比手工经验组合有更强的可解释性,也更经得起合规审查。

用户分群聚类数确定

阶段:无监督学习 / 模型选择

解决的问题:K-means聚类时K值怎么定?肘部法则画图太主观,轮廓系数波动大。借助MDL思想,将“簇中心+样本分配结果”整体编码,K过小时数据描述长,K过大时模型描述长,总长度曲线的谷底就是最自然的群组数。

具体案例:某电商平台对30万用户的行为向量做聚类,K从2试到15,计算每个K下的MDL总长度,最终选出K=6。运营团队按6个群组设计差异化营销策略,转化率比此前按8个群组时提升了12%。

决策树剪枝优化

阶段:模型优化 / 结构选择

解决的问题:决策树越深越容易记住噪声,传统代价复杂度剪枝需要额外调参。MDL把整棵树视为“树结构编码+叶子数据编码”,对每个内部节点计算剪枝前后的总长度变化,只保留真正能让总编码变短的节点,剪枝过程天然免调参。

具体案例:某推荐系统团队用MDL对一棵深度为22的规则树剪枝,剪到深度9。线下测试发现剪枝后规则更稀疏,线上点击率反而提升5%,模型推理耗时降低了约35%。

Python 演示

python36 行
import numpy as np  def mdl_score(y, y_pred, k, n):    """MDL两阶段编码总长度:L(M) + L(D|M)"""    resid = y - y_pred    sigma2 = np.mean(resid ** 2) + 1e-12    ld = n * 0.5 * np.log2(2 * np.pi * sigma2)    lm = k * 0.5 * np.log2(n)    return lm + ld, lm, ld  def select_best_model(x, y, max_degree=5):    """用MDL选择最佳多项式阶数"""    n = len(x)    best_total = None    best_k = None    best_coef = None    for k in range(1, max_degree + 1):        coef = np.polyfit(x, y, k)        y_pred = np.polyval(coef, x)        total, lm, ld = mdl_score(y, y_pred, k, n)        print(f"degree={k}: L(M)={lm:.2f} L(D|M)={ld:.2f} total={total:.2f}")        if best_total is None or total < best_total:            best_total = total            best_k = k            best_coef = coef    return best_total, best_k, best_coef  if __name__ == "__main__":    rng = np.random.default_rng(42)    x = np.linspace(0, 3, 40)    y = 1 + 2 * x - 0.5 * x ** 2 + rng.normal(0, 0.4, size=x.shape)    best_total, best_k, best_coef = select_best_model(x, y, 5)    print(f"最佳阶数: {best_k}, 最小总长度: {best_total:.2f}")
目的:对带噪声的二次函数数据,用MDL思想从1阶到5阶多项式中选出总描述长度最小的阶数,自动避开过拟合。
  1. import numpy as np引入数值计算库,后面所有数学运算都靠它。
  2. def mdl_score(y, y_pred, k, n)定义MDL计分函数,内部同时算出总长度和两个分项。
  3. resid = y - y_pred残差即模型没拟合上的“剩余空隙”。
  4. sigma2 = np.mean(resid ** 2) + 1e-12估计残差方差,加极小值防止对数取到零。
  5. ld = n * 0.5 * np.log2(2 * np.pi * sigma2)数据编码长度:残差方差越大,描述数据花的比特越多。
  6. lm = k * 0.5 * np.log2(n)模型编码长度:参数越多或数据越多,说明书越厚。
  7. best_total = None初始化最优总长度为“空”,便于第一次比较直接写入。
  8. coef = np.polyfit(x, y, k)用最小二乘拟合出 k 阶多项式系数。
  9. if best_total is None or total < best_total保留当前总长度最小的候选模型。
  10. rng = np.random.default_rng(42)固定随机种子,让实验结果可复现。
  11. y = 1 + 2 * x - 0.5 * x ** 2 + rng.normal(0, 0.4, size=x.shape)生成一条真实的二次曲线并添加高斯噪声,模拟现实中的“带噪数据”。

常见误区

误区查资料发现MDL的渐近公式和BIC长得差不多,所以它俩是一回事吧?反正算出来的数字也差不多。

正解MDL是一种建模原则,BIC只是它在特定渐近条件下的近似方案。就像“省钱寄快递”是原则,“会员折扣计费”是一种具体实现。MDL还考虑编码方案、参数精度、结构描述等细节,BIC则把每个参数按统一价格计费。用同一个袋子装不同的货,看似相同,实际精度不同。

为何常见:BIC中 k ln n 恰好是MDL模型编码部分的渐近近似,两者公式太像,初学者极易将其画等号。

误区MDL一直压着模型复杂度,选出来的模型会不会太简单,根本拟合不了数据?

正解MDL的账单里还有数据描述长度 L(D|M)。模型太简单时残差巨大,L(D|M) 会暴涨——就像拿小箱子装大物件,塞不下还得另加填充包装,总价反而更高。MDL不是追求“模型最短”,而是追求“总长最短”。

为何常见:人们听到“最小描述长度”容易只盯着模型的“短”,忽略了另一半“描述数据”的篇幅。

误区我数一下模型有几个参数,乘以一个常数,就算出L(M)了。

正解参数个数只是影响L(M)的因素之一。L(M)还包含参数的精度位数、编码方式(如二进制还是浮点)、模型结构本身的描述等。即使是同一个模型,用不同的参数精度编码,算出来的L(M)也可能不同。AIC/BIC为了简洁只按参数个数 k 计费,那是简化而非MDL的完整定义。

为何常见:AIC和BIC都只用k做惩罚,这套习惯让人误以为MDL的模型编码也仅仅依赖参数个数。

误区MDL是“客观标准”,应该完全不用设置任何东西,跑出来的就是绝对真理。

正解MDL仍需选择编码方案:参数用几位精度、用小端还是大端、是否做模型重参数化,这些选择都会影响L(M)。编码方案本质上就是一种先验。MDL比“拍脑袋定λ”更客观,但并非真空中的尺子,它把主观性转移到了编码方案的选择上。

为何常见:相关教程和论文常强调MDL的客观性,却很少提它的先验依赖,容易让人误以为它没有任何假设。

面试题

Q1. "MDL"全称的中文含义是什么?

单选题 · easy

  • A.最小描述长度← 正确答案
  • B.最大似然估计
  • C.最小二乘拟合
  • D.最大熵原理

答案:A。MDL是Minimum Description Length的缩写,指“最小描述长度”,核心是最短描述者胜出。B是MLE,C是LSE,D是MaxEnt,三者都与MDL的命名无关。

Q2. MDL的核心思想对应下列哪个哲学原则?

单选题 · easy

  • A.笛卡尔式怀疑
  • B.奥卡姆剃刀← 正确答案
  • C.马太效应原理
  • D.蝴蝶效应原理

答案:B。奥卡姆剃刀主张“如无必要,勿增实体”,MDL正是它在建模领域的数学化体现——在能解释数据的前提下选描述最短的模型。其他三个选项与模型选择无关。

Q3. 两阶段编码中,第一阶段编码的对象是什么?

单选题 · mid

  • A.数据残差部分
  • B.模型本身结构← 正确答案
  • C.随机噪声干扰
  • D.数据标签信息

答案:B。两阶段编码第一阶段写“说明书”即模型本身,第二阶段在已知模型下描述数据。残差是第二阶段的内容,噪声和标签不属于两阶段编码的固定对象。

Q4. 模型越复杂时,通常会出现什么现象?

单选题 · mid

  • A.模型编码减小而数据编码变大
  • B.模型编码增大而数据编码减小← 正确答案
  • C.模型与数据编码都变小
  • D.模型与数据编码都变大

答案:B。模型复杂度上升时,L(M)必然增大,但拟合更细致通常让L(D|M)下降。A方向反了,C和D不符合此消彼长的规律。MDL正是在这两项的拉扯中找平衡。

Q5. 以下哪些是MDL的典型应用场景?

多选题 · mid

  • A.特征筛选与降维← 正确答案
  • B.聚类数目的确定← 正确答案
  • C.决策树剪枝优化← 正确答案
  • D.梯度下降步长调节

答案:ABC。特征筛选、聚类数确定、决策树剪枝都属于“结构选择”问题,可用MDL统一比价。梯度下降步长属于优化算法参数,不由MDL直接决定。

Q6. BIC的惩罚项k ln n与AIC的2k相比,差异是什么?

单选题 · mid

  • A.惩罚项一定比AIC更轻
  • B.样本量大时惩罚更重← 正确答案
  • C.与AIC的惩罚完全相同
  • D.根本不包含惩罚项

答案:B。当n > 8时k ln n > 2k,BIC惩罚更重,因此大样本下BIC倾向于更简单的模型。A忽略n的影响,C和D明显错误。

Q7. 数据编码长度L(D|M)在连续模型下通常用什么表示?

单选题 · hard

  • A.负对数似然值← 正确答案
  • B.正对数似然值
  • C.均方误差之和
  • D.交叉熵损失值

答案:A。根据香农编码定理,概率为p的事件最优编码长度为-log p,因此数据编码长度取负对数似然。正对数似然会得到负数,没有编码长度意义;均方误差和交叉熵是其他框架的度量。

Q8. 关于MDL与AIC/BIC的关系,下列说法正确的有哪些?

多选题 · hard

  • A.BIC是MDL的渐近近似← 正确答案
  • B.MDL只关注拟合程度
  • C.MDL依赖具体编码方案← 正确答案
  • D.AIC在大样本下选择简单模型

答案:AC。BIC的k ln n确实来自MDL模型编码部分的渐近近似,A对。MDL同时看模型与数据两部分,B错。编码方案是MDL的内在先验,C对。AIC大样本下倾向于选复杂模型而非简单模型,D错。

Q9. 用MDL做特征筛选时,若两个特征子集的拟合效果相同,MDL更倾向选择哪个?

单选题 · hard

  • A.包含更多特征的子集
  • B.包含更少特征的子集← 正确答案
  • C.随机挑选其中一个
  • D.与特征数目无关

答案:B。拟合效果相同意味着L(D|S)差距不大,此时L(S)越小的子集总长越小,因此MDL必然偏向更少的特征。这也体现了奥卡姆剃刀:同等解释力下选更简单的。

Q10. MDL的主要局限性包括哪些?

多选题 · easy

  • A.计算复杂度比较高← 正确答案
  • B.对编码方案较敏感← 正确答案
  • C.任何情况都是最优
  • D.完全无法实际操作

答案:AB。精确MDL需要在大量候选模型间逐个编码计算,成本高;同时不同的编码方案会改变L(M)的结果,所以对编码方案敏感。C过于绝对,D则抹杀了BIC等近似实践的可行性。