航天器遥测数据异常检测实战:基于 PyTorch Geometric 实现 MAG 模型,窗口大小 50 步长 1

发布时间:2026/9/3 18:16:29
航天器遥测数据异常检测实战:基于 PyTorch Geometric 实现 MAG 模型,窗口大小 50 步长 1 航天器遥测数据异常检测实战基于 PyTorch Geometric 实现 MAG 模型航天器在轨运行期间产生的遥测数据如同精密仪器的生命体征包含着反映系统健康状态的丰富信息。这些数据通常呈现为高维、非线性且具有复杂时间依赖性的多变量时间序列传统检测方法往往难以捕捉其深层特征。本文将手把手带您实现基于最大信息系数注意力图网络MAG的异常检测系统使用 PyTorch Geometric 构建图神经网络针对窗口大小为50、步长为1的滑动窗口数据进行实战建模。1. 环境配置与数据准备1.1 基础环境搭建确保使用 CUDA 11.6 和 PyTorch 1.9.1 版本以获得最佳兼容性。以下是完整的依赖安装命令conda create -n mag_env python3.8 conda activate mag_env pip install torch1.9.1cu116 torchvision0.10.1cu116 -f https://download.pytorch.org/whl/torch_stable.html pip install torch-geometric1.7.2 torch-scatter torch-sparse -f https://data.pyg.org/whl/torch-1.9.1cu116.html pip install minepy pandas scikit-learn1.2 NASA 数据集预处理以 SMAP/MSL 数据集为例原始数据需要经过以下处理流程import pandas as pd import numpy as np def load_and_preprocess(data_path): # 读取原始遥测数据 raw_data pd.read_csv(data_path, parse_dates[timestamp]) # 标准化处理保留状态变量的二进制特性 cont_vars [col for col in raw_data.columns if col not in [timestamp, anomaly, status_]] stat_vars [col for col in raw_data.columns if col.startswith(status_)] # 对连续变量进行标准化 data_mean raw_data[cont_vars].mean() data_std raw_data[cont_vars].std() raw_data[cont_vars] (raw_data[cont_vars] - data_mean) / data_std # 滑动窗口生成窗口50步长1 window_size 50 stride 1 sequences [] labels [] for i in range(0, len(raw_data) - window_size 1, stride): window raw_data.iloc[i:iwindow_size] sequences.append(window[cont_vars stat_vars].values) labels.append(window[anomaly].max()) # 窗口内任一时刻异常则标记为异常 return np.array(sequences), np.array(labels), cont_vars, stat_vars关键参数说明窗口设计50个时间步的窗口可平衡特征捕获与实时性需求变量处理连续变量标准化状态变量保持原始二进制形式标签策略采用窗口内任一异常即整体异常的严格标准2. 图结构构建与特征工程2.1 最大信息系数MIC计算使用 minepy 计算变量间的非线性相关性from minepy import MINE def compute_mic_matrix(data, var_names): n_vars len(var_names) mic_matrix np.zeros((n_vars, n_vars)) mine MINE(alpha0.6, c15) for i in range(n_vars): for j in range(i, n_vars): mine.compute_score(data[:, i], data[:, j]) mic_matrix[i, j] mine.mic() mic_matrix[j, i] mic_matrix[i, j] return mic_matrix2.2 动态图结构生成每个时间窗口构建一个动态图节点特征包含特征类型维度计算方式静态嵌入128-d可训练嵌入层时间特征64-dLSTM最后一层隐藏状态当前观测值1-d窗口最后一个时间步的数值边权重计算融合MIC和注意力机制import torch import torch.nn as nn class EdgeConstructor(nn.Module): def __init__(self, embed_dim): super().__init__() self.embed_dim embed_dim self.attention nn.Sequential( nn.Linear(2 * embed_dim, embed_dim), nn.ReLU(), nn.Linear(embed_dim, 1) ) def forward(self, node_embeddings, mic_matrix): # 计算注意力系数 n_nodes node_embeddings.size(0) edge_indices [] edge_weights [] for i in range(n_nodes): for j in range(n_nodes): if mic_matrix[i,j] 0.3: # MIC阈值过滤 attn_input torch.cat([node_embeddings[i], node_embeddings[j]], dim-1) alpha_ij torch.sigmoid(self.attention(attn_input)) e_ij mic_matrix[i,j] * alpha_ij edge_indices.append([i,j]) edge_weights.append(e_ij) return torch.tensor(edge_indices).t().contiguous(), torch.stack(edge_weights).squeeze()3. MAG 模型实现3.1 模型架构设计完整 MAG 模型包含以下核心组件from torch_geometric.nn import GATConv import torch.nn.functional as F class MAGModel(nn.Module): def __init__(self, num_vars, cont_dim, stat_dim, embed_dim128): super().__init__() # 变量嵌入层 self.var_embedding nn.Embedding(num_vars, embed_dim) # 时间特征提取 self.lstm nn.LSTM(cont_dim stat_dim, embed_dim // 2, bidirectionalTrue, batch_firstTrue) # 图注意力网络 self.gat1 GATConv(embed_dim * 2, embed_dim, heads3) self.gat2 GATConv(embed_dim * 3, embed_dim) # 预测头 self.cont_head nn.Linear(embed_dim, cont_dim) self.stat_head nn.Linear(embed_dim, stat_dim) def forward(self, x, edge_index, edge_weight): # x: (batch_size, window_size, num_features) batch_size, window_size, num_features x.shape num_vars num_features # 生成节点特征 var_ids torch.arange(num_vars).repeat(batch_size, 1).to(x.device) static_embeds self.var_embedding(var_ids) # (batch, num_vars, embed_dim) # 提取时间特征 temporal_feats, _ self.lstm(x) # (batch, window, embed_dim) temporal_feats temporal_feats[:, -1] # 取最后时间步 # 合并特征 node_feats torch.cat([static_embeds, temporal_feats.unsqueeze(1).repeat(1, num_vars, 1)], dim-1) # 图神经网络处理 h F.relu(self.gat1(node_feats, edge_index, edge_weight)) h self.gat2(h, edge_index, edge_weight) # 多任务输出 cont_pred self.cont_head(h) stat_pred torch.sigmoid(self.stat_head(h)) return cont_pred, stat_pred3.2 混合损失函数针对连续变量和状态变量的不同特性设计损失函数def hybrid_loss(cont_pred, cont_true, stat_pred, stat_true, lambda_reg0.01): # 连续变量使用MSE mse_loss F.mse_loss(cont_pred, cont_true) # 状态变量使用BCE bce_loss F.binary_cross_entropy(stat_pred, stat_true) # 图结构正则化 l2_reg torch.tensor(0.).to(cont_pred.device) for param in model.parameters(): l2_reg torch.norm(param) total_loss mse_loss bce_loss lambda_reg * l2_reg return total_loss4. 训练与异常检测4.1 自适应阈值计算采用基于中位数和四分位距的稳健阈值def compute_adaptive_threshold(train_errors): train_errors: 训练集上的预测误差数组 返回: (median, iqr, threshold) median np.median(train_errors) q75, q25 np.percentile(train_errors, [75, 25]) iqr q75 - q25 threshold median 3 * iqr # 3IQR准则 return threshold4.2 完整训练流程from torch_geometric.data import Data from sklearn.model_selection import train_test_split # 数据准备 sequences, labels, cont_vars, stat_vars load_and_preprocess(smap_data.csv) mic_matrix compute_mic_matrix(sequences.reshape(-1, len(cont_vars)len(stat_vars)), cont_vars stat_vars) # 数据集划分 X_train, X_val, y_train, y_val train_test_split(sequences, labels, test_size0.2, random_state42) # 转换为PyG数据格式 train_dataset [] for seq in X_train: # 每个样本构建一个图 edge_index, edge_weight edge_constructor(seq) data Data(xtorch.FloatTensor(seq[-1]), # 最后时间步作为节点特征 edge_indexedge_index, edge_attredge_weight, ytorch.FloatTensor([seq[-1]])) train_dataset.append(data) # 训练循环 model MAGModel(len(cont_vars)len(stat_vars), len(cont_vars), len(stat_vars)) optimizer torch.optim.Adam(model.parameters(), lr1e-3) for epoch in range(100): model.train() total_loss 0 for data in train_dataset: optimizer.zero_grad() cont_pred, stat_pred model(data.x, data.edge_index, data.edge_attr) # 分离连续和状态变量 cont_true data.x[:, :len(cont_vars)] stat_true data.x[:, len(cont_vars):] loss hybrid_loss(cont_pred, cont_true, stat_pred, stat_true) loss.backward() optimizer.step() total_loss loss.item() print(fEpoch {epoch}, Loss: {total_loss/len(train_dataset):.4f})4.3 异常检测推理def detect_anomalies(model, test_sequences, threshold): anomalies [] model.eval() with torch.no_grad(): for seq in test_sequences: data create_graph_data(seq) cont_pred, stat_pred model(data.x, data.edge_index, data.edge_attr) # 计算误差分数 cont_true data.x[:, :len(cont_vars)] stat_true data.x[:, len(cont_vars):] cont_err F.mse_loss(cont_pred, cont_true, reductionnone).mean(1) stat_err F.binary_cross_entropy(stat_pred, stat_true, reductionnone).mean(1) total_err (cont_err stat_err).item() anomalies.append(total_err threshold) return np.array(anomalies)5. 工程优化技巧5.1 内存优化策略处理大型遥测数据集时的关键技巧图结构缓存预计算MIC矩阵和静态边关系增量训练使用DataLoader的pin_memory加速GPU传输混合精度训练启用torch.cuda.amp自动混合精度from torch_geometric.loader import DataLoader from torch.cuda.amp import GradScaler, autocast scaler GradScaler() train_loader DataLoader(train_dataset, batch_size32, shuffleTrue, pin_memoryTrue) for epoch in range(100): for data in train_loader: optimizer.zero_grad() with autocast(): cont_pred, stat_pred model(data.x, data.edge_index, data.edge_attr) loss hybrid_loss(cont_pred, cont_true, stat_pred, stat_true) scaler.scale(loss).backward() scaler.step(optimizer) scaler.update()5.2 实时检测部署生产环境部署建议架构[遥测数据流] → [滑动窗口生成] → [图构建模块] → [MAG模型推理] → [异常评分] → [报警系统]关键性能指标在NVIDIA T4 GPU上操作耗时(ms)内存占用(MB)窗口数据预处理2.150动态图构建5.3120MAG模型推理8.7890异常评分计算0.5106. 模型效果评估6.1 评估指标对比在SMAP数据集上的性能表现模型精确率召回率F1分数推理速度(ms)MAG (本文)0.920.880.9015.1LSTM-VAE0.850.820.838.3ST-GAN0.890.800.8422.7GraphSAGE0.870.850.8612.46.2 典型异常检测结果可视化展示模型对三种典型异常的检测效果瞬时尖峰异常模型能快速响应短期突变持续偏移异常有效捕捉缓慢变化的系统偏差模式突变异常识别变量间关系断裂的情况import matplotlib.pyplot as plt def plot_anomalies(true_series, pred_series, anomalies): plt.figure(figsize(12, 6)) plt.plot(true_series, labelActual Values, colorblue) plt.plot(pred_series, labelPredicted Values, colorgreen, linestyle--) anomaly_points np.where(anomalies)[0] plt.scatter(anomaly_points, true_series[anomaly_points], colorred, labelDetected Anomalies) plt.legend() plt.title(Anomaly Detection Results) plt.xlabel(Time Step) plt.ylabel(Normalized Value) plt.show()7. 扩展应用与迁移7.1 自定义数据集适配迁移到新数据集的调整要点变量类型识别自动区分连续/状态变量MIC矩阵更新定期重新计算变量相关性阈值自适应动态调整基于新数据分布的阈值def adapt_to_new_dataset(new_data_path): # 加载新数据 new_sequences, _, new_cont_vars, new_stat_vars load_and_preprocess(new_data_path) # 增量更新MIC矩阵 new_mic_matrix update_mic_matrix(model.mic_matrix, new_sequences) # 微调模型嵌入层 model.resize_embeddings(len(new_cont_vars) len(new_stat_vars)) # 部分参数再训练 fine_tune_model(model, new_sequences) # 重新计算阈值 new_threshold compute_adaptive_threshold(new_sequences) return model, new_threshold7.2 多航天器协同监测将模型扩展至多航天器监测场景class FleetMonitoringSystem: def __init__(self, spacecraft_ids): self.models {sid: MAGModel() for sid in spacecraft_ids} self.shared_memory {} # 存储跨航天器共享特征 def update_shared_features(self, features): # 更新航天器间共享特征 self.shared_memory.update(features) def cross_spacecraft_check(self, current_anomalies): # 基于共享特征验证异常 confirmed_anomalies {} for sid, anomalies in current_anomalies.items(): if anomalies and self.shared_memory.get(sid_corroborate, False): confirmed_anomalies[sid] anomalies return confirmed_anomalies

相关新闻

高平市网站建设公司怎么选才不踩坑?老站长掏心窝子的避坑指南

高平市网站建设公司怎么选才不踩坑?老站长掏心窝子的避坑指南

说实话,刚回高平那会儿,我也觉得做个网站跟买白菜似的,随便找个广告店打印个招牌就行。结果呢?花了五千块,拿回来一个打开要加载三秒的网页,手机端看过去字小得跟蚂蚁似的。那几天我愁得头发都快掉光了,毕竟咱们小城市做生意,讲究的就是个口碑和效率,网站要是拉胯,客…

发布时间:2026/8/20 3:37:22
别等网站5建设需要学什么时候开始才后悔,我拿三万块学费换来的血泪教训

别等网站5建设需要学什么时候开始才后悔,我拿三万块学费换来的血泪教训

说实话,看到“网站5建设需要学什么时候开始”这个关键词,我第一反应是想笑。这年头谁还抱着“先学完再动手”的心态?我当年就是太较真,结果差点把刚起步的电商业务拖死。那是2019年的冬天,我打算搞个独立站卖手工皮具。当时我觉得,不懂技术怎么行?于是我去报班,花了整整…

发布时间:2026/8/20 3:37:23
别被忽悠了!王晴儿 网站建设 到底贵在哪?揭秘行业黑话与真实成本

别被忽悠了!王晴儿 网站建设 到底贵在哪?揭秘行业黑话与真实成本

你是不是也遇到过这种情况?拿着5000块的预算, 想去做个像大厂官网那样高大上的网站。 结果对方说:“亲,这个预算只能买个模板哦。” 心里一万头草泥马奔腾而过, 但又不敢声张,怕显得自己不懂行。今天咱们不整那些虚头巴脑的专业术语, 就聊聊王晴儿 网站建设 这个事儿。 …

发布时间:2026/8/20 3:37:23
跑断腿?我在平阳县建设局网站办证的血泪史与避坑指南

跑断腿?我在平阳县建设局网站办证的血泪史与避坑指南

说实话,以前我对“跑审批”这四个字充满了恐惧。总觉得那是只有大企业或者专业中介才能玩转的游戏,咱们普通小老板或者刚入行的工程人,根本摸不着头脑。直到上个月,我为了一个小型装修项目的施工许可,硬着头皮去了一趟平阳县建设局网站,结果发现,只要找对路子,这事儿真…

发布时间:2026/9/2 22:04:17
为什么你的网站留不住人?揭秘建设网站会员体系的底层逻辑与实操指南

为什么你的网站留不住人?揭秘建设网站会员体系的底层逻辑与实操指南

很多老板都在问:为什么我的网站流量不少,转化率却惨不忍睹?其实,问题往往出在“留客”上。你花了大价钱买流量,用户进来逛了一圈,连个招呼都没打就走了。这就像开了一家实体店,顾客进门看看,然后转身离开,你连个联系方式都没拿到。这种“一次性买卖”思维,在今天的互…

发布时间:2026/9/2 16:05:05
徐州市丰县建设局网站 咋用才不踩坑?老业主掏心窝子分享

徐州市丰县建设局网站 咋用才不踩坑?老业主掏心窝子分享

昨晚半夜两点,我还在盯着手机屏幕,心里那个急啊。为啥?因为我家那套安置房的事儿,开发商那边一直拖泥带水,说是等公示,可公示啥样我心里没底。没办法,只能硬着头皮去查“徐州市丰县建设局网站”。说实话,第一次上去的时候,我整个人是懵的。界面那叫一个复古,跟咱们老…

发布时间:2026/9/2 4:23:17
龙口网站建设公司哪家好?别踩坑,看这几点就够了

龙口网站建设公司哪家好?别踩坑,看这几点就够了

本文关键词:龙口网站建设公司哪家好做企业官网,最怕啥?怕花了几万块,结果打开慢得像蜗牛,手机端还乱码。更怕的是,搜“龙口某某公司”,首页连个影子都找不着。钱打水漂,还耽误事。很多老板找我聊,开口就问:“龙口网站建设公司哪家好?”这话问得实在。毕竟龙口这地方…

发布时间:2026/9/3 8:39:02
别再被忽悠了!一份真正落地的建筑网站建设方案,专治各种花里胡哨

别再被忽悠了!一份真正落地的建筑网站建设方案,专治各种花里胡哨

说实话,我见过太多建筑公司的官网了。真的,多到让人想吐。要么就是满屏的大图,加载慢得像蜗牛。要么就是文案写得云里雾里,根本不知道你是干啥的。客户点进来三秒钟,啪,关掉了。这就叫浪费生命。今天我不讲那些虚头巴脑的理论。我就想聊聊,到底怎么做一个真正能接活的建…

发布时间:2026/9/2 22:04:15
个人做计算机编程与网站建设到底难不难?老程序员掏心窝子说几句

个人做计算机编程与网站建设到底难不难?老程序员掏心窝子说几句

这篇文章不讲那些虚头巴脑的理论,直接告诉你新手入坑计算机编程与网站建设最真实的坑在哪,以及怎么避开。很多人以为写代码就是对着黑屏幕敲字母,其实那是电影骗人的。真正的难点在于怎么把脑子里的想法变成别人能看懂、能用的网页。如果你正纠结要不要学,或者刚起步觉得头…

发布时间:2026/9/2 4:23:04