如何用matlab画散点图并计算RMSE、R²
时间: 2024-01-30 19:03:24 浏览: 219
要用 Matlab 画散点图并计算 RMSE 和 R²,你可以按照以下步骤操作:
1. 准备数据:将需要画散点图的数据保存在一个数组或矩阵中。
2. 画散点图:使用 scatter 函数画出散点图,例如 scatter(x,y),其中 x 和 y 分别是数据的横纵坐标。
3. 计算 RMSE:使用 rmse 函数计算 RMSE 值,例如 rmse(y_pred,y_true),其中 y_pred 是预测值,y_true 是真实值。
4. 计算 R²:使用 rsq 函数计算 R² 值,例如 rsq(y_pred,y_true),其中 y_pred 是预测值,y_true 是真实值。
下面是一个示例代码:
```matlab
% 准备数据
x = 1:10;
y_true = 2*x + randn(1,10); % 真实值
y_pred = 2*x; % 预测值
% 画散点图
scatter(x,y_true,'o')
hold on
scatter(x,y_pred,'x')
xlabel('x')
ylabel('y')
% 计算 RMSE
rmse_val = rmse(y_pred,y_true);
disp(['RMSE = ',num2str(rmse_val)])
% 计算 R²
rsq_val = rsq(y_pred,y_true);
disp(['R² = ',num2str(rsq_val)])
```
运行上述代码后,会画出带真实值和预测值的散点图,并在命令窗口中显示 RMSE 和 R² 的值。
相关问题
我要用MATLAB预测PM2.5,现有数据13680个数据,存储路径为F:\MyPaper(250323)\25年\空气质量\CODE\4 AI\2223DATA.xlsx,请编写LSTM进行预测,数据为多输入(SO₂ NO₂ NO NOₓ CO PM10)单输出(PM2.5),评价指标包括:R2、MAE、MSE、RMSE ,可视化图形要多样化,波形图、散点图、条形图等 )
### MATLAB 实现 LSTM 网络预测 PM2.5 值
#### 数据预处理
在 MATLAB 中,可以使用 `readtable` 函数加载 Excel 文件并读取数据。为了训练 LSTM 模型,需对多变量输入(SO₂, NO₂, NO, NOₓ, CO, PM10)进行标准化处理,以便更好地收敛[^3]。
```matlab
% 加载数据
data = readtable('F:\MyPaper(250323)\25年\空气质量\CODE\4 AI\2223DATA.xlsx');
% 提取特征和目标变量
inputs = data{:, {'SO2', 'NO2', 'NO', 'NOx', 'CO', 'PM10'}}; % 输入特征
targets = data.PM2_5; % 输出目标
% 归一化处理
muInputs = mean(inputs);
sigmaInputs = std(inputs);
normalizedInputs = (inputs - muInputs) ./ sigmaInputs;
muTargets = mean(targets);
sigmaTargets = std(targets);
normalizedTargets = (targets - muTargets) ./ sigmaTargets;
```
#### 创建 LSTM 网络
通过调用 `sequenceInputLayer`, `lstmLayer`, 和 `fullyConnectedLayer` 构建网络架构,并设置隐含层神经元数量、激活函数等参数[^1]。
```matlab
inputSize = size(normalizedInputs, 2); % 特征维度
numHiddenUnits = 100; % 隐藏单元数
outputSize = 1; % 单输出
layers = [
sequenceInputLayer(inputSize)
lstmLayer(numHiddenUnits,'OutputMode','last') % 使用最后一步的输出
fullyConnectedLayer(outputSize)
regressionLayer];
```
#### 训练配置与执行
定义训练选项,包括最大迭代次数、初始学习率和其他超参数。随后使用 `trainNetwork` 函数完成模型训练。
```matlab
options = trainingOptions('adam', ...
'MaxEpochs',100,...
'MiniBatchSize',64,...
'InitialLearnRate',0.005,...
'ValidationData',{normalizedInputs, normalizedTargets},...
'Plots','training-progress',...
'Verbose',false);
net = trainNetwork(normalizedInputs, normalizedTargets, layers, options);
```
#### 性能评估
计算 R²、MAE、MSE 及 RMSE 等评价指标来衡量模型性能。
```matlab
% 测试阶段反归一化
predictedNormalizedOutputs = predict(net, normalizedInputs);
predictedOutputs = predictedNormalizedOutputs * sigmaTargets + muTargets;
actualOutputs = targets;
% 计算误差指标
mseValue = mse(actualOutputs - predictedOutputs);
rmseValue = sqrt(mseValue);
maeValue = mean(abs(actualOutputs - predictedOutputs));
rSquared = 1 - sum((actualOutputs - predictedOutputs).^2)/sum((actualOutputs - mean(actualOutputs)).^2);
disp(['Mean Squared Error (MSE): ', num2str(mseValue)]);
disp(['Root Mean Squared Error (RMSE): ', num2str(rmseValue)]);
disp(['Mean Absolute Error (MAE): ', num2str(maeValue)]);
disp(['Coefficient of Determination (R-squared): ', num2str(rSquared)]);
```
#### 结果可视化
绘制波形图、散点图和条形图展示实际值与预测值之间的对比情况。
```matlab
figure;
subplot(3,1,1);
plot(actualOutputs, 'b');
hold on;
plot(predictedOutputs, 'r--');
legend('Actual Values', 'Predicted Values');
title('Waveform Comparison');
xlabel('Sample Index'); ylabel('PM2.5 Value');
subplot(3,1,2);
scatter(actualOutputs, predictedOutputs);
line([min(actualOutputs), max(actualOutputs)], [min(actualOutputs), max(actualOutputs)],'Color',[0.75,0.75,0.75]);
title('Scatter Plot');
xlabel('Actual Values'); ylabel('Predicted Values');
subplot(3,1,3);
bar([mean(abs(actualOutputs-predictedOutputs)), maeValue, rmseValue]');
xticks([1,2,3]);
xticklabels({'Average Abs Error', 'MAE', 'RMSE'});
title('Error Metrics Bar Chart');
ylabel('Error Magnitude');
```
---
###
matlab画非线性曲面拟合
### MATLAB中的非线性曲面拟合
在MATLAB中,非线性曲面拟合是一种重要的数据分析技术,用于建立三维空间中数据点之间的复杂关系。为了完成这一任务,MATLAB提供了多种工具和函数,其中`fit`函数是最基础也是最灵活的选择之一[^4]。
#### 使用 `fit` 函数进行非线性曲面拟合
以下是使用`fit`函数实现非线性曲面拟合的一个典型示例:
```matlab
% 假设已知一组实验数据 (xdata, ydata, zdata)
xdata = rand(100, 1)*10; % 随机生成 x 数据
ydata = rand(100, 1)*10; % 随机生成 y 数据
zdata = sin(xdata) .* cos(ydata) + randn(size(xdata)) * 0.1; % 构造 z 数据并加入噪声
% 定义自定义模型表达式
ft = fittype('sin(a*x).*cos(b*y)', 'independent', {'x', 'y'}, 'coefficients', {'a', 'b'});
% 调用 fit 函数执行拟合
fittedModel = fit([xdata, ydata], zdata, ft);
% 显示拟合结果
disp(fittedModel);
```
上述代码展示了如何通过指定一个非线性模型(如`sin(a*x).*cos(b*y)`)来进行曲面拟合,并返回参数估计值及其置信区间[^4]。
#### 利用优化算法解决复杂的非线性问题
对于更加复杂的非线性曲面拟合场景,可以借助MATLAB的优化工具箱中的高级算法,例如Levenberg-Marquardt算法或遗传算法。下面是一个基于Levenberg-Marquardt算法的例子:
```matlab
% 导入必要的包
options = optimset('Algorithm','levenberg-marquardt');
% 初始化猜测参数
initialParams = [1, 1];
% 自定义目标函数
customFunction = @(params, x, y) params(1)*exp(-params(2)*(x.^2+y.^2));
% 执行最小化操作找到最佳参数组合
optimizedParams = lsqcurvefit(customFunction, initialParams, [xdata, ydata], zdata, [], [], options);
% 输出最终的结果
fprintf('Optimized parameters: a=%.4f, b=%.4f\n', optimizedParams(1), optimizedParams(2));
```
此段代码说明了当标准方法不足以解决问题时,可以通过调用更专业的数值计算手段获得精确解答[^3]。
#### 模型验证与评估
无论采取何种方式构建非线性曲面模型,在得到初步结果之后都需要对其进行严格测试以确认其合理性。这通常涉及以下几个方面:
- **残差分析**:绘制残差分布图判断是否存在系统偏差;
- **统计量检查**:比如R²值、调整后的R²以及均方根误差(RMSE),用来衡量整体匹配程度的好坏;
- **可视化对比**:将原始散点和平滑后的表面放在一起观察差异大小是否可接受[^5]。
---
相关问题
阅读全文
相关推荐













