恒美微站 Logo 恒美微站
  • 首页
  • 关于我们
  • 建站服务
  • 主题模板
  • 案例展示
  • 资讯中心
  • 联系我们

信念对数相似度测量:让D-S组合规则不再怕冲突证据

  • 首页
  • 资讯中心
  • /
  • 信念对数相似度测量:让D-S组合规则不再怕冲突证据

相关资讯

ping命令深度解析:从ICMP原理到网络排查实战技巧 2026/10/15 22:06:51
2026年第40周图神经网络论文精选:动态图、图基础模型与神经符号推理前沿 2026/10/15 22:06:51
OSPF与隧道接口联动防环指南:从故障场景到实操配置 2026/10/15 22:06:51

最新资讯

放弃视频课,啃透LLM底层原理:从Token到注意力机制的完整指南
科尔沁区现代农业战略合作:高标准农田与智慧农业落地解析
TensorFlow工程化实战:从环境搭建到生产部署的完整技术路线
基于像素聚类的实时镜面高光去除算法与工程实践
C++炸弹人游戏工程骨架:SDL2跨平台实现与爆炸物理模型
写作效率狂飙!用TaoToken统一Key打通Trae写作流的5分钟爆款产出法

今日推荐

AI视频生成的时间一致性难题与时空建模演进
基于bbox的PDF文档解析:多栏重排与水印过滤实战
探矿数据进RAG前的清洗全攻略:TXT、Word、PDF、网页四类文档处理实践

本周热门

UE动画修改实战:从资产编辑到重定向与蒙太奇驱动
统计随机数生成器攻击下的KLJN安全密钥交换协议Matlab仿真
政务API安全治理:资产测绘、低代码编排与行标对标实践

本月精选

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证
2026 大模型集体涨价:用 Python 做企业 Token 成本测算与选型避坑(附配置)

信念对数相似度测量:让D-S组合规则不再怕冲突证据

发布时间:2026/10/15 22:11:51
信念对数相似度测量:让D-S组合规则不再怕冲突证据 做过多源数据融合的人对 Dempster-Shafer 理论应该都不陌生。它把“不知道”和“不同意”分开处理比朴素概率更耐造。可真正在项目里跑一次你就会发现另一个问题D-S 组合规则对证据之间的冲突非常敏感有时候几路传感器明明大体一致仅仅因为一路明显偏离融合结果就会被带偏甚至出现“结果看起来能自洽细想却很可疑”的情况。我后来给融合链路加了一步“相似度前处理”核心就是标题里提到的信念对数相似度测量。思路不复杂先不急着做 D-S 正交和而是先计算每两个证据体之间的相似度用相似度给每路证据分配一个可靠度再折扣掉不可靠的那部分最后才进入 D-S 组合。这篇文章把我自己沉淀下来的公式推导、完整流程、MATLAB 代码和踩坑经验都写出来适合已经会写基本 D-S 代码、正在被冲突证据折磨的开发者、学生和算法工程师。1. 先交代我为什么在融合链路里加一个相似度前处理1.1 一段“结果看起来合理其实很可疑”的经历当时我在做一个多传感器识别项目传感器输出的是对几个目标类别的支持度。按照 D-S 的常规做法把每路输出整理成基本概率指派函数也就是 BPA然后通过 Dempster 正交和逐级组合。前几个场景都很顺利直到有一次出现了三路证据两路高度一致一路明显偏离。直接套 D-S 规则后融合结果虽然还能指向多数派但偏离的那一路证据的命题依然保留了一个不该有的高支持度。换句话说D-S 只告诉我“这两组证据之间有多冲突”却没有告诉我“冲突的一方到底是不是更不可信”。后来我把每路证据之间两两算相似度再做一次可靠性折扣结果立刻顺眼很多。于是我开始系统性地整理这套流程最终落到一个可以复用的 MATLAB 工具链里。1.2 冲突系数 K 想做“裁判”但它只能报告冲突先复习一下 D-S 中最核心的正交和规则。设辨识框架为 (\Theta)两个证据体 (m_1, m_2) 的组合结果是[ (m_1 \oplus m_2)(A)\frac{1}{1-K}\sum_{B \cap C A}m_1(B)m_2(C) ]其中冲突系数[ K\sum_{B \cap C \emptyset}m_1(B)m_2(C) ]K 越接近 1说明两个证据体越冲突。但问题在于K 只是一个“总的冲突量”它既不告诉你冲突来自哪条焦元也不告诉你哪路证据更值得信任。更麻烦的是当 K 真的接近 1 时D-S 正交和的分母 (1-K) 趋近于 0结果会非常不稳定极端情况下整个组合规则直接失效。所以我要的不是在组合之后再来处理冲突而是在组合之前就给每路证据打一个可靠度分。这个分数从哪里来从它和其他证据的相似度来。这就是信念对数相似度要干的事。2. 信念对数相似度测量用对数散度衡量两组证据有多“合拍”2.1 为什么几何距离不适合作证据体的相似度最直觉的做法是把每路 BPA 向量看成坐标点然后算欧氏距离。比如对于三个焦元每一路证据就是一个三维向量距离越小越相似。这个做法简单但有一个很大的毛病欧氏距离对“多出来的零”非常敏感。BPA 里有很多值是 0表示该证据没有把质量分配给这个焦元并不是说它强烈否定这个焦元。如果两路证据一个是 ((0.8,0.1,0.1))另一个是 ((0.8,0.1,0.1))距离为 0没问题。但如果一个在焦元 C 上有 0另一个在 C 上有很小的 0.001欧氏距离就会产生一个看似微小但意义被放大的差异。更本质的问题是BPA 本身是质量分配不是几何空间里的普通坐标。人们更关心的常常是“比例关系”而不是“绝对差值”。比如 0.9 和 0.81 的区别与 0.1 和 0.01 的区别在决策层面可能都代表一个数量级的变化。想要体现这种变化对数空间是更合适的地方。2.2 从 KL 散度到对称、有界的 JS 散度假设两个证据体 (m_i) 和 (m_j)按所有非空焦元排成向量。最直接的对数比较是 KL 散度[ D_{KL}(m_i | m_j)\sum_{A \subseteq \Theta, A\neq \emptyset} m_i(A)\log\frac{m_i(A)}{m_j(A)} ]KL 散度能捕捉比例差异但它不对称(D_{KL}(m_i | m_j)) 和 (D_{KL}(m_j | m_i)) 往往不相等。在融合场景里我们计算的是两路证据之间的“互相合拍程度”对称性非常重要。所以我用 Jensen-Shannon 散度来做对称化[ JS(m_i,m_j) \frac12\sum_A m_i(A)\log\frac{2m_i(A)}{m_i(A)m_j(A)} \frac12\sum_A m_j(A)\log\frac{2m_j(A)}{m_i(A)m_j(A)} ]这个式子的直觉可以这样理解先把两组证据的质量分配做平均得到 (m_{\text{avg}})然后分别看每一组证据和这个平均值有多远。两组证据越不一致这个距离越远。JS 散度有几个非常好的性质对称顺序无所谓非负最小值是 0有上界当两组证据的支撑是完全不相交的焦元时最大值为 (\log 2)对于零质量可以严格处理不会出现 (0\log 0) 的问题。2.3 从散度到相似度的归一化有了 JS 散度之后把它归一化到相似度。我用的是[ S_{ij}1-\frac{JS(m_i,m_j)}{\log 2} ]当 (m_im_j) 时JS 为 0相似度为 1。当两组证据完全不相交比如一组全压在 A 上另一组全压在 B 上JS 为 (\log 2)相似度为 0。这就是我所说的信念对数相似度测量。说白了一点都不玄先把 BPA 看成定义在所有非空焦元上的离散分布再用 JS 散度这个“对数尺子”去量最后还原成一个 (0\sim 1) 的相似度分数。实际使用中我还会做一个微小修正如果两组证据完全相同直接把相似度置为 1避免浮点误差把自相似度算成 0.9997 之类的值。3. 融合流程与一个手算能跟上的算例3.1 相似度矩阵、支持度、折扣、组合的四步走整套前处理可以拆成四步第一步构建相似度矩阵 (S)。对 N 路证据两两调用 (S_{ij})得到一个 (N\times N) 的对称矩阵。对角线全为 1因为证据和它自己的相似度一定是 1。第二步计算支持度。第 i 路证据的支持度定义为它和其他所有证据相似度之和[ Sup_i\sum_{j1}^{N}S_{ij}-1 ]减去的 1 是它和自己的相似度。这样处理之后(Sup_i) 越大说明它和整体越一致。第三步把支持度转成折扣系数。比较稳妥的做法是[ \alpha_i\frac{Sup_i}{\max_{j} Sup_j} ]这样支持度最高的一路证据保持 1不被折扣其他证据按相对比例打折。折扣后的 BPA 为[ m_i^{\alpha}(A)\alpha_i m_i(A), \quad A\neq\Theta ][ m_i^{\alpha}(\Theta)1-\alpha_i\alpha_i m_i(\Theta) ]其中 (\Theta) 是全集焦元。为什么要有所保留因为折扣掉的信任不能凭空消失它应该转移到“未知”上表示这路证据的可靠性打了折扣所以决策者对它的判断保留余地。第四步才是 D-S 正交和。把折扣后的 N 路证据逐级用 Dempster 规则组合得到最终的融合 BPA。也可以选择把支持度归一化成权重先对证据做加权平均再把平均证据自组合 N-1 次。两种思路我都试过效果接近但折扣再组合更贴近 D-S 原教旨代码上也更好解释。3.2 三组证据的完整演算用一个三焦元的例子把数字盘一遍。辨识框架为 (\Theta{A,B,C})三路证据只压单点焦元E1(m_1(A)0.8, m_1(B)0.1, m_1(C)0.1)E2(m_2(A)0.85, m_2(B)0.05, m_2(C)0.1)E3(m_3(A)0.1, m_3(B)0.1, m_3(C)0.8)E1 和 E2 明显都支持 AE3 支持 C属于典型的两打一场景。先算相似度矩阵结果如下项E1E2E3E11.00000.99330.5529E20.99331.00000.5257E30.55290.52571.0000支持度为[ Sup_11.5462,\quad Sup_21.5191,\quad Sup_31.0786 ]归一化后折扣系数[ \alpha_11,\quad \alpha_2\approx 0.9826,\quad \alpha_3\approx 0.6978 ]可以看到E3 的支持度明显低于另外两路所以它的所有焦元质量都会被打到七折左右剩下约三成转移到全集 (\Theta) 上表示“这路证据我不太敢完全信”。3.3 结果对比相似度前处理到底改了什么直接走原始 D-S 正交和与先做相似度折扣再正交和结果对比如下融合方式(m(A))(m(B))(m(C))原始 D-S0.88890.00650.1046相似度折扣 D-S0.95240.00930.0374这个结果很能说明问题。原始 D-S 虽然也把 A 排在首位但 C 依然保留了 0.1046 的支持度。E3 明明是偏离多数的一路它支持的 C 却被 D-S 当作正常证据参与归一化导致 C 被明显高估。加相似度前处理后E3 的权重被压低C 的支持度降到 0.0374A 的支持度从 0.8889 抬到 0.9524。两路可靠证据的共识被保留偏离者的声音被抑制。更重要的是整个过程不需要人工指定哪路传感器可靠完全由数据之间的对数相似度自动计算。4. MATLAB 实现代码结构和可复用的函数4.1 主脚本main_log_similarity_ds.m我这里选择的焦元编码方式是整数位编码(q3) 时下标 1 对应 A2 对应 B3 对应 C4 对应 AB5 对应 AC6 对应 BC7 对应全集 ABC。这样可以用bitand快速判断交集。主脚本如下% main_log_similarity_ds.m % 基于信念对数相似度 D-S组合的多源证据融合示例 % 运行环境任意版本MATLAB无需额外工具箱 q 3; % 辨识框架大小 % 焦元顺序: 1A, 2B, 3C, 4AB, 5AC, 6BC, 7ABC m1 zeros(1, 2^q - 1); m1([1 2 3]) [0.8 0.1 0.1]; m2 zeros(1, 2^q - 1); m2([1 2 3]) [0.85 0.05 0.1]; m3 zeros(1, 2^q - 1); m3([1 2 3]) [0.1 0.1 0.8]; rawEvidence {m1, m2, m3}; N length(rawEvidence); % 1. 计算相似度矩阵 S zeros(N, N); for i 1:N for j 1:N S(i, j) logBeliefSimilarity(rawEvidence{i}, rawEvidence{j}); end end % 2. 支持度 support sum(S, 2) - 1; % 减去自相似度1 % 3. 折扣系数最高支持度不打折 alpha support / max(support); if all(alpha 0) alpha ones(N, 1); end % 4. 折扣证据 discountedEvidence cell(1, N); for i 1:N discountedEvidence{i} discountBPA(rawEvidence{i}, alpha(i)); end % 5. D-S逐级组合 mComb discountedEvidence{1}; for i 2:N mComb dsPairOrthogonal(mComb, discountedEvidence{i}); end fprintf(相似度矩阵\n); disp(S); fprintf(折扣系数\n); disp(alpha); fprintf(融合结果只显示A/B/C\n); fprintf(m(A)%.4f, m(B)%.4f, m(C)%.4f\n, ... mComb(1), mComb(2), mComb(3));4.2 核心函数一logBeliefSimilarity.m这个函数实现的就是 JS 散度到相似度的转换。代码里最关键的地方是避免 (0\log 0)所以只对质量为正的项计算对数项。function sim logBeliefSimilarity(m1, m2) % 计算两组BPA之间的对数相似度 % 输入两个行向量焦元顺序一致 % 输出0~1之间的相似度1表示完全一致 m1 m1(:); m2 m2(:); if length(m1) ~ length(m2) error(两组BPA长度不一致); end s m1 m2; idx1 (m1 0) (s 0); idx2 (m2 0) (s 0); d1 zeros(size(m1)); d2 zeros(size(m2)); d1(idx1) m1(idx1) .* log(2 * m1(idx1) ./ s(idx1)); d2(idx2) m2(idx2) .* log(2 * m2(idx2) ./ s(idx2)); js 0.5 * (sum(d1) sum(d2)); % 用 log(2) 归一化 sim max(0, 1 - js / log(2)); % 完全相同证据的自相似度直接置1 if isequal(m1, m2) sim 1; end end这里用的是自然对数因为归一化时除以的是log(2)。如果你在 MATLAB 里想用log2只要把最后归一化改成1 - js / log2(2)即可本质上是一样的。4.3 核心函数二、三dsPairOrthogonal.m 与 discountBPA.mD-S 正交和是这套流程的地基。我用整数bitand判断两个焦元交集function mOut dsPairOrthogonal(m1, m2) % 两个BPA的Dempster正交和 % 焦元编码整数k的二进制位表示第k个命题是否属于该焦元 q log2(length(m1) 1); if abs(q - round(q)) 1e-10 error(BPA长度必须是2^q - 1); end q round(q); nSubsets length(m1); mOut zeros(1, nSubsets); K 0; for i 1:nSubsets if m1(i) 0 continue; end for j 1:nSubsets if m2(j) 0 continue; end inter bitand(i, j); prodMass m1(i) * m2(j); if inter 0 K K prodMass; % 交集为空集冲突 else mOut(inter) mOut(inter) prodMass; end end end denom 1 - K; if denom 1e-12 error(证据完全冲突Dempster组合规则失效); end mOut mOut / denom; end折扣函数也很容易实现。由于全集 (\Theta) 在整数编码中永远是最大值 (2^q-1)所以只需要锁定最后一个下标function mNew discountBPA(m, alpha) % 按可靠度 alpha 折扣BPA % alpha1 表示完全信任alpha越小折扣越重 q log2(length(m) 1); if abs(q - round(q)) 1e-10 error(BPA长度必须是2^q - 1); end q round(q); thetaIdx 2^q - 1; mNew alpha * m; mNew(thetaIdx) mNew(thetaIdx) (1 - alpha); end折扣的核心在于被减掉的那部分质量没有直接扔进“垃圾箱”而是转移到全集 (\Theta) 上。全集意味着“所有命题都有可能”所以折扣后的证据会表现得更加保守、模糊但不会因为不可靠而直接导致错误命题被完全抹掉。4.4 运行结果与代码里的关键取舍运行主脚本之后相似度矩阵和折扣系数会打印出来最终融合结果和 3.3 节里的表一致。三个函数加起来不到 80 行没有用到任何工具箱复制到本地就能跑。我想额外强调的是代码里的两个取舍第一我把所有非空焦元都用向量存了。这样写清晰但焦元数量会随辨识框架大小指数增长。(q10) 时已经有 1023 个焦元双重循环还是可以接受一旦 (q) 到 15 以上建议改成只存实际出现质量大于 0 的焦元避免无效循环。第二我在dsPairOrthogonal里直接对 (1-K) 做了保护。如果出现完全冲突我会得到明确报错而不会默默输出一堆 NaN。工程项目里显式报错比隐性错误好一百倍。5. 工程落地中最容易踩的坑5.1 位运算编码空集是 0空集不参与组合最开始写dsPairOrthogonal时我差点把空集当成普通焦元放进下标数组里。如果两个焦元交集为空bitand的结果是 0这个 0 表示空集不应当写入任何输出的 BPA 下标。这个问题看似简单一旦焦点落在“组合结果可能为 0”时很多新手会怀疑是分配逻辑出了问题。记住inter 0只用来累加冲突系数 K永远不要把质量加到mOut(0)上MATLAB 的索引也不允许 0。5.2 0 与 1 的对数陷阱[ \log(0)-\infty ]这是对数算法里最常见的坑。在logBeliefSimilarity里如果不对零质量做保护0 * log(0)在 MATLAB 里是NaN而不是 0。我的处理方式很简单只对m1(idx1)和m2(idx2)这些质量为正的项算对数。质量为零的项在 JS 散度里本来就没有贡献直接跳过。这是一个非常小但决定代码生死的地方。另一个相关坑是“完全一致”和“几乎一致”在浮点里的区别。两组证据完全相等时JS 的数值结果应该为 0但浮点误差可能算出一个 (10^{-17}) 级别的正数。归一化后相似度会变成 0.99999999999看起来没什么但如果你后面用find(S 1)做筛选就会产生意外结果。所以我在函数里加了isequal(m1, m2)判断。5.3 权重归一化、折扣系数和完全冲突保护支持度算出来之后怎么变成折扣系数也需要想清楚。如果直接用归一化权重也就是[ w_i\frac{Sup_i}{\sum_j Sup_j} ]那么所有证据的权重都会被压得很低因为权重加起来等于 1。这时候拿它去折扣 BPA会让每一路证据都变得非常保守组合结果反而不够锐利。我更推荐相对归一化[ \alpha_i\frac{Sup_i}{\max_j Sup_j} ]这样最可靠的证据保持完整其他证据按相对比例降低。如果所有支持度都为 0也就是每路证据彼此完全冲突不要硬算直接报错或者把所有权重设为相等再决定下一步怎么处理。完全冲突场景下D-S 的 (1-K) 是 0任何带权策略都救不了底层分母。所以在业务落地时我会在组合前加一层判断一旦 (K) 超过 0.995就不再直接输出 D-S 结果而是把相似度加权平均的结果作为兜底。6. 还能往哪里扩展从一次融合到一套可靠决策体系6.1 任意辨识框架下的实现思路上面的代码默认辨识框架大小是 3但核心逻辑完全可以推广。如果你有 q 个互斥命题只需要把证据质量向量拉长到 (2^q-1)logBeliefSimilarity和dsPairOrthogonal不需要改一行。只要保证所有输入 BPA 的焦元顺序一致整数编码就能自动处理交集。如果不想维护长向量可以改成结构体或者 cell 数组只存非零焦元。比如evidence struct(set, {1, 3, 7}, mass, {0.8, 0.1, 0.1});dsPairOrthogonal需要对所有焦元对穷举交集用bitand逻辑和向量版本完全一致。这样对大规模辨识框架更友好。6.2 用仿真实验给方法“验伤”相似度前处理不是银弹我建议每次接入新数据源时都做一轮蒙特卡洛仿真。仿真思路非常简单先设定一个真实命题再生成若干路证据体。其中大部分证据围绕真实命题生成随机加入少量噪声再专门生成一路“离群证据”让它的支持方向与真实命题相反。然后分别用原始 D-S 和 对数相似度折扣D-S 做融合统计两类方法的识别正确率。我自己的实验经验是当离群证据占比不超过三分之一、且离群方向明确时相似度前处理提升明显。但如果所有证据的质量都低到接近随机任何方法都无法挽救。此时应该回到数据源本身的可靠性检测而不是在融合规则上继续加魔法。6.3 我现在的默认做法与建议经过几个项目反复折腾我现在处理多源证据融合时默认链路基本固定先做对数相似度矩阵算支持度再做相对折扣最后 D-S 组合。代码短、可解释、效果好最重要的是省掉了“拍脑袋决定哪路传感器更可靠”的过程。如果你打算在自己的代码里采用这套方法有一点我特别想提醒不要把相似度阈值设得太绝对。比如“相似度低于 0.3 就丢掉这路证据”这种规则很容易误伤。更稳的做法是保留证据但用折扣系数让它的影响力自动变低让 D-S 组合阶段去决定最终结果。我后来还在一些场景里试过把对数相似度进一步用到时序融合里每一帧先进来一批证据先算相似度矩阵再来一个指数滑动平均更新每路证据的可靠度。效果也还不错。这篇先写到这希望这几十行 MATLAB 和一整套思路能帮你少踩几个我踩过的坑。

关于恒美微站

恒美微站专注于为个体商户、工作室提供极简自助建站服务,让每个人都能轻松拥有专业网站。

快速链接

  • 关于我们
  • 建站服务
  • 主题模板
  • 案例展示
  • 资讯中心

服务项目

  • 可视化建站
  • 拖拽编辑
  • 主题定制
  • SEO 优化
  • 网站托管

联系方式

  • 📍 地址:北京市朝阳区建国路 88 号
  • 📞 电话:400-888-8888
  • ✉️ 邮箱:info@hmyw.cn
  • 🕐 时间:周一至周日 9:00-18:00

© 2024 恒美微站 hmyw.cn 版权所有 | 京 ICP 备 12345678 号