% 加载数据集
load('vibration_dataset.mat');
if ~exist('dataset', 'var')
error('未找到 dataset 变量');
end
if ~isfield(dataset, 'displacement') || ~isfield(dataset, 'velocity') || ~isfield(dataset, 'frequency')
error('dataset 变量不包含 displacement、velocity 或 frequency 字段');
end
% 数据预处理阶段添加异常值处理
for i = 1:size(dataset.displacement, 2)
q1 = quantile(dataset.displacement(:,i), 0.25);
q3 = quantile(dataset.displacement(:,i), 0.75);
iqr = q3 - q1;
dataset.displacement(:,i) = max(min(dataset.displacement(:,i), q3 + 1.5*iqr), q1 - 1.5*iqr);
end
for i = 1:size(dataset.velocity, 2)
q1 = quantile(dataset.velocity(:,i), 0.25);
q3 = quantile(dataset.velocity(:,i), 0.75);
iqr = q3 - q1;
dataset.velocity(:,i) = max(min(dataset.velocity(:,i), q3 + 1.5*iqr), q1 - 1.5*iqr);
end
for i = 1:size(dataset.frequency, 2)
q1 = quantile(dataset.frequency(:,i), 0.25);
q3 = quantile(dataset.frequency(:,i), 0.75);
iqr = q3 - q1;
dataset.frequency(:,i) = max(min(dataset.frequency(:,i), q3 + 1.5*iqr), q1 - 1.5*iqr);
end
% 输出数据维度用于调试
disp(['displacement 矩阵的维度: ', num2str(size(dataset.displacement))]);
disp(['velocity 矩阵的维度: ', num2str(size(dataset.velocity))]);
disp(['frequency 矩阵的维度: ', num2str(size(dataset.frequency))]);
% 组合行数为向量并找出最小值
row_sizes = [size(dataset.displacement, 1), size(dataset.velocity, 1), size(dataset.frequency, 1)];
min_rows = min(row_sizes);
% 截取数据
dataset.displacement = dataset.displacement(1:min_rows, :);
dataset.velocity = dataset.velocity(1:min_rows, :);
dataset.frequency = dataset.frequency(1:min_rows, :);
% 数据预处理 - 提取特征与目标变量
% 位移/速度预测特征:包含位移、速度、频率
X_disp_vel = [dataset.displacement, dataset.velocity, dataset.frequency];
y_displacement = dataset.displacement(:, 1);
y_velocity = dataset.velocity(:, 1);
% 频率预测特征:仅位移和速度
X_freq = [dataset.displacement, dataset.velocity];
y_freq = dataset.frequency(:, 1);
% 模型训练 - 位移/速度预测模型(Kriging)
kernel = 'ARDMatern52';
model_displacement = fitrgp(X_disp_vel, y_displacement, 'KernelFunction', kernel);
model_velocity = fitrgp(X_disp_vel, y_velocity, 'KernelFunction', kernel);
% 频率预测模型 - 多基模型训练
% Kriging模型
model_kriging = fitrgp(X_freq, y_freq);
% RBF神经网络
model_rbf = newrb(X_freq', y_freq', 0, 0.01, 1000);
% 随机森林(修正参数:使用'Bag'方法和正确参数名)
model_rf = fitrensemble(X_freq, y_freq, 'Method', 'Bag', 'NumLearningCycles', 200);
% 模型预测 - 位移/速度
predicted_displacement = predict(model_displacement, X_disp_vel);
% 检查预测位移值
disp('预测位移前10个值:'); disp(predicted_displacement(1:10));
predicted_velocity = predict(model_velocity, X_disp_vel);
% 检查预测速度值
disp('预测速度前10个值:'); disp(predicted_velocity(1:10));
predicted_orbit = predicted_displacement + predicted_velocity;
% 频率预测结果融合
weights = [0.3, 0.3, 0.4]; % 调整权重
y_pred_kriging_all = predict(model_kriging, X_freq);
y_pred_rbf_all = sim(model_rbf, X_freq');
y_pred_rbf_all = y_pred_rbf_all';
y_pred_rf_all = predict(model_rf, X_freq);
predicted_frequency = weights(1) * y_pred_kriging_all + weights(2) * y_pred_rbf_all + weights(3) * y_pred_rf_all;
% 优化参数设置(优化变量为位移和速度序列)
n_points = size(dataset.displacement, 1);
params0 = [dataset.displacement(:, 1); dataset.velocity(:, 1)]; % 初始值设为原始序列
lb = [repmat(min(dataset.displacement(:
MATLAB代码主要用于处理振动数据集,构建预测模型,对数据进行优化,并对结果进行评估和可视化展示
于 2025-04-11 20:15:10 首次发布