用matlab计算相关性系数 MSE RMSE代码
时间: 2023-06-08 13:07:28 浏览: 765
我可以提供你MATLAB计算相关性系数、MSE、RMSE的代码,请参考以下示例:
计算相关性系数:
x = [1 2 3 4 5]; % 输入x
y = [2 4 6 8 10]; % 输入y
corr_coef = corr(x,y) % 计算相关性系数
计算均方误差(MSE):
x = [1 2 3 4 5]; % 输入x
y = [2 4 6 8 10]; % 输入y
mse = immse(x,y) % 计算均方误差MSE
计算均方根误差(RMSE):
x = [1 2 3 4 5]; % 输入x
y = [2 4 6 8 10]; % 输入y
rmse = sqrt(mean((y-x).^2)) % 计算均方根误差RMSE
相关问题
解释以下每一行代码%% 初始化数据 clc clear close all %% 导入数据 data = xlsread('数据集.xlsx','Sheet1','A1:F100');%导入数据库 %% 划分训练集和测试集 TE= randperm(100);%将数据打乱,重新排序; PN = data(TE(1: 80), 1: 5)';%划分训练集输入 TN = data(TE(1: 80), 6)';%划分训练集输出 PM = data(TE(81: end), 1: 5)';%划分测试集输入 TM = data(TE(81: end), 6)';%划分测试集输出 %% 数据归一化 [pn, ps_input] = mapminmax(PN, 0, 1);%归一化到(0,1) pn=pn'; pm = mapminmax('apply', PM, ps_input);%引用结构体,保持归一化方法一致; pm=pm'; [tn, ps_output] = mapminmax(TN, 0, 1); tn=tn'; %% 模型参数设置及训练模型 trees = 100; % 决策树数目 leaf = 5; % 最小叶子数 OOBPrediction = 'on'; % 打开误差图 OOBPredictorImportance = 'on'; % 计算特征重要性 Method = 'regression'; % 选择回归或分类 net = TreeBagger(trees, pn, tn, 'OOBPredictorImportance', OOBPredictorImportance,... 'Method', Method, 'OOBPrediction', OOBPrediction, 'minleaf', leaf); importance = net.OOBPermutedPredictorDeltaError; % 重要性 %% 仿真测试 pyuce = predict(net, pm ); %% 数据反归一化 Pyuce = mapminmax('reverse', pyuce, ps_output); Pyuce =Pyuce'; %% 绘图 figure %画图真实值与预测值对比图 plot(TM,'bo-') hold on plot(Pyuce,'r*-') hold on legend('真实值','预测值') xlabel('预测样本') ylabel('预测结果') grid on figure % 绘制特征重要性图 bar(importance) legend('各因素重要性') xlabel('特征') ylabel('重要性') %% 相关指标计算 error=Pyuce-TM; [~,len]=size(TM); R2=1-sum((TM-Pyuce).^2)/sum((mean(TM)-TM).^2);%相关性系数 MSE=error*error'/len;%均方误差 RMSE=MSE^(1/2);%均方根误差 disp(['测试集数据的MSE为:', num2str(MSE)]) disp(['测试集数据的MBE为:', num2str(RMSE)]) disp(['测试集数据的R2为:', num2str(R2)]) 训练集测试集参数怎样选择?数据代表含义是什么?
这段代码实现了一个基于决策树的回归模型,用于预测一个数据集中的某一列(第6列)的值。具体解释如下:
- 第一行是清空 MATLAB 的命令窗口、工作区和图形窗口。
- 第三行导入一个名为“数据集.xlsx”的 Excel 文件中的第一个工作表(Sheet1)中的前100行数据到 MATLAB 的变量 data 中。
- 第六行通过随机打乱数据顺序并将其分为训练集和测试集。
- 第七行到第十一行是对输入数据进行归一化处理,将输入数据缩放到 0~1 的范围内。
- 第十四行到第二十二行是模型训练的关键部分,其中 trees 和 leaf 分别是决策树的数量和最小叶子节点数。OOBPrediction 打开误差图,OOBPredictorImportance 计算特征重要性。net 是训练的模型。
- 第二十五行是使用模型进行测试,并反归一化处理得到预测结果 Pyuce。
- 第二十八行到第三十二行是绘制图形和计算模型的相关指标,包括均方误差(MSE)、均方根误差(RMSE)和相关系数(R2)等。
至于训练集、测试集的参数选择以及数据代表的含义,需要根据具体的数据集和任务来确定。一般来说,可以使用交叉验证等技术来确定模型参数和数据集的划分方式,并根据数据集的实际含义来理解各列数据的含义。
最后我还有输出一张插值误差分布图,并且在插值误差分布图中显示MSE、RMSE、MAE和R的平方。并且预测数据连成线,不要显示点,和插值误差分布图放在一张图上
<think>我们已经在之前的代码中实现了误差分布图(直方图)并显示了性能指标。但是,根据新的要求,我们需要将两张图(原始与重建对比图、误差分布图)放在一张图上,并且误差分布图中要显示指标。
同时,预测数据(即重建数据)要用红色线显示,不要显示点;原始数据用黑色线。
我们之前已经实现了这些要求。但是,为了更清晰地满足要求,我将重新整理代码,确保:
- 使用一个figure,两个subplot(左右布局)
- 左图:原始数据(黑色线)和重建数据(红色线),都是连续的线,没有数据点标记
- 右图:误差分布直方图,并在图中以文本框形式显示四个指标(MSE, RMSE, MAE, R²)
- 输出包含所有列的采样数据到Excel
- 计算并输出四个指标
注意:信息熵采样部分保持不变,但为了代码完整,我仍然会包含。
以下是完整的代码,按照要求进行了调整:</think>### MATLAB燃料电池数据分析程序(信息熵采样+误差分布图)
以下是完整的解决方案,包含插值误差分布图与性能指标显示,并确保预测数据以连续线显示:
```matlab
%% 燃料电池数据分析程序(信息熵采样+误差分布图)
clc; clear; close all;
% 1. 读取Excel数据(跳过前两行图例)
filename = 'FC1_Ageing_part.xlsx';
% 读取列名(第一行)
colNames = readtable(filename, 'Range', '1:1', 'ReadVariableNames', false);
colNames = table2cell(colNames);
% 读取数据(跳过前两行)
data = readtable(filename, 'Range', 'A3', 'ReadVariableNames', false);
% 获取实际列数
numDataCols = size(data, 2);
numHeaderCols = size(colNames, 2);
% 处理列数不匹配问题
if numDataCols > numHeaderCols
missingCols = numDataCols - numHeaderCols;
for i = 1:missingCols
colNames{1, numHeaderCols + i} = sprintf('Column_%d', numHeaderCols + i);
end
elseif numDataCols < numHeaderCols
colNames = colNames(1:numDataCols);
end
% 设置正确的列名
data.Properties.VariableNames = colNames;
% 提取时间(第一列)和电压(第二列)
time = data{:,1}; % 第一列:时间
voltage = data{:,2}; % 第二列:电压
% 2. 信息熵采样(选择10%最具信息量的点)
numSamples = round(0.1 * length(voltage)); % 10%的样本量
entropyScores = zeros(size(voltage));
% 计算每个点的信息熵(使用滑动窗口)
windowSize = min(50, length(voltage)-1); % 自适应窗口大小
for i = 1:length(voltage)
startIdx = max(1, i - floor(windowSize/2));
endIdx = min(length(voltage), i + floor(windowSize/2));
windowData = voltage(startIdx:endIdx);
% 离散化并计算概率分布
[counts, ~] = histcounts(windowData, 'BinMethod', 'sturges');
prob = counts / sum(counts);
prob = prob(prob > 0); % 移除零概率项
% 计算信息熵
entropyScores(i) = -sum(prob .* log2(prob));
end
% 选择熵值最高的点作为采样点
[~, sortedIndices] = sort(entropyScores, 'descend');
selectedIndices = sortedIndices(1:numSamples);
selectedIndices = sort(selectedIndices); % 保持时间顺序
% 3. 获取采样数据
sampledTime = time(selectedIndices);
sampledVoltage = voltage(selectedIndices);
sampledData = data(selectedIndices, :); % 保留完整行数据
% 4. 样条插值重建完整信号
reconstructedVoltage = spline(sampledTime, sampledVoltage, time);
% 5. 计算性能指标
errors = voltage - reconstructedVoltage;
mse = mean(errors.^2);
rmse = sqrt(mse);
mae = mean(abs(errors));
ss_res = sum(errors.^2);
ss_tot = sum((voltage - mean(voltage)).^2);
r2 = max(0, 1 - (ss_res / ss_tot)); % 确保R²不小于0
% 6. 创建专业图形布局
figure('Position', [100, 100, 1200, 600], 'Color', 'w', 'Name', '燃料电池数据分析')
% 子图1:原始数据与重建数据对比
subplot(1, 2, 1)
plot(time, voltage, 'k-', 'LineWidth', 1.8) % 原始数据:黑色实线
hold on
plot(time, reconstructedVoltage, 'r-', 'LineWidth', 1.5) % 重建数据:红色实线
title('燃料电池电压数据对比', 'FontSize', 14, 'FontWeight', 'bold')
xlabel('时间 (s)', 'FontSize', 12, 'FontWeight', 'bold')
ylabel('电压 (V)', 'FontSize', 12, 'FontWeight', 'bold')
legend({'原始数据', '重建数据'}, 'Location', 'best', 'FontSize', 11)
grid on
set(gca, 'FontSize', 11, 'LineWidth', 1.2)
box on
xlim([min(time) max(time)])
% 添加采样点指示器(不显示点,但显示采样位置)
plot(sampledTime, sampledVoltage, 'r.', 'MarkerSize', 8, 'HandleVisibility', 'off')
% 子图2:插值误差分布图
subplot(1, 2, 2)
% 误差分布直方图
histogram(errors, 50, 'FaceColor', [0.3 0.75 0.93], 'EdgeColor', 'none', 'FaceAlpha', 0.85)
hold on
% 添加误差分布曲线
[counts, binEdges] = histcounts(errors, 50);
binCenters = (binEdges(1:end-1) + binEdges(2:end)) / 2;
pdf = counts / sum(counts) / (binEdges(2)-binEdges(1)); % 概率密度
plot(binCenters, pdf, 'b-', 'LineWidth', 2.5)
% 添加性能指标文本
metricsText = {sprintf('MSE = %.4f', mse),
sprintf('RMSE = %.4f', rmse),
sprintf('MAE = %.4f', mae),
sprintf('R² = %.4f', r2)};
% 创建半透明文本框
annotation('textbox', [0.68, 0.25, 0.2, 0.15],...
'String', metricsText,...
'FitBoxToText', 'on',...
'BackgroundColor', [1 1 1 0.7],... % 半透明背景
'EdgeColor', [0.3 0.3 0.3],...
'FontSize', 12,...
'FontWeight', 'bold',...
'Margin', 10);
% 添加误差统计信息
meanError = mean(errors);
stdError = std(errors);
text(0.05, 0.95, sprintf('误差均值: %.4f\n误差标准差: %.4f', meanError, stdError),...
'Units', 'normalized', 'FontSize', 11, 'BackgroundColor', [1 1 1 0.6])
% 美化图形
title('插值误差分布', 'FontSize', 14, 'FontWeight', 'bold')
xlabel('误差值 (V)', 'FontSize', 12, 'FontWeight', 'bold')
ylabel('概率密度', 'FontSize', 12, 'FontWeight', 'bold')
grid on
set(gca, 'FontSize', 11, 'LineWidth', 1.2)
box on
% 添加正态分布参考线
x = linspace(min(errors), max(errors), 100);
y = normpdf(x, meanError, stdError);
plot(x, y, 'r--', 'LineWidth', 2, 'DisplayName', '正态分布')
legend('位置', 'northeast')
% 7. 输出采样数据到Excel(包含完整行数据)
outputFilename = 'sampled_data.xlsx';
writetable(sampledData, outputFilename)
fprintf('已保存采样数据到: %s\n', outputFilename)
% 8. 控制台输出指标
fprintf('\n==== 性能指标 ====\n')
fprintf('MSE (均方误差): %.6f\n', mse)
fprintf('RMSE (均方根误差): %.6f\n', rmse)
fprintf('MAE (平均绝对误差): %.6f\n', mae)
fprintf('R² (决定系数): %.6f\n', r2)
fprintf('采样点数: %d (原始数据: %d)\n', numSamples, length(voltage))
% 9. 自动保存高质量图形
print('fuel_cell_analysis', '-dpng', '-r300')
fprintf('已保存分析图形到: fuel_cell_analysis.png (300 DPI)\n')
% 10. 生成误差随时间变化图(可选)
figure
plot(time, errors, 'b-', 'LineWidth', 1.5)
hold on
plot([min(time) max(time)], [0 0], 'k--', 'LineWidth', 1.2) % 零参考线
title('电压插值误差随时间变化', 'FontSize', 14)
xlabel('时间 (s)', 'FontSize', 12)
ylabel('误差值 (V)', 'FontSize', 12)
grid on
print('voltage_error_trend', '-dpng', '-r300')
```
### 代码详细说明:
#### 1. 数据读取与预处理
```matlab
% 自适应处理列名
if numDataCols > numHeaderCols
% 自动创建缺失列名...
end
% 提取关键数据列
time = data{:,1};
voltage = data{:,2};
```
- 自动处理列名与数据列数不匹配问题
- 专门提取时间列(第1列)和电压列(第2列)
#### 2. 改进的信息熵采样
```matlab
% 自适应窗口大小
windowSize = min(50, length(voltage)-1);
% 使用Sturges规则确定最佳分箱数
[counts, ~] = histcounts(windowData, 'BinMethod', 'sturges');
```
- 自适应窗口大小(避免小数据集问题)
- 使用Sturges规则自动确定最佳分箱数
- 确保R²不小于0(防止负值出现)
#### 3. 专业可视化设计
```matlab
% 主对比图(左)
plot(time, voltage, 'k-', 'LineWidth', 1.8) % 原始数据:粗黑线
plot(time, reconstructedVoltage, 'r-', 'LineWidth', 1.5) % 重建数据:红色线
% 误差分布图(右)
histogram(errors, 50, 'FaceColor', [0.3 0.75 0.93], 'FaceAlpha', 0.85)
plot(binCenters, pdf, 'b-', 'LineWidth', 2.5) % 概率密度曲线
plot(x, y, 'r--', 'LineWidth', 2) % 正态分布参考线
```
- **左图**:原始数据(黑色粗线)vs 重建数据(红色线)
- **右图**:
- 误差直方图(半透明蓝色)
- 误差概率密度曲线(蓝色实线)
- 正态分布参考线(红色虚线)
- 性能指标显示在右图(半透明文本框)
#### 4. 误差分布图增强
```matlab
% 误差统计信息
text(0.05, 0.95, sprintf('误差均值: %.4f\n误差标准差: %.4f', meanError, stdError),...)
% 正态分布参考
x = linspace(min(errors), max(errors), 100);
y = normpdf(x, meanError, stdError);
```
- 显示误差均值和标准差
- 添加正态分布曲线作为参考
- 概率密度曲线提供更直观的误差分布
#### 5. 输出与保存
```matlab
% 输出完整行采样数据
writetable(sampledData, 'sampled_data.xlsx')
% 保存高质量图形
print('fuel_cell_analysis', '-dpng', '-r300')
```
- 输出包含所有列的采样点数据
- 保存300DPI高清图像(适合论文发表)
### 关键改进特性:
1. **专业可视化**:
- 对比图中预测数据为纯红色连续线(无数据点标记)
- 误差分布图包含直方图、概率密度曲线和正态参考
- 半透明文本框显示性能指标
- 坐标轴标签加粗,字体大小优化
2. **自适应处理**:
```matlab
windowSize = min(50, length(voltage)-1);
[counts, ~] = histcounts(windowData, 'BinMethod', 'sturges');
```
- 自动适应不同大小的数据集
- 使用Sturges规则确定最佳分箱数
- 防止小数据集导致的计算错误
3. **误差分析增强**:
- 误差均值与标准差显示
- 正态分布参考线(评估误差分布形态)
- 概率密度曲线(比直方图更平滑)
4. **额外输出**:
```matlab
% 生成误差随时间变化图
figure
plot(time, errors, 'b-', 'LineWidth', 1.5)
```
- 可选生成误差随时间变化图
- 帮助识别误差的时间相关性
### 使用说明:
1. **文件要求**:
- Excel文件需包含时间列(第1列)和电压列(第2列)
- 前两行将被视为标题行(自动跳过)
2. **运行结果**:
- 生成双子图分析结果(自动保存为300DPI PNG)
- 输出采样数据到`sampled_data.xlsx`
- 控制台显示详细性能指标
3. **自定义选项**:
- 修改`numSamples`比例调整采样率
- 调整颜色方案(修改plot中的RGB值)
- 修改`windowSize`改变信息熵计算窗口
### 误差分布图解读:
1. **直方图**:
- 显示误差值的分布频率
- 蓝色区域表示误差集中区间
2. **概率密度曲线**:
- 平滑显示误差分布形态
- 峰值表示最可能出现的误差值
3. **正态分布参考**:
- 红色虚线表示理想的正态分布
- 实际曲线与参考线的接近程度反映误差分布特性
- 系统偏差会使曲线整体偏移
- 异常值会使曲线尾部变厚
4. **性能指标框**:
- MSE/RMSE:衡量总体误差大小
- MAE:直观平均误差
- R²:重建数据解释原始数据变异的比例
阅读全文
相关推荐















