%% 0. 初始化环境
clear; % 清除工作区变量
clc; % 清空命令窗口
close all; % 关闭所有已打开的图形窗口
%% 1. 输入数据(确保数据是一一对应的列向量)
% InSAR数据 (50个数据点)
insar_data = [
0, 4.032, -1.512, 2.394, 0.882, 1.512, -2.772, 0.126, 1.89, -1.512, ...
-2.016, -3.276, -6.553, -6.553, -7.183, -8.317, -9.577, -9.829, -9.451, -9.073, ...
-9.829, -10.333, -8.947, 7.183, -5.671, -7.057, -7.309, -7.057, -6.553, -7.057, ...
-8.443, -6.175, -5.544, -6.805, -6.679, -5.797, -6.679, -8.065, -7.057, -9.577, ...
-10.333, -11.845, -16.129, -22.556, -3.402, -3.528, -15.121, -10.711, -2.646, -6.175
]'; % 使用 ' 转置为列向量
% 水准数据 (基准, 50个数据点)
level_data = [
0, -0.7936, -0.839, -1.3391, -1.9063, -2.1556, -1.8861, -3.1277, -4.4598, -4.5877, ...
-5.1288, -6.2155, -6.8116, -6.8608, -6.759, -6.6287, -6.7041, -7.1898, -7.8614, -8.2184, ...
-7.9948, -7.5098, -7.16, -7.0876, -7.3173, -7.4182, -7.5127, -7.6449, -7.8294, -8.0468, ...
-8.2534, -8.4, -8.4796, -8.5277, -8.5817, -8.6646, -8.7423, -8.7852, -8.8098, -8.836, ...
-8.868, -8.9049, -8.9446, -9.0116, -9.0566, -9.0997, -9.1586, -9.2271, -9.2888, -9.3383
]'; % 使用 ' 转置为列向量
%% 2. 数据有效性验证
if length(insar_data) ~= length(level_data)
error('InSAR数据与水准数据长度不一致,请检查数据输入!');
end
num_points = length(insar_data); % 获取数据点数量
%% 3. 核心指标计算 (与您代码的核心逻辑完全一致)
% 计算误差 (观测值 - 真实值)
error = insar_data - level_data;
% 3.1 RMSE (均方根误差, mm): 衡量预测值与真实值之间的整体误差大小,对大误差更敏感。
rmse = sqrt(mean(error.^2));
% 3.2 MAE (平均绝对误差, mm): 所有单个观测值与算术平均值的偏差的绝对值的平均。
mae = mean(abs(error));
% 3.3 R² (决定系数): 表示因变量的变化中可以由自变量解释的比例。
% 采用皮尔逊相关系数的平方来计算,直观反映两者线性相关强度。
corr_matrix = corrcoef(insar_data, level_data);
pearson_r = corr_matrix(1, 2);
r2 = pearson_r^2;
% 3.4 MAPE (平均绝对百分比误差, %): 衡量预测准确性的统计指标。
% 注意:为避免除以零,计算时需排除水准值为0的数据点。
non_zero_idx = level_data ~= 0;
if ~any(non_zero_idx)
mape = NaN; % 如果所有基准值都为0,则MAPE无定义
else
mape = mean(abs(error(non_zero_idx) ./ level_data(non_zero_idx))) * 100;
end
%% 4. 数据可视化
% --- 图1: 时序对比图 ---
figure('Name', 'InSAR vs. 水准数据 时序对比', 'Position', [100, 100, 1000, 600]);
plot(1:num_points, level_data, 'b-o', 'LineWidth', 2, 'MarkerFaceColor', 'b', 'DisplayName', '水准数据 (基准)');
hold on;
plot(1:num_points, insar_data, 'r--s', 'LineWidth', 1.5, 'DisplayName', 'InSAR 数据');
grid on;
box on;
hold off;
xlabel('数据点序号', 'FontSize', 12);
ylabel('沉降量 (mm)', 'FontSize', 12);
title('InSAR 与 水准数据对比分析', 'FontSize', 14, 'FontWeight', 'bold');
legend('show', 'Location', 'best', 'FontSize', 11);
set(gca, 'FontSize', 11);
% --- 图2: 散点相关图 ---
figure('Name', 'InSAR vs. 水准数据 散点相关图', 'Position', [150, 150, 700, 600]);
scatter(level_data, insar_data, 50, 'filled', 'MarkerFaceColor', [0.3010 0.7450 0.9330], 'MarkerEdgeColor', 'k');
hold on;
% 绘制 y=x 完美拟合线
ax_limits = [min([xlim, ylim]), max([xlim, ylim])];
plot(ax_limits, ax_limits, 'r--', 'LineWidth', 2, 'DisplayName', '完美拟合线 (y=x)');
grid on;
box on;
hold off;
xlabel('水准数据 (mm)', 'FontSize', 12);
ylabel('InSAR 数据 (mm)', 'FontSize', 12);
title_str = sprintf('数据相关性分析 (R^2 = %.4f)', r2);
title(title_str, 'FontSize', 14, 'FontWeight', 'bold');
legend('show', 'Location', 'best', 'FontSize', 11);
axis equal; % 使坐标轴比例相同,更直观地看出偏差
set(gca, 'FontSize', 11);
%% 5. 结果输出与解读
fprintf('==================== InSAR数据精度评估结果 ====================\n');
fprintf('均方根误差 (RMSE) : %.4f mm\n', rmse);
fprintf('平均绝对误差 (MAE) : %.4f mm\n', mae);
fprintf('相关性系数 (R²) : %.4f\n', r2);
fprintf('平均绝对百分比误差 (MAPE) : %.4f %%\n', mape);
fprintf('================================================================\n\n');
disp('------------------------ 结果解读 ------------------------');
fprintf('1. RMSE 和 MAE: InSAR数据的测量值平均偏离水准基准值约 %.2f mm 到 %.2f mm。\n', min(mae, rmse), max(mae, rmse));
fprintf('2. R²: 值为 %.4f,表明InSAR数据与水准数据之间的线性相关性较弱。\n', r2);
fprintf('3. MAPE: %.2f%% 的值相对较高,说明在沉降量较小(接近零)时,相对误差非常显著。\n', mape);
disp('------------------------------------------------------------'); 这个代码中决定系数计算对吗