复现论文时,最怕的不是代码报错,而是图看起来相似,但内在逻辑却对不上——例如为了强行匹配文中某个单点数值,反而毁掉了整条曲线的合理性。
书接前文

在航天器进行贝叶斯网络评估空间目标威胁模型建立后,文中设置了两组实验场景。
五、场景一:抵近绕飞——此一役,先抵近,后绕飞
论文第一个仿真场景是抵近绕飞,一共 20 个时间步。
它的大致过程是:
第 0~1 步:轨道保持
第 2~8 步:抵近
第 9~16 步:绕飞
第 17~19 步:飞离
此外,论文还设置了两个关键条件:
第 10~15 步:出现形态异常
第 12~15 步:光照条件变差
目标类型设为军用卫星,载荷工作状态保持良好。
这一段很像一场分阶段推进的战局。
前两步还算平静。
第 2 步开始,轨道阶段一变,局势马上不同。
5.1 第 2 步:轨道阶段一变,动态威胁立刻抬头
论文结果显示,第 2 步时,由于轨道特征发生转变、相对距离缩短,动态威胁高从约 0.3 上升到约 0.7496。
这一下非常明显。
就像帐中斥候来报:
敌军不再原地驻扎,已转为抵近。
此时即便距离还没到最近,轨道阶段的变化已经足够让模型提高警惕。

5.2 第 9 步:进入绕飞,威胁并非一路无脑上升
到了第 9 步,目标进入绕飞阶段。
这里很有意思。
综合威胁没有一路无脑上升,而是出现短暂调整。
我的理解是:
绕飞仍然敏感,但它和“直接抵近碰撞”的风险表达不完全一样。
这时相对距离、相对速度、轨道阶段共同作用,曲线会出现阶段性变化。
这也说明模型不是单纯看距离。
如果只看距离,这一段很容易解释得很粗糙。
5.3 第 10~15 步:真正的“伏兵”出现了

第 10 步之后,形态异常出现。
告警信息升高。
第 12~15 步,光照条件变差。
探测条件受影响,静态威胁也被抬高。
这一段像什么?
像前线已经接近,中军又收到两封急报:
一是目标出现异常动作。
二是观测条件变差,看不清了。
这两个因素叠加后,综合威胁高在这一段达到高位。
论文中图 10 显示,轨道保持转为抵近时,威胁度高从约 0.3941 升至约 0.6225;第 10 步形态异常后,威胁度高又从约 0.6438 提升到约 0.7821;随后在光照恶化影响下进一步升高,最高约 0.7956。

说明了,威胁升高不只是因为“近了”,还因为“动作变了、观测难了、告警来了”。
5.4 第 17 步以后:飞离,威胁下降
第 17 步以后,目标进入飞离阶段。
相对距离和速度状态都发生变化。
动态威胁和综合威胁随之下降。
这也符合直觉。
所谓“军情有变”,不只是变坏,也可能变好。
目标飞离,威胁自然要降下来。
六、场景二:碰撞——这一战更直接
第二个场景是碰撞,一共 24 个时间步。
设定更直接:
第 0~2 步:轨道保持
第 3~23 步:抵近
相对距离逐渐缩短,最后进入碰撞邻域
光照条件全程良好
载荷工作状态全程良好
目标类型为军用卫星
这次没有那么多绕飞、阴影、异常形态的变化。
它更像一条线:
距离不断缩短,威胁逐渐升高。
但这里仍然有一个关键点:
第 3 步,轨道阶段从保持变成抵近。
这一变,模型立刻响应。
6.1 第 3 步:动态威胁直接跃升
论文图 13 显示,轨道保持阶段,动态威胁高大约是 0.3。
第 3 步轨道阶段变为抵近后,动态威胁高跃升到约 0.7516。
随后相对速度保持“中”,轨道阶段保持“抵近”,动态威胁主要由相对距离推动。
随着距离继续缩短,动态威胁高继续上升,并在相撞前达到约 0.88。

这一段可以总结成一句话:
轨道阶段负责“突然抬头”,相对距离负责“继续加压”。
这就是场景二的曲线逻辑。
6.2 综合威胁:不是最后一刻才报警
场景二图 14 更直观。
第 0 步时,威胁程度的模糊表达约为:
[0.3120,0.1898,0.4982]
这里三个数分别对应:威胁高、威胁中、威胁低。
第 3 步,轨道阶段由保持变为抵近,威胁程度变为:
[0.5523,0.1838,0.2639]
也就是说,威胁高从约 0.31 升到约 0.55。
到第 23 步,随着相对距离进一步缩短,威胁程度约为:
[0.6192,0.1823,0.1985]

这说明模型不是等到最后一刻才反应。
当轨道阶段切换为抵近时,它已经明显提高了威胁判断。
七、复现时我踩到的坑:复现不能太“听话”
诸公,论文复现这件事,最怕什么?
不是报错。
报错至少摆在明处。
最怕的是:
图看起来像,逻辑却没对上。
这次复现里,我最明显的感受是:不能只盯一张图,也不能只盯一个数。
7.1 坑一:场景二初始速度状态
场景二里,论文图 13 的初始动态威胁高大约是 0.3。
但如果代码里把第 0~2 步的相对速度设得过小,它就会落到“相对速度慢”的状态。
这样动态威胁高会偏低,可能只有约 0.15 左右,就和论文趋势对不上。
后来我按论文场景描述,把场景二相对速度处理为“中”,这样第 0~2 步的动态威胁才回到 0.3 附近。
这不是简单调参。这是在检查输入初值是否真的符合论文描述。
7.2 坑二:图 13、图 14 和表 9 不是随便能同时满足
另一个更微妙的问题是:
图 13、图 14 和表 9 之间,存在轻微不可完全同时满足的地方。
如果严格按照图 13 的动态威胁,再直接套表 8、表 9,有时图 14 的初始综合威胁会偏高。
这里就不能硬说“完全一致”。而是在论文没有公开完整原始仿真输入时,只能在公开表格、正文数值和曲线形态之间做最合理的反向约束。
这不是造数据。这是复现必须交代清楚的地方。
复现论文,贵在如实;不因一图合而掩其疑,不因一点差而弃全局。
7.3 坑三:不要为了一个点,毁掉一条曲线
场景一复现时,我一开始也想过把某些点强行拉到论文文字里的数值。
但很快发现:一个点看起来对了,整条曲线反而不自然。
后来我优先保证整体趋势、关键转折和模型逻辑,而不是为某个单点硬拟合。
这点很重要。论文复现不是照着结果画一遍曲线,而是要问:
输入是否合理?
条件概率表是否用对?
图像趋势和文字描述是否互相支撑?
代码实现有没有隐藏问题?
这些问题问清楚,复现才有价值。
八、这次代码复现做了什么?
这次复现主要有两套代码。
一套是C 语言工程,它可以直接运行,也可以输出 CSV 数据。
另一套是MATLAB脚本。它可以生成中英文图表、CSV 数据和论文关键数值对照表。
本篇分享不是读完摘要就结束。而是把公式变成代码,把代码跑成图,再拿图反过来质疑公式和输入。
九、我从这篇论文里学到了什么?
这篇论文最值得学习的,不是某一个威胁数值。
而是一套可解释的建模流程。
我总结成三句话。
9.1 第一,连续变量不要急着硬切
距离、速度都是连续变化的。
直接硬切阈值,容易造成边界跳变。
模糊隶属度的价值就在于:
让状态变化有过渡。
9.2 第二,威胁评估不能只看一个指标
只看距离不够。
还要看速度、轨道阶段、形态异常、历史行为、目标类型、探测条件、光照条件、载荷状态。
这就像帐中议事。
一人之言,只能作参考。
多路军情合议,才可能接近真实判断。
9.3 第三,可解释模型也有代价
贝叶斯网络的好处是清楚。
节点关系清楚,条件概率清楚,推理链条也清楚。
但代价是:
条件概率表依赖专家知识,不同场景可能要重新校准。
所以我不会把它说成万能系统。
更准确的说法是:
它是一套适合学习和复现的可解释概率融合框架。
纸上得来终觉浅,代码跑过方知难。 诸公若有高见,欢迎留言交流。 愿与诸公共读、共学、共思、共进。 今日跑通一图,明日再破一关。
参考论文
曲宗华,魏春岭。
《一种空间目标异动威胁评估的贝叶斯网络模型》。
《航天控制》,2023 年第 41 卷第 4 期。
说明
本文基于公开论文内容和本人复现过程整理,仅用于学习交流。
文中讨论范围限于论文给出的合成仿真场景、贝叶斯网络模型、模糊隶属度方法和代码复现过程。
本文不涉及真实在轨目标识别、实时轨道数据、规避策略或任何操作性对抗方案。
部分代码:
function results = Bayes_model_reproduction(scene, makePlots)
%两个空间目标威胁评估场景。
% scene=0 表示一次运行两个场景;makePlots=false 时只生成数据和对照表。
if nargin < 1 || isempty(scene)
scene = 0;
end
if nargin < 2 || isempty(makePlots)
makePlots = true;
end
if scene == 0
results.scene1 = runScenario(1);
results.scene2 = runScenario(2);
writeScenario(results.scene1, 'bayes_scene1_results.csv');
writeScenario(results.scene2, 'bayes_scene2_results.csv');
writeAlignmentReport(results);
if makePlots
plotPaperFigures(results.scene1, results.scene2);
end
elseif scene == 1 || scene == 2
results = runScenario(scene);
writeScenario(results, sprintf('bayes_scene%d_results.csv', scene));
writeAlignmentReportForOne(results);
if makePlots
plotPaperFiguresForOne(results);
plotPaperFiguresChineseForOne(results);
end
else
error('scene must be 0, 1, or 2.');
end
end

&spm=1001.2101.3001.5002&articleId=162133643&d=1&t=3&u=ee363aae5d7643ce8b82478c17fc92be)
1057

被折叠的 条评论
为什么被折叠?



