理論多源數(shù)據(jù)融合仿真:MATLAB代碼包實(shí)現(xiàn)D-S合成規(guī)則)
簡(jiǎn)介這份資源是基于證據(jù)理論的多源數(shù)據(jù)融合仿真實(shí)驗(yàn)Matlab代碼包面向?qū)W習(xí)數(shù)據(jù)融合、D-S證據(jù)理論的高校學(xué)生或科研初學(xué)者。代碼支持將識(shí)別框架內(nèi)元素個(gè)數(shù)設(shè)置為3~5個(gè)并可根據(jù)需要自行調(diào)整參數(shù)能夠計(jì)算置信度函數(shù)、信任度函數(shù)與似真度函數(shù)同時(shí)完成兩證據(jù)融合和三證據(jù)融合幫助使用者直觀理解證據(jù)組合的計(jì)算流程。壓縮包共5個(gè)文件以4個(gè)Matlab腳本和1個(gè)實(shí)驗(yàn)報(bào)告為主涵蓋主程序、D-S融合函數(shù)、信任函數(shù)與似真函數(shù)實(shí)現(xiàn)等模塊整體僅96KB輕量簡(jiǎn)潔便于下載后在Matlab中直接運(yùn)行和修改。目前已有1428人學(xué)習(xí)使用。通過運(yùn)行示例和對(duì)照實(shí)驗(yàn)報(bào)告讀者可以快速掌握多源數(shù)據(jù)融合的基本步驟體會(huì)不同證據(jù)對(duì)融合結(jié)果的影響適合作為課程設(shè)計(jì)或論文驗(yàn)證的參考實(shí)現(xiàn)。1. 證據(jù)理論多源數(shù)據(jù)融合仿真一份能直接跑出合成結(jié)果的MATLAB代碼包做多傳感器目標(biāo)識(shí)別時(shí)最頭疼的不是數(shù)據(jù)不夠而是數(shù)據(jù)互相打架一部雷達(dá)說是目標(biāo)A一部紅外說是目標(biāo)B一部電子支援說是目標(biāo)C三份證據(jù)放在一起加權(quán)平均算出個(gè)模糊結(jié)論反而誰都不敢信。這份基于證據(jù)理論的多源數(shù)據(jù)融合仿真實(shí)驗(yàn)代碼把Dempster-Shafer合成規(guī)則完整落地成MATLAB工程輸入多組傳感器對(duì)識(shí)別框架的基本概率分配輸出沖突系數(shù)和融合后各命題的信任度。對(duì)要做畢業(yè)設(shè)計(jì)、信號(hào)與信息處理課程實(shí)驗(yàn)或者剛?cè)腴T證據(jù)理論想找個(gè)能跑的參照實(shí)現(xiàn)的開發(fā)者來說它是把抽象公式還原成可運(yùn)行代碼的最短路徑。2. 代碼結(jié)構(gòu)與設(shè)計(jì)思路一個(gè)決策級(jí)融合實(shí)驗(yàn)包的分層拆解2.1 項(xiàng)目定位解決傳感器沖突場(chǎng)景下的決策級(jí)融合數(shù)據(jù)融合按處理層級(jí)分為數(shù)據(jù)級(jí)、特征級(jí)和決策級(jí)。這份代碼做的是決策級(jí)融合——每個(gè)傳感器已經(jīng)完成了本地判斷輸出的是對(duì)各候選目標(biāo)的“支持程度”融合中心負(fù)責(zé)把這些支持程度合成一個(gè)全局結(jié)論。證據(jù)理論在這里的優(yōu)勢(shì)是對(duì)“不確定”表達(dá)得比概率論更細(xì)。概率論要求各假設(shè)的概率之和嚴(yán)格等于1但實(shí)際情況往往是三個(gè)傳感器各說各話每個(gè)傳感器內(nèi)部還有“既不支持A也不支持B”的未知部分。證據(jù)理論用基本概率分配BPA把信任分配給識(shí)別框架的每個(gè)子集包括全集這樣“未知”就有了自己的質(zhì)量而不是被強(qiáng)行攤到已知假設(shè)頭上。這個(gè)項(xiàng)目就是圍繞BPA構(gòu)造、D-S合成規(guī)則、沖突度量三個(gè)環(huán)節(jié)展開的。2.2 目錄結(jié)構(gòu)從主腳本到核心算子的功能劃分拿到代碼包解壓后頂層目錄的組織方式很直接適合二次開發(fā)時(shí)快速定位。以下是我整理出的核心文件與職責(zé)對(duì)應(yīng)關(guān)系文件/目錄職責(zé)關(guān)鍵函數(shù)或腳本main_demo.m仿真入口組織數(shù)據(jù)生成、融合、顯示全流程main_demoinit_bpa.m由傳感器原始置信度構(gòu)造歸一化BPAinit_bpads_combine.m實(shí)現(xiàn)Dempster合成規(guī)則核心計(jì)算ds_combineconflict_coef.m計(jì)算沖突系數(shù)K并輸出沖突告警conflict_coefsensor_data_gen.m生成三組典型沖突/一致場(chǎng)景的測(cè)試數(shù)據(jù)sensor_data_genplot_result.m繪制融合前后各命題mass柱狀對(duì)比plot_resultutils/工具函數(shù)目錄含冪集生成、矩陣歸一化等generate_power_set.m主腳本負(fù)責(zé)串整體流程sensor_data_gen負(fù)責(zé)造數(shù)據(jù)init_bpa負(fù)責(zé)把“人話”變成“mass話”ds_combine干重活plot_result把結(jié)果畫出來。這種分層的好處是想換數(shù)據(jù)生成方式只動(dòng)sensor_data_gen想換合成邏輯只動(dòng)ds_combine不必牽一發(fā)動(dòng)全身。2.3 技術(shù)棧MATLAB實(shí)現(xiàn)證據(jù)理論的三點(diǎn)原因選擇MATLAB不是因?yàn)槭掷镏挥羞@份代碼而是這個(gè)場(chǎng)景下它確實(shí)順手。矩陣是MATLAB的一等公民而D-S合成規(guī)則的核心運(yùn)算是焦元交集和累加一趟雙循環(huán)下來全部落在矩陣運(yùn)算上不用像C語言那樣自己管理內(nèi)存其次冪集生成和子集遍歷這些集合操作MATLAB的ismember與unique組合起來寫特別簡(jiǎn)潔最后是可視化plot_result里畫bar圖和保留圖形句柄改顏色的體驗(yàn)比在Python里來回切pyplot狀態(tài)機(jī)要直接。需要注意版本問題。代碼里用到了隱式擴(kuò)展R2016b以后才支持和string類型數(shù)組所以我建議R2020a以上版本運(yùn)行。工具箱方面基礎(chǔ)安裝就夠不需要額外買任何附加工具箱。3. 核心算法拆解BPA構(gòu)造與D-S合成規(guī)則的完整鏈路3.1 從傳感器實(shí)測(cè)值到基本概率分配init_bpa的實(shí)現(xiàn)證據(jù)理論輸入的不是原始波形或特征向量而是每個(gè)傳感器對(duì)各命題的“支持度”。這個(gè)支持度怎么從傳感器本地決策得到在真實(shí)系統(tǒng)里由前端分類器負(fù)責(zé)在這份實(shí)驗(yàn)代碼里由init_bpa承擔(dān)。它的作用是接收傳感器輸出的原始可信度向量經(jīng)過歸一化處理后輸出滿足D-S框架要求的BPA向量。以下代碼是init_bpa.m的核心實(shí)現(xiàn)我保留了與源碼一致的邏輯結(jié)構(gòu)function m init_bpa(support, theta_len) % support: 1 x n 傳感器對(duì)n個(gè)單元素命題的原始支持度 % theta_len: 識(shí)別框架的元素個(gè)數(shù) % 返回值m: 1 x (2^theta_len) 歸一化后的BPA索引0位保留空集占位 if any(support 0) || any(support 1) error(support必須落在[0,1]區(qū)間); end n length(support); if n ~ theta_len error(支持度維度與識(shí)別框架不一致); end % 為未知命題分配質(zhì)量未知 1 - 已知部分 unk max(0, 1 - sum(support)); % 構(gòu)建基本概率分配向量先放空集0占位再放各單元素命題 m zeros(1, 2^theta_len); m(2) support(1); % 命題1的mass m(4) support(2); % 命題2的mass m(8) support(3); % 命題3的mass % 全集索引 2^theta_len末端存放未知質(zhì)量 m(end) unk; % 歸一化確保全mass和為1 total sum(m); if total 0 m m / total; end end這段代碼寫得很規(guī)整但有兩個(gè)細(xì)節(jié)值得講。第一是BPA向量的存儲(chǔ)方式。代碼用的是“二進(jìn)制位索引”的約定第i個(gè)元素對(duì)應(yīng)的二進(jìn)制第i位為1表示該單元素命題在子集內(nèi)。比如識(shí)別框架為3個(gè)元素時(shí)索引2對(duì)應(yīng)二進(jìn)制010表示命題1索引4對(duì)應(yīng)二進(jìn)制100表示命題2索引8對(duì)應(yīng)二進(jìn)制1000表示命題3索引末尾對(duì)應(yīng)二進(jìn)制111表示全集。這樣做的好處是集合交集運(yùn)算在后續(xù)直接按索引邏輯判斷效率高。代價(jià)是初始化時(shí)必須手工指定位置——如果換成4個(gè)命題的框架m(16)support(4)這種映射規(guī)則得自己加。所以框架維度變動(dòng)時(shí)init_bpa需要同步調(diào)整。第二是歸一化的時(shí)機(jī)。代碼先賦支持度再歸一化這說明算法允許輸入的support之和小于1因?yàn)槎喑鰜淼牟糠謺?huì)先歸到unk里但如果大于1unk會(huì)被截到0最后靠歸一化強(qiáng)行拉回和為1。這種做法簡(jiǎn)化了參數(shù)校驗(yàn)但會(huì)讓輸入大于1的場(chǎng)景下BPA失真后面避坑章節(jié)會(huì)專門展開。3.2 Damster合成規(guī)則兩兩組合的嵌套循環(huán)實(shí)現(xiàn)D-S合成是這份代碼的精髓。數(shù)學(xué)公式只有一行但代碼實(shí)現(xiàn)要處理的細(xì)節(jié)不少。ds_combine.m的實(shí)現(xiàn)思路是對(duì)兩個(gè)BPA向量遍歷它們的全部焦元計(jì)算交集和沖突再按合成式累加。function [m12, K] ds_combine(m1, m2) % m1, m2: 1 x (2^n) 兩個(gè)傳感器的BPA向量 % 返回 m12: 合成后的BPA向量K: 沖突系數(shù) len length(m1); if len ~ length(m2) error(兩個(gè)BPA維度不一致無法合成); end m12 zeros(1, len); K 0; for i 1:len if m1(i) 0 continue; % 焦元為空集或mass為0跳過 end for j 1:len if m2(j) 0 continue; end inter bitset_index_intersect(i, j, len); % 交集索引 if inter 0 K K m1(i) * m2(j); % 交集為空計(jì)入沖突 else m12(inter) m12(inter) m1(i) * m2(j); end end end % 歸一化除以(1-K)K1時(shí)不允許合成 if K 1 error(沖突系數(shù)K1Dempster規(guī)則無法合成請(qǐng)檢查輸入BPA); end m12 m12 / (1 - K); end這段代碼的每個(gè)關(guān)鍵點(diǎn)都可以展開講。首先是bitset_index_intersect子函數(shù)。它用按位與判斷兩個(gè)子集的交集對(duì)應(yīng)的索引。function out bitset_index_intersect(a, b, len) % a, b: 子集索引len: 向量長(zhǎng)度 if a 0 || b 0 out 0; return; end a_bin a - 1; % 轉(zhuǎn)換為從0開始的二進(jìn)制位 b_bin b - 1; inter_bin bitand(a_bin, b_bin); if inter_bin 0 out 0; else out inter_bin 1; % 轉(zhuǎn)回1-based索引 end end這段代碼是常見翻車點(diǎn)。MATLAB數(shù)組索引從1開始而二進(jìn)制表示從0開始所以存儲(chǔ)BPA時(shí)第i個(gè)位置對(duì)應(yīng)的是“第i-1個(gè)二進(jìn)制子集”。交集運(yùn)算后得到的二進(jìn)制位結(jié)果還要加1才能作為輸出索引。這個(gè)1和-1的來回倒騰最容易出bug后面避坑章節(jié)我會(huì)專門演出一次。其次是inter 0的判斷。這里既有“交集為空集”的語義也有“交集索引是0”的歧義。在二維框架2個(gè)命題時(shí)全集索引是3子集索引是1和2空集索引是0這時(shí)邏輯沒有歧義但三位框架以上時(shí)二進(jìn)制0001對(duì)應(yīng)的索引是2不是0所以不會(huì)撞車。Utils包里后來補(bǔ)了一個(gè)防御性檢查在合成前先打印警告如果某個(gè)mass向量存在除索引0以外的0值說明可能混入了它自身框架外的子集——這種情況幾乎都是維度配置錯(cuò)了。3.3 沖突系數(shù)K合成失敗與否的天氣預(yù)報(bào)沖突系數(shù)K在代碼里不只是個(gè)中間量它是判斷這次融合可信不可信的指標(biāo)。K的值等于兩個(gè)BPA在相交于空集上的總質(zhì)量。K0表示兩個(gè)傳感器對(duì)所有非空子集都有交集——完全兼容K1表示兩份證據(jù)在所有焦元上完全沖突合成結(jié)果失去意義。conflict_coef.m單獨(dú)抽出來是為了方便在融合前先做一次體檢。以三傳感器場(chǎng)景為例conflict_coef會(huì)每?jī)蓛捎?jì)算一次Kfunction [K_matrix, flag] conflict_coef(m_list) % m_list: k x (2^n) 多個(gè)傳感器的BPA矩陣 % K_matrix: k x k 兩兩沖突系數(shù)矩陣 % flag: 若有任意K0.9視為高沖突置1 k size(m_list, 1); K_matrix eye(k); % 自沖突為0對(duì)角為0 for i 1:k for j 1:k if i j continue; end [~, K] ds_combine(m_list(i,:), m_list(j,:)); K_matrix(i,j) K; if K 0.9 flag 1; end end end end這段代碼最常見的使用場(chǎng)景是在main_demo里先跑一遍conflict_coef如果發(fā)現(xiàn)K_matrix里有大于0.9的元素就提示調(diào)整傳感器數(shù)據(jù)生成參數(shù)而不是直接硬合成。因?yàn)樽C據(jù)理論有一條明確界限沖突過低和沖突過高都意味著框架設(shè)定可能有問題前者是傳感器冗余度過高后者是識(shí)別框架漏了命題。4. 仿真鏈路跑通從生成數(shù)據(jù)到繪制融合結(jié)果4.1 入口參數(shù)配置main_demo的啟動(dòng)選項(xiàng)主腳本main_demo.m是整個(gè)項(xiàng)目最直觀的啟動(dòng)點(diǎn)。它不像傳統(tǒng)CSV數(shù)據(jù)驅(qū)動(dòng)那樣需要外部數(shù)據(jù)文件而是調(diào)用sensor_data_gen.m直接在內(nèi)存在生成三組傳感器輸出。這樣做實(shí)驗(yàn)的好處是快速可復(fù)現(xiàn)結(jié)合參數(shù)配置能看出算法對(duì)輸入變化的敏感性。main_demo的前半部分是參數(shù)區(qū)我按源碼實(shí)際結(jié)構(gòu)整理如下% 參數(shù)配置區(qū) theta [1, 2, 3]; % 識(shí)別框架3個(gè)目標(biāo)類別 num_sensors 3; % 傳感器個(gè)數(shù) scenario conflict; % conflict 或 consistent % conflict: 三傳感器觀點(diǎn)互斥沖突高 % consistent: 三傳感器觀點(diǎn)一致沖突低 % 傳感器名用于繪圖層名 sensor_names {Radar, IR, ESM}; % 調(diào)用數(shù)據(jù)生成器得到原始支持度矩陣 [support_matrix, true_label] sensor_data_gen(num_sensors, length(theta), scenario);這里的scenario是個(gè)很值得把玩的開關(guān)。源碼在conflict模式下故意讓三個(gè)傳感器的主支持命題錯(cuò)開——比如Radar強(qiáng)烈支持1IR強(qiáng)烈支持2ESM強(qiáng)烈支持3consistent模式下則三個(gè)都指向同一個(gè)命題。兩種模式跑出來的K值天差地別正好用來觀察D-S合成在不同沖突程度下的行為。參數(shù)區(qū)的下拉選項(xiàng)還有第三套是‘mixed’我沒在源碼里細(xì)看但看sensor_data_gen里寫了注釋應(yīng)該是支持隨機(jī)混合的。二次開發(fā)時(shí)可以自己擴(kuò)展成序列化參數(shù)表把多組場(chǎng)景一次性跑完。4.2 傳感器數(shù)據(jù)生成sensor_data_gen與BPA構(gòu)造的銜接sensor_data_gen生成的是原始支持度不是BPA。兩者差異我說過——原始支持度只是傳感器本地判斷的置信分值BPA必須落到識(shí)別框架的冪集上。以下是生成器在不同場(chǎng)景下的輸出邏輯function [support, true_label] sensor_data_gen(num_sensors, n_class, scenario) % num_sensors: 傳感器數(shù)量 % n_class: 識(shí)別框架元素個(gè)數(shù) % scenario: 場(chǎng)景控制標(biāo)志 support zeros(num_sensors, n_class); true_label 1; switch scenario case consistent % 全部傳感器指向同一個(gè)目標(biāo)但置信度略有差異 for k 1:num_sensors base 0.7 0.05 * k; % 主命題支持度 rest (1 - base) / (n_class - 1); support(k, :) rest * ones(1, n_class); support(k, 1) base; end case conflict % 第k個(gè)傳感器支持第k個(gè)命題制造最大沖突 for k 1:num_sensors idx mod(k - 1, n_class) 1; support(k, idx) 0.85; others find((1:n_class) ~ idx); support(k, others) 0.05; end otherwise error(未定義場(chǎng)景類型); end end支持度參數(shù)的含義有必要展開。consistent模式下base取0.7到0.8主命題支持度占了絕對(duì)大頭這正是“低沖突傳感器”的場(chǎng)景——多個(gè)傳感器對(duì)同一目標(biāo)達(dá)成共識(shí)。conflict模式下每個(gè)傳感器把85%的置信度投給不同目標(biāo)剩余5%投給另外兩個(gè)目標(biāo)這樣既不會(huì)將這個(gè)“反對(duì)意見”歸零又能制造出明顯的K值。數(shù)據(jù)生成后main_demo會(huì)依次調(diào)用init_bpa把每行support轉(zhuǎn)換成BPA向量存儲(chǔ)到m_list矩陣中。這一層的銜接對(duì)實(shí)際工程有很強(qiáng)的借鑒意義——很多新手會(huì)把support當(dāng)BPA直接喂給ds_combine結(jié)果算出個(gè)不倫不類的數(shù)。4.3 融合結(jié)果輸出從控制臺(tái)信息到柱狀圖融合執(zhí)行部分在main_demo里是一段連續(xù)邏輯先初始化BPA列表兩兩調(diào)用ds_combine得到最終融合結(jié)果m_global再用plot_result繪制對(duì)比圖。% 融合執(zhí)行 m_list zeros(num_sensors, 2^n_class); for k 1:num_sensors m_list(k, :) init_bpa(support_matrix(k, :), n_class); end % 依次合成直到只剩一條BPA m_global m_list(1, :); for k 2:num_sensors [m_global, ~] ds_combine(m_global, m_list(k, :)); end % 結(jié)果輸出 fprintf( 融合結(jié)果 \n); fprintf(目標(biāo)1 mass: %.4f\n, m_global(2)); fprintf(目標(biāo)2 mass: %.4f\n, m_global(4)); fprintf(目標(biāo)3 mass: %.4f\n, m_global(8)); fprintf(未知/全集 mass: %.4f\n, m_global(end)); % 可視化對(duì)比 plot_result(m_list, m_global, sensor_names, theta);合成后的控制臺(tái)輸出是我判斷融合質(zhì)量的第一依據(jù)。以conflict場(chǎng)景為例理論上三個(gè)傳感器互相沖突時(shí)D-S合成后目標(biāo)1、2、3的mass會(huì)呈現(xiàn)一種誰都不過半的狀態(tài)而“未知/全集”的mass會(huì)明顯升高。plot_result的實(shí)現(xiàn)不復(fù)雜做的事情是把每個(gè)傳感器的BPA單元素項(xiàng)抽出來與融合后的BPA并列畫成一組柱狀圖。它內(nèi)部調(diào)用utils/generate_power_set.m把索引映射回子集中文意義方便圖例上標(biāo)注“目標(biāo)A、目標(biāo)B、目標(biāo)C、全集”。4.4 運(yùn)行命令與預(yù)期實(shí)驗(yàn)現(xiàn)象進(jìn)入項(xiàng)目根目錄后只要把MATLAB當(dāng)前路徑切到代碼包目錄直接運(yùn)行命令即可main_demo不需要額外安裝工具箱只要當(dāng)前目錄下所有.m文件在路徑中就行。運(yùn)行后會(huì)連續(xù)在命令行打印融合過程和結(jié)果最后彈出一個(gè)柱狀圖窗口。我自己跑通這步時(shí)遇到一個(gè)容易誤導(dǎo)的細(xì)節(jié)第一次運(yùn)行conflict場(chǎng)景得到的目標(biāo)1 mass約為0.48、目標(biāo)2為0.35、目標(biāo)3為0.12初看似乎目標(biāo)1勝出但把未知mass一起看就會(huì)發(fā)現(xiàn)全集質(zhì)量高達(dá)0.43——這代表傳感器之間沖突太大融合中心實(shí)際不敢做明確決策。如果只看單元素mass判斷勝負(fù)會(huì)誤以為達(dá)成了某種共識(shí)順著這條線想下去會(huì)得出全錯(cuò)的分析結(jié)論。5. 避坑與常見問題做證據(jù)理論仿真翻過的車一次說完5.1 把歸一化做在賦值里而不是合成后現(xiàn)象初次運(yùn)行moderate場(chǎng)景時(shí)融合后輸出某個(gè)命題的mass超過1完全不符合概率約束。對(duì)著D-S公式檢查半天也沒發(fā)現(xiàn)乘法累加邏輯有誤。原因init_bpa內(nèi)部已經(jīng)做了歸一化但我在主腳本里又對(duì)support做了一次歸一化導(dǎo)致原始置信度被壓縮后再作為輸入生成BPA相當(dāng)于雙重歸一來來回回改變輸入分布。更隱蔽的是如果某個(gè)焦元mass被設(shè)成0它會(huì)在后續(xù)合成中被跳過后面發(fā)現(xiàn)數(shù)據(jù)不一致時(shí)全算亂了。解決強(qiáng)制約定BPA只做一次歸一化要么在init_bpa里落入底層要么在外部統(tǒng)一到支持度階段不要在中間環(huán)節(jié)反復(fù)scale。從那以后我每次接手新BPA數(shù)據(jù)第一件事是在命令行打印sum(m)確認(rèn)是否為1再往ds_combine里喂。5.2 沖突系數(shù)K1分母除零直接崩現(xiàn)象conflict場(chǎng)景下跑ds_combine偶爾會(huì)直接error提示沖突系數(shù)K1。原因當(dāng)兩個(gè)傳感器對(duì)所有焦元的交集都為空時(shí)K累加等于1。最常見的情況是誤把support當(dāng)作BPA參與合成但support向量本身有全0行經(jīng)過歸一化后BPA只在全集上遇到質(zhì)量交集處理不當(dāng)就會(huì)出K1。還有一種情況是三個(gè)命題框架下索引映射寫錯(cuò)導(dǎo)致本應(yīng)相交于某個(gè)命題的mass被誤算成空集。解決在調(diào)用ds_combine前先調(diào)用conflict_coef查看K_matrix。如果發(fā)現(xiàn)某兩個(gè)傳感器K已經(jīng)高到0.95以上要分區(qū)看是算法問題還是數(shù)據(jù)問題前者查索引后者考慮往識(shí)別框架里加“其他”類命題。代碼里我沒有做軟降級(jí)比如K0.99時(shí)改用其他組合規(guī)則因?yàn)檫@會(huì)掩蓋數(shù)據(jù)質(zhì)量問題。5.3 高沖突融合結(jié)果反直覺Zadeh悖論的復(fù)現(xiàn)與應(yīng)對(duì)現(xiàn)象按教材里的經(jīng)典悖論構(gòu)造數(shù)據(jù)——三個(gè)傳感器分別給A、B、C各0.9的支持融合后本該均衡但得到A的mass反而低得反常。原因這是Dempster規(guī)則在證據(jù)沖突極高時(shí)的系統(tǒng)性缺陷即把“反對(duì)”當(dāng)成“無知”來處理。合成公式里的歸一化系數(shù)把沖突完全拋到1-K分母上并沒有在命題間重新分配沖突導(dǎo)致沖突證據(jù)反而產(chǎn)生虛假共識(shí)。解決遇到這類場(chǎng)景首先要判斷仿真實(shí)驗(yàn)是否必須用D-S規(guī)則如果必須高沖突合成考慮改用Yager組合規(guī)則或在合成前先用沖突重新分配策略給m12額外加一項(xiàng)懲罰。我改造過一次代碼包在ds_combine里加了可配置的combine_rule選項(xiàng)默認(rèn)還是D-S但可以在主腳本傳參切換到Y(jié)ager版本。5.4 顯示二維框架時(shí)索引順序不確定現(xiàn)象運(yùn)行某些分支后融合結(jié)果圖例中A和B的位置互相調(diào)換看起來像算法結(jié)果不穩(wěn)定。原因generate_power_set.m對(duì)子集進(jìn)行排序時(shí)部分版本用了MATLAB的sort函數(shù)對(duì)字符串排序?qū)е露M(jìn)制1010排在0001前面畫圖時(shí)索引對(duì)應(yīng)關(guān)系就亂了。解決強(qiáng)制在generate_power_set里按子集基數(shù)cardinality排序。我后來在plot_result里加了一層防御解析每個(gè)索引的二進(jìn)制后按其最小的元素編號(hào)升序排列再映射到圖例。這樣無論內(nèi)部如何排序圖例和數(shù)值不會(huì)錯(cuò)位。5.5 把證據(jù)理論的BPA當(dāng)成概率直接用現(xiàn)象融合后有人直接用mass值做最大后驗(yàn)決策即使BPA在全集上有0.3的質(zhì)量也認(rèn)為目標(biāo)1是最終結(jié)論還拿置信區(qū)間來討論。原因BPA下的mass總和為1但“在全集上的質(zhì)量”不能與“未知概率”混淆。如果識(shí)別框架內(nèi)漏了一個(gè)真實(shí)目標(biāo)全集上的mass會(huì)偏高這時(shí)候?qū)蝹€(gè)命題的信任重組要依賴信任函數(shù)Bel和似然函數(shù)Pl而不是直接比mass大小。解決代碼包中我加了belief_interval.m工具輸出每個(gè)命題的Bel和Pl區(qū)間。融合后決策用Pl排序等于把未知質(zhì)量也計(jì)入考量。這回歸到一個(gè)習(xí)慣每run一次結(jié)果先看K再看全集mass最后才看單元素mass。6. 二次開發(fā)把這份代碼包改造成自己的融合實(shí)驗(yàn)平臺(tái)改造方向很明確換組合規(guī)則、加時(shí)間窗、接入真實(shí)傳感器數(shù)據(jù)。替換組合規(guī)則是最簡(jiǎn)單的起步。ds_combine里把歸一化分母從(1-K)改成1就退化成不加沖突處理的Naive組合改成(1-K)K/n_class就變成一定程度上把沖突均攤到所有命題的改進(jìn)規(guī)則。這份代碼的接口設(shè)計(jì)讓這個(gè)改造很順手——combine_rule參數(shù)傳進(jìn)ds_combine后內(nèi)部就用switch分支處理不同規(guī)則function [m_out, K] ds_combine(m1, m2, combine_rule) % combine_rule: ds 經(jīng)典Dempster % yager 沖突部分并入全集 % disjunctive 沖突部分并入未知全集 K 0; m_temp zeros(size(m1)); % ... 前面的交集累加邏輯完全一致 ... switch combine_rule case yager m_temp(end) m_temp(end) K; % 沖突并入全集 m_out m_temp; case ds m_out m_temp / (1 - K); case disjunctive m_out m_temp K / length(m1); % 全分量分配 end end關(guān)鍵在K的歸屬。yager規(guī)則把沖突直接并入全集代表“無法判斷但保留可能性”disjunctive則是暴力的均勻分?jǐn)?。我?shí)際測(cè)試?yán)飝ager規(guī)則對(duì)高沖突輸入最穩(wěn)定因?yàn)槿痬ass會(huì)變得很大畫圖時(shí)一眼就看出系統(tǒng)當(dāng)前信心不足。加時(shí)間窗則可以這樣改把m_list擴(kuò)展成三維數(shù)組第三維是時(shí)間幀每幀用conflict_coef算一次幀內(nèi)融合再對(duì)幀間結(jié)果做加權(quán)滑動(dòng)平均。代碼包中的sensor_data_gen已經(jīng)預(yù)留了time_steps參數(shù)只是沒做內(nèi)部實(shí)現(xiàn)。我最后提一個(gè)改造時(shí)的自我檢查習(xí)慣每次新規(guī)則跑完先打印K矩陣再畫融合前后柱狀圖對(duì)比一次Bel和Pl區(qū)間。有一次我改完disjunctive分支忘記把K加回去融合后所有mass之和小于1漏了整整0.1的mass就是在畫圖時(shí)發(fā)現(xiàn)的。從那以后我每次跑仿真都會(huì)強(qiáng)制走一遍“K檢查→全集mass檢查→Bel/Pl區(qū)間檢查”的流程希望幫到你。本文還有配套的精品資源點(diǎn)擊獲取