用matlab实现将所有样本的输入数据归一化至闭区间[-1,1],训练样本的输出数据归一化至闭区间[0,1]。基于KELM 的降噪器设计即为根据历史时刻及当前时刻的含噪声信号估计当前时刻信号的回归问题,设计的KELM 器输入取当前时刻噪声信号及前7个时刻的历史信号即时间序列yk-7、yk-6……,yk ,输出即为当前时刻信号估计值~yk。定义如下的均方根误差(RMSE)用以衡量ELM算法的回归性能。并作出对比图。再反归一化即可得到KELM降噪信号。之后对KELM降噪信号进行离散小波变换,选择合适的小波阈值进行滤波,再经过离散小波逆变换即可得到混合降噪信号,综合考虑降噪效果与信号失真程度,传感器信号的降噪效果可由降噪信号与实际信号之间的RMSE来衡量。的代码
时间: 2024-03-11 08:50:39 浏览: 118
以下是MATLAB代码实现将所有样本的输入数据归一化至闭区间[-1,1],训练样本的输出数据归一化至闭区间[0,1],并基于KELM的降噪器设计。同时,计算均方根误差(RMSE)用于衡量ELM算法的回归性能。
```matlab
%% 数据归一化
data = load('data.mat'); % 加载数据
data_input = data.input; % 输入数据
data_output = data.output; % 输出数据
max_input = max(data_input,[],2); % 每列最大值
min_input = min(data_input,[],2); % 每列最小值
max_output = max(data_output,[],2); % 每列最大值
min_output = min(data_output,[],2); % 每列最小值
data_input = 2 .* (data_input - min_input) ./ (max_input - min_input) - 1; % 归一化到[-1,1]
data_output = (data_output - min_output) ./ (max_output - min_output); % 归一化到[0,1]
%% KELM降噪器设计
k = 7; % 历史时刻的数量
n = size(data_input,2); % 输入维度
m = size(data_output,2); % 输出维度
train_ratio = 0.7; % 训练集比例
train_size = floor(train_ratio * size(data_input,1)); % 训练集大小
train_input = data_input(1:train_size,:); % 训练集输入数据
train_output = data_output(1:train_size,:); % 训练集输出数据
test_input = data_input(train_size+1:end,:); % 测试集输入数据
test_output = data_output(train_size+1:end,:); % 测试集输出数据
% 构建KELM模型
W = rand(n, k); % 随机生成输入层到隐层的权重矩阵
B = rand(k, 1); % 随机生成隐层的偏置向量
H = tanh(W * train_input' + repmat(B, 1, size(train_input,1))); % 隐层输出
C = pinv(H' * H) * H' * train_output; % 计算输出层权重
train_predict = H' * C; % 训练集预测输出
% 计算均方根误差(RMSE)
train_rmse = sqrt(mean((train_predict - train_output).^2)); % 训练集RMSE
test_predict = tanh(W * test_input' + repmat(B, 1, size(test_input,1)))' * C; % 测试集预测输出
test_rmse = sqrt(mean((test_predict - test_output).^2)); % 测试集RMSE
%% 反归一化
train_predict = train_predict .* (max_output - min_output) + min_output; % 反归一化
train_output = train_output .* (max_output - min_output) + min_output; % 反归一化
test_predict = test_predict .* (max_output - min_output) + min_output; % 反归一化
test_output = test_output .* (max_output - min_output) + min_output; % 反归一化
%% 离散小波变换
train_wav = wden(train_predict - train_output, 'sqtwolog', 'h', 'mln', 5, 'sym8'); % 离散小波变换
test_wav = wden(test_predict - test_output, 'sqtwolog', 'h', 'mln', 5, 'sym8'); % 离散小波变换
%% 离散小波逆变换
train_denoise = train_predict - train_wav; % 降噪信号
test_denoise = test_predict - test_wav; % 降噪信号
train_mixed = train_wav + train_output; % 混合降噪信号
test_mixed = test_wav + test_output; % 混合降噪信号
%% 计算RMSE
train_rmse2 = sqrt(mean((train_denoise - train_output).^2)); % 训练集降噪效果RMSE
test_rmse2 = sqrt(mean((test_denoise - test_output).^2)); % 测试集降噪效果RMSE
train_rmse3 = sqrt(mean((train_mixed - train_output).^2)); % 训练集混合降噪效果RMSE
test_rmse3 = sqrt(mean((test_mixed - test_output).^2)); % 测试集混合降噪效果RMSE
%% 绘制结果
figure;
subplot(2,2,1);
plot(train_output);
hold on;
plot(train_predict);
title('训练集实际输出与预测输出');
legend('实际输出', '预测输出');
subplot(2,2,2);
plot(test_output);
hold on;
plot(test_predict);
title('测试集实际输出与预测输出');
legend('实际输出', '预测输出');
subplot(2,2,3);
plot(train_denoise);
hold on;
plot(train_output);
title('训练集降噪效果');
legend('降噪信号', '实际输出');
subplot(2,2,4);
plot(test_denoise);
hold on;
plot(test_output);
title('测试集降噪效果');
legend('降噪信号', '实际输出');
figure;
subplot(2,2,1);
plot(train_output);
hold on;
plot(train_mixed);
title('训练集混合降噪效果');
legend('混合降噪信号', '实际输出');
subplot(2,2,2);
plot(test_output);
hold on;
plot(test_mixed);
title('测试集混合降噪效果');
legend('混合降噪信号', '实际输出');
subplot(2,2,3);
bar([train_rmse, train_rmse2, train_rmse3]);
title('训练集RMSE');
set(gca, 'XTick', 1:3, 'XTickLabel', {'ELM', '降噪', '混合降噪'});
subplot(2,2,4);
bar([test_rmse, test_rmse2, test_rmse3]);
title('测试集RMSE');
set(gca, 'XTick', 1:3, 'XTickLabel', {'ELM', '降噪', '混合降噪'});
```
阅读全文