给以下代码增加异常数据回溯参数异常的类型:%% 风电机组智能监测系统 - 全功能代码
% 功能:LSTM预测、异常检测、多指标评估、可视化分析
% 包含:RMSE/MAE/MAPE指标、4种分析图表
%% 1. 初始化环境 ====================================================
% 1.1 清理工作区
clear; clc; close all;
% 1.2 固定随机种子
rng(0);
% 1.3 禁用警告
warning off;
%% 2. 数据准备阶段 =================================================
% 2.1 数据读取
raw_data = readmatrix("train_scada.xlsx");
% 2.2 数据参数设置
total_samples = size(raw_data, 1); % 2.2.1 总样本数
train_ratio = 0.8; % 2.2.2 训练集比例
train_num = round(total_samples * train_ratio); % 2.2.3 训练样本数
% 2.3 数据划分
shuffled_idx = randperm(total_samples); % 2.3.1 随机索引
% 2.4 训练集处理
train_input = raw_data(shuffled_idx(1:train_num), 1:8)'; % 2.4.1 输入特征
train_target = raw_data(shuffled_idx(1:train_num), 9)'; % 2.4.2 目标值
% 2.5 测试集处理
test_input = raw_data(shuffled_idx(train_num+1:end), 1:8)'; % 2.5.1 输入特征
test_target = raw_data(shuffled_idx(train_num+1:end), 9)'; % 2.5.2 目标值
% 2.6 样本数量记录
train_samples = size(train_input, 2); % 2.6.1 训练样本数
test_samples = size(test_input, 2); % 2.6.2 测试样本数
%% 3. 数据预处理 ===================================================
% 3.1 输入特征归一化
[train_input_norm, input_norm] = mapminmax(train_input, 0, 1); % 3.1.1
test_input_norm = mapminmax('apply', test_input, input_norm); % 3.1.2
% 3.2 目标值归一化
[train_target_norm, target_norm] = mapminmax(train_target, 0, 1); % 3.2.1
test_target_norm = mapminmax('apply', test_target, target_norm); % 3.2.2
%% 4. 数据格式转换 =================================================
% 4.1 训练集转换
train_cells = arrayfun(@(i) double(train_input_norm(:,i)),... % 4.1.1
1:train_samples, 'UniformOutput', false)';
% 4.2 测试集转换
test_cells = arrayfun(@(i) double(test_input_norm(:,i)),... % 4.2.1
1:test_samples, 'UniformOutput', false)';
% 4.3 目标值转置
train_target_norm = train_target_norm'; % 4.3.1
test_target_norm = test_target_norm'; % 4.3.2
%% 5. LSTM模型构建 =================================================
% 5.1 网络结构定义
layers = [
sequenceInputLayer(8) % 5.1.1 输入层
lstmLayer(128, 'OutputMode', 'last') % 5.1.2 LSTM层
reluLayer % 5.1.3 激活层
fullyConnectedLayer(1) % 5.1.4 全连接层
regressionLayer % 5.1.5 回归层
];
% 5.2 训练参数配置
options = trainingOptions('adam',... % 5.2.1 优化器
'MiniBatchSize', 500,... % 5.2.2 批量大小
'MaxEpochs', 1000,... % 5.2.3 最大迭代次数
'InitialLearnRate', 1e-2,... % 5.2.4 初始学习率
'LearnRateSchedule', 'piecewise',... % 5.2.5 学习率策略
'LearnRateDropFactor', 0.1,... % 5.2.6 衰减系数
'LearnRateDropPeriod', 800,... % 5.2.7 衰减周期
'Shuffle', 'every-epoch',... % 5.2.8 数据打乱
'Plots', 'training-progress',... % 5.2.9 训练进度图
'Verbose', false); % 5.2.10 关闭输出
% 5.3 模型训练
net = trainNetwork(train_cells, train_target_norm, layers, options);
%% 6. 预测与评估 ====================================================
% 6.1 执行预测
train_pred_norm = predict(net, train_cells); % 6.1.1
test_pred_norm = predict(net, test_cells); % 6.1.2
% 6.2 反归一化处理
train_pred = mapminmax('reverse', train_pred_norm, target_norm); % 6.2.1
test_pred = mapminmax('reverse', test_pred_norm, target_norm); % 6.2.2
% 6.3 计算RMSE
train_rmse = sqrt(mean((train_pred - train_target').^2)); % 6.3.1
test_rmse = sqrt(mean((test_pred - test_target').^2)); % 6.3.2
% 6.4 计算MAE
train_mae = mean(abs(train_pred - train_target')); % 6.4.1
test_mae = mean(abs(test_pred - test_target')); % 6.4.2
% 6.5 计算MAPE(安全处理零值)
train_nonzero = find(train_target ~= 0); % 6.5.1 非零索引
train_mape = mean(abs( (train_pred(train_nonzero) - train_target(train_nonzero)) ...
./ train_target(train_nonzero) )) * 100; % 6.5.2
test_nonzero = find(test_target ~= 0); % 6.5.3 非零索引
test_mape = mean(abs( (test_pred(test_nonzero) - test_target(test_nonzero)) ...
./ test_target(test_nonzero) )) * 100; % 6.5.4
%% 7. 异常检测模块 =================================================
% 7.1 残差计算
train_residual = train_pred - train_target'; % 7.1.1
test_residual = test_pred - test_target'; % 7.1.2
% 7.2 动态阈值计算(3σ原则)
threshold = mean(abs(train_residual)) + 3*std(abs(train_residual)); % 7.2.1
% 7.3 异常样本识别
abnormal_idx = find(abs(test_residual) > threshold); % 7.3.1
abnormal_count = length(abnormal_idx); % 7.3.2
normal_count = test_samples - abnormal_count; % 7.3.3
%% 8. 可视化系统 ====================================================
% 8.1 创建画布
figure('Position', [100 100 1400 1000], 'Color', 'w');
% 8.2 训练集预测对比
subplot(2,2,1)
plot(train_target, 'b-', 'LineWidth', 1.2)
hold on
plot(train_pred, 'r--', 'LineWidth', 1)
title(sprintf('训练集预测对比\nRMSE=%.4f MAE=%.4f MAPE=%.2f%%',...
train_rmse, train_mae, train_mape))
xlabel('样本序列'), ylabel('目标值')
legend({'真实值','预测值'}, 'Location', 'northeast')
grid on
% 8.3 测试集异常检测
subplot(2,2,2)
plot(test_target, 'b-', 'LineWidth', 1)
hold on
plot(test_pred, 'm:', 'LineWidth', 1.5)
scatter(abnormal_idx, test_target(abnormal_idx), 80,...
'k', 'filled', 'MarkerEdgeColor', 'w')
plot(xlim, [mean(test_target)+threshold, mean(test_target)+threshold],...
'k--', 'LineWidth', 1.5)
plot(xlim, [mean(test_target)-threshold, mean(test_target)-threshold],...
'k--', 'LineWidth', 1.5)
title(sprintf('测试集异常检测\nRMSE=%.4f MAE=%.4f MAPE=%.2f%%',...
test_rmse, test_mae, test_mape))
xlabel('样本序列'), ylabel('目标值')
legend({'真实值','预测值','阈值'}, 'Location', 'best')
grid on
% 8.4 残差分布直方图
subplot(2,2,3)
histogram(abs(test_residual), 50, 'FaceColor', [0.2 0.6 0.9])
xline(threshold, 'r--', 'LineWidth', 2, 'DisplayName', '检测阈值')
xline(test_mae, 'g:', 'LineWidth', 2, 'DisplayName', 'MAE值')
title('预测残差分布分析')
xlabel('残差绝对值'), ylabel('频数')
legend('残差分布', '检测阈值', 'MAE值')
grid on
% 8.5 样本状态分布
subplot(2,2,4)
bar_data = [normal_count, abnormal_count];
bar_plot = bar(categorical({'正常样本','异常样本'}), bar_data, 'FaceColor','flat');
bar_plot.CData(1,:) = [0.3 0.7 0.3]; % 正常样本颜色
bar_plot.CData(2,:) = [0.8 0.2 0.2]; % 异常样本颜色
text(1:2, bar_data, compose('%d\n(%.1f%%)',...
[bar_data; 100*bar_data/test_samples]),...
'HorizontalAlignment','center',...
'VerticalAlignment','bottom',...
'FontWeight','bold')
title('样本状态分布')
ylabel('样本数量')
grid on
% 8.6 总标题
sgtitle('风电机组智能监测分析系统',...
'FontSize',16, 'FontWeight','bold', 'Color','#003366')
%% 9. 结果输出 =====================================================
% 9.1 控制台报告
fprintf('======== 模型性能 ========\n')
fprintf('训练集 RMSE: %.4f MAE: %.4f MAPE: %.2f%%\n',...
train_rmse, train_mae, train_mape)
fprintf('测试集 RMSE: %.4f MAE: %.4f MAPE: %.2f%%\n',...
test_rmse, test_mae, test_mape)
fprintf('\n======== 异常检测 ========\n')
fprintf('动态阈值: %.4f\n', threshold)
fprintf('异常样本: %d (%.2f%%)\n', abnormal_count, 100*abnormal_count/test_samples)
% 9.2 文件保存
abnormal_records = table(abnormal_idx',...
test_target(abnormal_idx)',...
test_pred(abnormal_idx)',...
'VariableNames', {'位置','真实值','预测值'});
writetable(abnormal_records, '异常样本明细.csv')
saveas(gcf, '综合监测分析图.png')
%% 10. 网络分析 ===================================================
analyzeNetwork(net)