简介:一份聚焦卫星认知通信频谱感知应用的学术论文《基于长短期记忆神经网络的卫星频谱多门限感知算法》,面向卫星通信、认知无线电、深度学习领域的研究者与工程技术人员,旨在解决传统频谱感知算法在低信噪比卫星信道下感知性能低、受通信时延影响大的问题。该论文来自《信号处理》期刊,资源包中仅有一个文档,为PDF格式,压缩包约三兆字节,内容即论文全文,系统阐述了长短期记忆神经网络用于频谱预测感知的完整方案,包括构建卫星认知通信模型、采用动量随机梯度下降算法更新网络、设计多门限优化策略,并给出了与其他神经网络算法的性能对比实验与结论。全文无需构建特征值,实验数据表明该算法在低信噪比和低迭代次数条件下具有更优感知性能。目前已有235人学习,适合作为科研选题、算法复现和课程设计的原始文献,可直接获得完整公式、图表与写作思路,便于深入理解方法细节。
1. 用 LSTM 做卫星频谱感知:先解决时延,再谈门限判决
把 LSTM 神经网络用在卫星频谱感知上,本质上不是换个分类器那么简单,而是把「感知」从一次测量变成一段预测。卫星认知通信里最麻烦的问题是大时延:SU 端拿到感知结果时,PU 信道状态可能已经变了,按旧数据接入就会撞车。这篇论文的思路很直接——既然实时测不准,那就用 LSTM 预测几百毫秒后的信道状态,再配合多门限判决把输出序列中的毛刺和惯性压下去。整套方案覆盖了卫星信道建模、M/M/1 排队论、LSTM 门控结构、SGDM 更新策略和多门限优化,适合正在做认知无线电、卫星通信或时序预测的工程师照着复现。不需要构建特征值,原始感知统计量直接进网络,这个特性对工程落地很友好。
2. 卫星认知信道建模:M/M/1 排队论与仿真参数表
2.1 场景设定与链路关系
论文的场景是一个 GEO 同步轨道卫星,透明转发模式,FDMA 多址。PU 和 SU 共用同一颗卫星的信道资源,SU 通过感知 PU 链路的下行信道状态来判断上行信道是否被占用。这里有一个容易被忽略的细节:下行信道是卫星到 PU 接收端这一段,上行信道是 PU 发送端到卫星这一段,SU 能感知到的只有下行,但要预测的其实是整条链路的占用情况。
由于卫星信道存在单跳 250ms 的时延,SU 在 t1 时刻感知到的实际上是 t0 时刻的 PU 信道状态。如果 SU 检测到频谱空穴并开始发送数据,数据还要再经过一段时延才能到达卫星端。所以 SU 真正要做的是:根据 t0 时刻的感知数据,预测 t0+2τ 时刻的信道状态,τ 为单跳卫星时延。这个「预测目标后移」是整篇算法设计的出发点,也是 LSTM 能发挥作用的关键位置——传统能量检测完全没有预测能力,只能拿过时数据做判决。
2.2 M/M/1 排队论建模 PU 信道状态
PU 信道状态被建模成 M/M/1 排队系统:个体用户到达时间服从参数 λ 的泊松分布,服务时间服从参数 μ 的负指数分布,单信道服务。信道状态在「空闲」和「占用」之间切换,通信强度 ρ 定义为:
- ρ = meanON / (meanON + meanOFF) = λ / μ
这个公式说明了一个工程上的便利:固定 μ(用户服务时长期望不变),只改变 λ 就能产生不同通信强度 ρ 的信道状态序列。论文用 ρ 从 0.1 到 0.9 的九条序列对比算法性能,就是因为 ρ 直接决定了信道忙闲比例,对漏检概率影响很大。ρ 越高,信道空闲时间越少,一旦判决出错,漏检概率上升幅度会非常明显。
对于 SU 接收端的感知数据,论文采用能量检测统计量:
- x(t) = Σ r(t) + n(t),其中采样点数取 10,采样频率 20 MHz
- r(t) 是 SU 接收到的 PU 卫星信号,n(t) 是噪声
- 噪声功率 Pn = N·T·B,N 为玻尔兹曼常数,T 为绝对温度,B 为单信道接收带宽
- 接收信噪比 SNR = 10lg(Pr / Pn)
接收功率 Pr 由 EIRP、卫星端增益、SU 接收增益和各段路径损耗决定。改变 EIRP 就能调整 SNR,从而对比不同低信噪比场景下的算法性能。下面给出一段参考代码,生成 ρ=0.5 时的信道状态序列和感知统计量,常见做法是用 Python 模拟排队过程,再叠加噪声产生感知数据。
import numpy as np def generate_channel_states(lmbda, mu, slots, rng=None): """ 生成 M/M/1 信道状态序列 lmbda: 用户到达率 (泊松分布参数) mu: 用户服务率 (负指数分布参数) slots: 感知时隙数量 """ if rng is None: rng = np.random.default_rng(42) states = np.zeros(slots, dtype=int) t = 0 while t < slots: # 空闲时长服从参数为 lmbda 的指数分布 idle = rng.exponential(1 / lmbda) t += int(idle) if t >= slots: break # 占用时长服从参数为 mu 的指数分布 busy = rng.exponential(1 / mu) states[t:min(t + int(busy), slots)] = 1 t += int(busy) return states def compute_sensing_statistic(states, snr_db, samples=10): """ 模拟 SU 能量检测统计量 states: 信道状态序列 (0/1) snr_db: 接收信噪比 (dB) samples: 每个时隙采样点数 """ snr_linear = 10 ** (snr_db / 10) noise_power = 1.0 signal_power = noise_power * snr_linear statistic = np.zeros(len(states)) for i, state in enumerate(states): if state == 1: # 占用状态:信号 + 噪声 statistic[i] = np.sum(np.sqrt(noise_power) * rng.standard_normal(samples) + np.sqrt(signal_power) * rng.standard_normal(samples)) else: # 空闲状态:只有噪声 statistic[i] = np.sum(np.sqrt(noise_power) * rng.standard_normal(samples)) return statistic代码逻辑说明:generate_channel_states 用指数分布的交替采样模拟 M/M/1 的信道状态切换,空闲时长和占用时长分别由到达率和服务率决定。compute_sensing_statistic 按论文的能量检测思想,对每个感知时隙做 10 次采样累加,占用状态叠加信号功率,空闲状态只有噪声。参数上,snr_db 取负值时信号功率小于噪声功率,模拟卫星低信噪比信道。
2.3 仿真参数与数据集构造
论文给出的卫星信道仿真参数是复现时必须对齐的硬指标:
| 参数 | 数值 |
|---|---|
| 卫星端增益 | 32 dB |
| SU 接收增益 | 34 dB |
| 出境中心频率 | 14253 MHz |
| 入境中心频率 | 12 GHz 量级(原文此位 OCR 缺失) |
| PU 信道带宽 | 10 MHz |
| 单跳卫星时延 | 250 ms |
| 调制方式 | QPSK |
数据集构造方面,感知间隔设为 500 ms,这是由单跳时延 250ms 决定的——预测目标要覆盖一个完整的往返时延。SU 感知数据统计量按长度 128 分块,对应 batchsize=128,再按 9:1 划分训练集和测试集。注意这里的分块不能打乱时间顺序,因为 LSTM 依赖时序关系,乱序切分会造成数据泄漏,后面避坑章节会详细说。
3. LSTM 门控与 SGDM 更新:公式、参数与收敛行为
3.1 从 RNN 到 LSTM:三个门控单元解决长期依赖
RNN 处理时序数据时有一个致命缺陷:当输入数据与所求输出的时间跨度较大时,之前较长时间的信息无法对后续输出造成影响,产生长期依赖问题。LSTM 在 1997 年由 Hochreiter 提出,核心改动是在隐藏层单元里增加了三个信息控制单元——输入门 i(t)、遗忘门 f(t)、输出门 o(t),通过门控机制保留有用信息、丢弃无用信息。
前向传播的核心公式如下:
- 输入门:i(t) = σ(W_i · x(t) + U_i · h(t-1) + b_i)
- 遗忘门:f(t) = σ(W_f · x(t) + U_f · h(t-1) + b_f)
- 输出门:o(t) = σ(W_o · x(t) + U_o · h(t-1) + b_o)
- 状态信息:c(t) = f(t) ⊙ c(t-1) + i(t) ⊙ tanh(W_c · x(t) + U_c · h(t-1) + b_c)
- 隐藏层输出:h(t) = o(t) ⊙ tanh(c(t))
- 网络输出:y(t) = W_y · h(t) + b_y
门控的本质是让梯度有一条「高速公路」可以穿过长时间步,之前的记忆通过遗忘门决定保留多少,新的输入通过输入门决定写入多少。这个机制对卫星频谱感知的意义在于:PU 信道状态的切换是时序相关的,前一段的空闲状态对当前判决有参考价值,而且感知间隔长达 500ms,序列的时间关联性天然偏弱,普通 RNN 早就把早期信息丢光了。
LSTM 网络训练采用基于时间的反向传播算法 BPTT,流程分六步:前向计算输出参数、反向计算各参数误差项、计算参数误差、用梯度更新算法更新、判断是否达到最大迭代次数或最小误差、输入测试集得到预测结果。整个流程和 BP 算法同源,区别只在误差沿时间维反向传播。
3.2 SGDM:动量项给梯度更新加「惯性」
随机梯度下降 SGD 的基本更新方式是 w(t) = w(t-1) + Δw(t),其中 Δw(t) = -η·∇L(w)。SGD 的问题在于更新方向不稳定,容易陷入局部最优点。SGDM 在 1999 年由 Qian 引入动量概念,更新公式变成:
- v(t) = α·v(t-1) - η·∇L(w)
- w(t) = w(t-1) + v(t)
其中 α 为动量因子,取值在 0 到 1 之间。动量项的作用是让参数更新获得「惯性」:在梯度方向一致的区域加速收敛,在局部最优点附近震荡时,梯度趋于零,动量项仍然推动参数继续前进,帮助跳出局部最优。论文用 SGDM 还有一个更实际的考量:当 PU 信道状态发生变化时,网络参数需要快速做出调整以适配新状态,SGDM 的惯性在这一场景下比普通 SGD 响应更快。
这里值得对比一下 ADAM。ADAM 融合了 AdaGrad 和 RMSProp 的思想,自动调节学习率,收敛通常很顺滑。但论文实验发现一个反直觉的结果:在低迭代次数场景下,ADAM-LSTM 要到迭代 85 次才收敛,而 SGDM-LSTM 和本文算法在 25 次左右就趋于平稳。原因是 ADAM 的自适应学习率在初期会拉低有效步长,而 SGDM 的动量项在坡度大的地方步长更大。对于离线训练时间有限的场景,SGDM 反而比 ADAM 更稳。
网络结构方面,本文算法是三层结构:输入层 128 个神经元,隐藏层 128 个神经元,输出层 1 个神经元。输入层 128 对应 batchsize=128 的分块长度,隐藏层神经元数量与输入层一致是 LSTM 时序预测的常见配置,输出层单节点输出 PU 信道状态的概率值。下面给出一段 PyTorch 参考实现:
import torch import torch.nn as nn import torch.optim as optim class LSTMPredictor(nn.Module): def __init__(self, input_size=128, hidden_size=128, output_size=1): super().__init__() self.lstm = nn.LSTM(input_size, hidden_size, batch_first=True) self.fc = nn.Linear(hidden_size, output_size) self.sigmoid = nn.Sigmoid() def forward(self, x): # x: [batch, seq_len, input_size] out, _ = self.lstm(x) out = self.fc(out[:, -1, :]) # 取最后一个时间步的输出 return self.sigmoid(out) model = LSTMPredictor(input_size=128, hidden_size=128, output_size=1) optimizer = optim.SGD(model.parameters(), lr=0.01, momentum=0.9) criterion = nn.BCELoss() # 二分类用二元交叉熵代码逻辑说明:LSTM 层输入维度是 128,对应每个样本包含 128 个感知统计量特征,batch_first=True 让输入形状为 [batch, seq_len, features]。输出层接 Sigmoid 把预测值压缩到 0~1 区间,便于后续门限判决。优化器特意用 SGD + momentum=0.9 实现 SGDM,而不是用 Adam——这是论文的核心配置,复现时不要顺手换成 Adam,除非你真的不在乎低迭代次数下的收敛速度。
3.3 训练配置的边界条件
论文实验中,两个小时仿真数据产生 14400 条感知统计量,GTX 1050 上离线训练时长约 40 秒。LSTM 因为隐藏单元结构复杂,训练时长明显高于 BP 网络和 NAR 网络——这是用计算复杂度换性能优势。如果复现时训练时间明显超出这个量级,优先检查是不是把 seq_len 和 input_size 搞反了,或者 batch 太大导致显存换页频繁。LSTM 的网络更新用 BPTT,梯度沿时间维展开,训练时间对序列长度很敏感。
4. 多门限判决优化:从单门限漏判到毛刺抑制
4.1 单门限判决的两个致命缺陷
LSTM 网络输出的预测序列取值范围是 (0, y_max],y_max 通常不超过 2。如果直接用单门限判决,取信道空闲状态为 0 时的预测均值 meanOFF 和占用状态为 1 时的预测均值 meanON 的中点作为门限:
- γm = (meanON + meanOFF) / 2
输出值大于 γm 判为 1,小于判为 0。看起来很简单,但卫星低信噪比场景下有两个问题。第一个是毛刺:信道状态为 1 时,低信噪比会让部分输出序列值低于 γm,被误判成 0,输出序列出现高频翻转的毛刺。第二个是惯性:假设 PU 信道状态从 0 变为 1,网络刚开始调整时由于 SGDM 的累计动量还没起来,输出值爬升不足,在 γm 以下停留了几个时隙,导致判决结果滞后真实信道状态。这两个问题本质上是互补的:毛刺是误判太多,惯性是反应太慢。
4.2 双门限判决:解决毛刺但加剧滞后
双门限判决引入两个门限 γ0 和 γ1,划分出三个区域:小于 γ0 判为 0,大于 γ1 判为 1,落在中间区域则保持上一时刻的判决结果。这样可以滤掉大部分毛刺——一个孤立的低值输出不会让判决从 1 翻转到 0。
但双门限有一个隐蔽的副作用:保持策略让输出序列产生滞后。如果信道状态刚从 0 变成 1,输出值还未完全爬升到 γ1 以上,判决结果会停留在 0,直到输出继续爬升越过 γ1。这个滞后在卫星场景下会被时延放大——你本来就在预测 t+2τ 时刻的状态,如果判决环节再滞后几个时隙,预测的前瞻性就被抵消了。
4.3 多门限优化:次级门限加趋势判断
论文在双门限基础上增加了两个次级门限 γ10 和 γ01,分别用于快速检测数据变化过程。算法流程如下:
| 步骤 | 操作 |
|---|---|
| 1 | 初始化 y_opt(0) = 0 |
| 2 | 输入 y(t),若 y(t) > γ1 则 y_opt(t)=1;若 y(t) < γ0 则 y_opt(t)=0,转步骤 8 |
| 3 | 若 y_opt(t-1)=1 转步骤 4;若 y_opt(t-1)=0 转步骤 6 |
| 4 | 若 y(t) > γ10 则 y_opt(t)=1,转步骤 8;反之转步骤 5 |
| 5 | 若 y(t) > y(t-1) 则 y_opt(t)=1;反之 y_opt(t)=0,转步骤 8 |
| 6 | 若 y(t) < γ01 则 y_opt(t)=0,转步骤 8;反之转步骤 7 |
| 7 | 若 y(t) < y(t-1) 则 y_opt(t)=0;反之 y_opt(t)=1,转步骤 8 |
| 8 | 若 t < t_max 则 t=t+1 转步骤 2;否则输出 y_opt |
关键逻辑在步骤 4-7:当判决状态为 1 但输出回落到中间区间时,先看输出是否高于次级门限 γ10,如果已经跌破就进一步比较当前输出与上一时刻输出——上升则维持 1,下降则翻转为 0。同理,判决状态为 0 时用 γ01 和趋势判断来快速捕捉信道状态由 0 变 1 的拐点。这个设计的核心动机是:在卫星认知通信场景中,及时发现 PU 的存在比过滤毛刺更重要,漏检的代价远高于误警。
论文通过后期实验多次矫正,最终门限参数设置为:
- γ0 = 0.2
- γ1 = 0.8
- γ01 = 0.3
- γ10 = 0.7
注意算法输入顺序是 γ0, γ1, γ10, γ01,参数对应 0.2, 0.8, 0.7, 0.3。这个不对称配置是有讲究的:γ10 设为 0.7,意味着已判 1 状态时只要输出跌破 0.7 就进入趋势判断,避免信道状态已经转为 0 却还占着判决结果不放;γ01 设为 0.3,意味着已判 0 状态时输出只要超过 0.3 就触发趋势判断,保证能快速响应 PU 的出现。多门限处理毛刺的能力其实有限,论文自己承认这点,但 LSTM 网络的输出区分度本身就比较好,两者形成性能互补。
下面给出多门限判决的 Python 参考实现:
def multi_threshold_decision(y_seq, gamma0=0.2, gamma1=0.8, gamma10=0.7, gamma01=0.3): """ 多门限优化判决 y_seq: LSTM 网络输出序列 返回: 判决后的 0/1 序列 """ y_opt = np.zeros(len(y_seq), dtype=int) y_prev = y_seq[0] for t in range(len(y_seq)): y = y_seq[t] if y > gamma1: y_opt[t] = 1 elif y < gamma0: y_opt[t] = 0 else: if t > 0 and y_opt[t-1] == 1: # 已判 1,用 γ10 和趋势判断是否翻转 if y > gamma10: y_opt[t] = 1 else: y_opt[t] = 1 if y > y_prev else 0 elif t > 0 and y_opt[t-1] == 0: # 已判 0,用 γ01 和趋势判断是否翻转 if y < gamma01: y_opt[t] = 0 else: y_opt[t] = 0 if y < y_prev else 1 else: y_opt[t] = 0 if y < gamma1 else 1 y_prev = y return y_opt代码逻辑说明:外层两档硬门限 γ0、γ1 先做粗分类,中间区间进入次级门限判断分支。y_prev 保存上一时刻的原始输出值,用于趋势比较。这里有个容易写错的细节:步骤 5 和步骤 7 的「y(t) > y(t-1)」比较的是网络原始输出序列,不是判决结果,用判决后的 0/1 序列做趋势判断会完全失效。实现时务必保留一条原始输出序列的引用。
5. 复现中的常见坑与排查:SNR、迭代次数与网络选型
5.1 三个对比维度的实验结果
论文从三个维度做了对比实验,结果都指向同一个结论:LSTM 系列算法在卫星信道下的性能稳定性优于 BP 和 NAR。
通信强度 ρ 从 0.1 到 0.9 的实验中,LSTM 网络的预测准确率曲线平稳,BP 网络准确率偏低且误警概率波动大,NAR 网络预测曲线波动最明显。漏检概率随 ρ 增加整体上升,因为信道空闲状态减少后,只要判决出一次错误,漏检概率就会被放大。但在 ρ 较高时,本文算法的漏检概率依然能维持在相对稳定的水平。
迭代次数方面,5 到 100 次迭代的对比显示 LSTM 网络收敛最快。迭代 25 次时,本文算法和 SGDM-LSTM 的准确率已经趋于平稳,而 ADAM-LSTM 到 85 次才收敛。这个差距意味着在算力受限或需要快速部署的场景下,SGDM 配合多门限的优势非常明显。
接收信噪比从 -20 dB 到 0 dB 的实验中,所有网络性能都随 SNR 下降而下滑,但 LSTM 网络的准确率保持在 0.70 到 0.75 之间,本文算法稳定在 0.80 左右。对比的四种神经网络选型如下:
| 网络类型 | 模型结构 | 训练时长 |
|---|---|---|
| BP | 4-20-15-1 | 约 8.5 s |
| NAR | 128-64-1,时延 10:1 | 约 17.4 s |
| ADAM-LSTM | 128-128-1 | 约 43 s |
| SGDM-LSTM | 128-128-1 | 约 40 s |
| 本文算法 | 128-128-1 | 约 41 s |
LSTM 系列训练时长是 BP 和 NAR 的两倍多,但换来的是低 SNR 下 5~10 个百分点的准确率提升,以及稳定得多的漏检概率曲线。在卫星通信场景里,这个交换是值得的。
5.2 高概率翻车的复现问题排查
复现这份算法最容易踩坑的地方,藏在数据预处理和门限参数里。下面这几条是我对照论文逐步复现时遇到过的实际问题。
问题一:训练不收敛,准确率长期停在 50% 左右
现象:LSTM 训练了上百个 epoch,准确率始终在 0.5 附近波动,和论文结果完全对不上。
原因:SU 感知统计量没有做归一化。能量检测统计量的绝对值受信号功率和噪声功率影响很大,不同 SNR 场景下量纲差异明显,直接送进 LSTM 会让损失函数震荡。论文的图 8 明确标注了「经归一化处理的 SU 感知数据统计量」,这一步不是可选项。
解决:训练前对感知统计量做 min-max 归一化到 0~1 区间。注意要按整段序列的全局最小最大值归一化,不要按 batch 单独归一化,否则会破坏时序数据的一致性。
问题二:预测结果整体滞后一拍,准确率看似很高但对不上信道状态
现象:模型输出曲线形状和真实信道状态很像,错位的视觉上不明显,但对比 0/1 标签时准确率只有 60% 出头。
原因:感知间隔和预测目标没对齐。论文设置的感知间隔为 500ms,对应单跳时延 250ms 的双跳往返。训练标签应该是 t+2τ 时刻的信道状态,而不是当前时刻的状态。很多人复现时直接把当前时刻标签送进去训练,模型学到的是一条偏移的映射。
解决:构造训练数据时,把信道状态标签 y 整体前移 2 个时隙(对应 500ms 时延),让 LSTM 学习的是「根据过去感知数据预测未来的状态」。
问题三:门限参数照抄论文但还是误判严重
现象:γ0=0.2、γ1=0.8、γ10=0.7、γ01=0.3 全部照抄,但复现场景下判决结果毛刺比论文严重得多。
原因:门限参数是依赖数据分布的。论文的 0.2/0.8/0.3/0.7 是在特定 SNR、特定通信强度下「后期实验多次矫正」出来的经验值。不同信噪比下 LSTM 输出序列的均值和方差都会变化,硬套参数等于假设输出分布不变。
解决:先用论文式 (20) 计算初始门限 γm = (meanON + meanOFF) / 2,再围绕 γm 向两边推开 γ0 和 γ1,最后跑一遍验证集看漏检和误警的取舍,再微调次级门限。次级门限要遵循不对称原则:γ10 偏高(更快释放 1 状态),γ01 偏低(更快捕获 1 状态)。
问题四:ADAM 和 SGDM 的收敛差异被误解为 LSTM 效果差
现象:换成 ADAM 优化器后,同样迭代 25 次准确率明显低于论文,于是怀疑 LSTM 网络有问题。
原因:ADAM 在低迭代次数下的有效步长偏小,85 次迭代才能收敛。论文的性能对比是在 85 次迭代下做的,如果你只给 25 次,ADAM-LSTM 自然吃亏。
解决:要对比就同时给足迭代次数。论文实验表明 SGDM 更适合低迭代次数场景,ADAM 在高迭代次数下也能达到相近效果,但训练时间更长。工程上如果算力紧张,直接用 SGDM。
问题五:训练集测试集切分时乱打乱,导致验证结果虚高
现象:9:1 切分后测试准确率高达 0.92,远高于论文的 0.8,但换一批数据就崩。
原因:切分前对全部数据做了随机打乱,相邻时隙的样本被分到了训练集和测试集两侧,测试集中混入了高相似的时序片段,造成数据泄漏。
解决:严格按时间顺序前 90% 做训练集、后 10% 做测试集,不打乱序列。LSTM 的泛化能力体现在对未见过的未来时刻的预测上,不是对随机采样的记忆。
6. 复现检验技巧与门限校准流程
拿到论文后建议先跑一条最小复现链路:生成 ρ=0.5、SNR=-10dB 的两小时仿真数据(14400 个感知统计量),按 500ms 感知间隔分块,batchsize=128,LSTM 结构 128-128-1,SGDM 学习率 0.01 动量 0.9,迭代 25 次。如果准确率能在 0.78 到 0.82 之间,说明链路通了。
门限校准这一步值得多说两句。我的习惯是先跑一版不接门限的 LSTM,收集测试集输出序列中真实信道状态为 0 和 1 两类的均值,分别记为 meanOFF 和 meanON,按式 (20) 得到初始门限 γm。然后设置 γ0 = γm - 0.15、γ1 = γm + 0.15,再按 γ10 = γ1 - 0.1、γ01 = γ0 + 0.1 初始化次级门限。这样得到的门限随数据分布自适应,比直接抄论文参数可靠得多。
验证指标计算时要注意,准确率 Yp 是判决序列与真实信道状态逐时隙比对的结果,而误警概率 Pfa 和漏检概率 Pml 要分开统计:
def evaluate_metrics(y_opt, y_true): """计算预测准确率、误警概率、漏检概率""" tp = np.sum((y_opt == 1) & (y_true == 1)) fp = np.sum((y_opt == 1) & (y_true == 0)) fn = np.sum((y_opt == 0) & (y_true == 1)) tn = np.sum((y_opt == 0) & (y_true == 0)) yp = (tp + tn) / len(y_true) pfa = fp / (fp + tn) if (fp + tn) > 0 else 0 pml = fn / (tp + fn) if (tp + fn) > 0 else 0 return yp, pfa, pml最后说一个我自己的血泪教训。第一次复现时,为了省事直接用 Adam 替换 SGDM,又把门限参数原封不动抄上去,结果低 SNR 场景下准确率比论文低了 6 个百分点。后来逐项排查才发现,门限参数需要按数据分布校准,优化器也要保持 SGDM 才能在低迭代次数下复现出论文的收敛速度。从那以后我每次复现这类频谱感知算法,都强制走一遍「先训练无门限 LSTM → 统计输出均值 → 初始门限 → 微调次级门限」的流程,再对比三项指标。这个流程虽然多花十几分钟,但能省下后面调试的一整天。希望帮到你。
本文还有配套的精品资源,点击获取