=====================================================
github:https://github.com/MichaelBeechan
CSDN:https://blog.csdn.net/u011344545
=====================================================
RAIM + LSTM
import numpy as np
import tensorflow as tf
from tensorflow.keras.layers import LSTM, Dense
# RAIM-LSTM 融合模型
class RAIM_LSTM(tf.keras.Model):
def __init__(self, input_dim, hidden_units):
super(RAIM_LSTM, self).__init__()
self.lstm = LSTM(hidden_units, return_sequences=False)
self.dense = Dense(1, activation='sigmoid') # 输出阈值缩放因子
def call(self, inputs):
# 输入形状: (batch_size, time_steps, input_dim)
h = self.lstm(inputs)
scale_factor = self.dense(h) # 动态缩放因子∈[0.5, 1.5]
return scale_factor
# RAIM-LSTM 完整流程
def raim_lstm_detection(z_sequence, H_sequence, model, T_base):
"""
:param z_sequence: 时序伪距观测 (k+1, n)
:param H_sequence: 时序几何矩阵 (k+1, n, 4)
:param model: 预训练RAIM-LSTM模型
:param T_base: 基础卡方阈值
:return: 故障告警标志, 动态阈值
"""
# 计算奇偶矢量序列
p_sequence = []
for t in range(len(z_sequence)):
H = H_sequence[t]
P = np.linalg.pinv(H.T @ H) @ H.T # 奇偶空间矩阵
p = P @ z_sequence[t]
p_sequence.append(p)
p_sequence = np.array(p_sequence)
# 提取特征:奇偶矢量范数 + 几何因子
features = np.concatenate([
np.linalg.norm(p_sequence, axis=1).reshape(-1,1),
np.sqrt(np.trace(H_sequence @ H_sequence.T, axis1=1, axis2=2))
], axis=1)
# LSTM预测动态阈值
scale = model.predict(features[np.newaxis, ...])
T_dynamic = T_base * (0.5 + scale[0][0]) # 缩放至[0.5*T_base, 1.5*T_base]
# 当前时刻检测
T_SSE = np.linalg.norm(p_sequence[-1])**2
alarm = T_SSE > T_dynamic
return alarm, T_dynamic
# 训练示例
model = RAIM_LSTM(input_dim=2, hidden_units=32)
model.compile(optimizer='adam', loss='mse')
# 假设已生成训练数据(特征序列+标签)
# model.fit(X_train, y_train, epochs=50)