马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?立即注册
×
GM
- clc; clear; close all;
- %% 数据加载和预处理
- [file, path] = uigetfile('*.xlsx', 'Select the Excel file');
- filename = fullfile(path, file);
- time_series = xlsread(filename);
- % 确保数据是一列
- time_series = time_series(:);
- % 归一化数据
- min_val = min(time_series);
- max_val = max(time_series);
- normalized_data = (time_series - min_val) / (max_val - min_val);
- % 训练/测试集划分
- train_ratio = 0.8;
- n = length(normalized_data);
- M = floor(n * train_ratio);
- train_data = normalized_data(1:M);
- test_data = normalized_data(M+1:end);
- %% 构建 GM(1,1) 模型并预测
- % 1. 原始序列
- X0 = train_data(:); % 确保为列向量
- % 2. 累加生成序列(AGO)
- X1 = cumsum(X0);
- % 3. 构造数据矩阵并计算参数
- B = [-0.5 * (X1(1:end-1) + X1(2:end)), ones(M-1, 1)];
- Y = X0(2:end);
- U = (B \ Y); % 参数 a 和 b
- a = U(1); % 模型参数 a
- b = U(2); % 模型参数 b
- % 4. 预测公式
- X1_pred = zeros(M, 1);
- X1_pred(1) = X0(1); % 初值
- for k = 2:M
- X1_pred(k) = (X0(1) - b/a) * exp(-a * (k-1)) + b/a;
- end
- % 还原到原始序列
- X0_pred = [X1_pred(1); diff(X1_pred)];
- % 对测试集进行预测
- N = length(test_data);
- X_test_pred = zeros(N, 1);
- X_test_pred(1) = X0_pred(end); % 使用最后一个训练值初始化
- for k = 2:N
- X_test_pred(k) = (X_test_pred(1) - b/a) * exp(-a * (M + k - 2)) + b/a;
- end
- %% 反归一化数据
- T_train = train_data * (max_val - min_val) + min_val; % 真实训练集
- T_test = test_data * (max_val - min_val) + min_val; % 真实测试集
- T_train_pred = X0_pred * (max_val - min_val) + min_val; % 训练预测值
- T_test_pred = X_test_pred * (max_val - min_val) + min_val; % 测试预测值
- %% 性能评估
- % R² (决定系数)
- R1 = 1 - norm(T_train - T_train_pred)^2 / norm(T_train - mean(T_train))^2;
- R2 = 1 - norm(T_test - T_test_pred)^2 / norm(T_test - mean(T_test))^2;
- % MAE (平均绝对误差)
- mae1 = mean(abs(T_train - T_train_pred));
- mae2 = mean(abs(T_test - T_test_pred));
- % MAPE (平均相对误差)
- mape1 = mean(abs((T_train - T_train_pred) ./ T_train));
- mape2 = mean(abs((T_test - T_test_pred) ./ T_test));
- % MBE (平均偏差误差)
- mbe1 = mean(T_train - T_train_pred); % 训练集 MBE
- mbe2 = mean(T_test - T_test_pred); % 测试集 MBE
- % MSE (均方误差)
- mse1 = mean((T_train - T_train_pred).^2); % 训练集 MSE
- mse2 = mean((T_test - T_test_pred).^2); % 测试集 MSE
- % 显示性能指标
- disp(['训练集 R²: ', num2str(R1)]);
- disp(['测试集 R²: ', num2str(R2)]);
- disp(['训练集 MAE: ', num2str(mae1)]);
- disp(['测试集 MAE: ', num2str(mae2)]);
- disp(['训练集 MAPE: ', num2str(m
复制代码 免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!qidao123.com:ToB企服之家,中国第一个企服评测及软件市场,开放入驻,技术点评得现金 |