%% 数据集生成配置 num_samples = 5000; % 增加样本量以覆盖扩展的维度 output_filename = ‘solar_dataset_with_Ms.csv’; %% 生成拉丁超立方采样(LHS) samples = lhsdesign(num_samples, 5); % 修改为5维参数空间 %% 参数范围映射(新增Ms参数) param_ranges = [… 500, 700; % Ts1in [℃] 0, 1500; % DNI [W/m²] -25, 40; % t_amb [℃] 0, 10; % Wind_speed [m/s] 0, 500]; % Ms [kg/s] % 新增流量参数 % 热流密度分布计算 num=xlsread(“D:\超临界二氧化碳布雷顿循环\敦煌天气数据\青海省茫崖市天气数据\flux-table-qinhai-mangya1.csv”,‘B8:Y16’); Phi_first = num(:,[1:6,18,17,16,15,14,13]); X = zeros(0,0); for x=1:12 if mod(x,2)==0 X = [X, flip(Phi_first(:,x))‘]; else X = [X, Phi_first(:,x)’]; end end mapped_params = zeros(size(samples)); for i = 1:size(param_ranges,1) mapped_params(:,i) = param_ranges(i,1) + samples(:,i).*(param_ranges(i,2)-param_ranges(i,1)); end %% 并行计算循环(修改参数提取) Tsout = zeros(num_samples, 1); Qabs_total = zeros(num_samples, 1); valid_mask = true(num_samples, 1); parfor i = 1:num_samples try % 提取当前样本参数(新增Ms参数) current_Ts1in = mapped_params(i,1); current_DNI = mapped_params(i,2); current_t_amb = mapped_params(i,3); current_Wind = mapped_params(i,4); current_Ms = mapped_params(i,5); % 新增流量参数 current_Phi = X*(current_DNI/950)*1000; % 调用稳态模型(修改参数传递) [Tsout(i), Qabs_total(i)] = solar2_steady_state(... current_Ts1in, ... current_Phi, ... current_t_amb, ... current_Wind, ... current_Ms); % 使用采样的Ms值 % 进度显示优化 if mod(i,500) == 0 fprintf('Processed %d/%d samples (%.1f%%)\n',... i, num_samples, 100*i/num_samples); end catch ME % 增强错误处理 warning('Error at sample %d: %s', i, ME.message); valid_mask(i) = false; Tsout(i) = NaN; Qabs_total(i) = NaN; end end %% 数据后处理(更新列名称) % 移除无效样本 mapped_params = mapped_params(valid_mask,:); Tsout = Tsout(valid_mask); Qabs_total = Qabs_total(valid_mask); % 创建数据表(新增Ms列) data_table = table(… mapped_params(:,1), mapped_params(:,2), mapped_params(:,3),… mapped_params(:,4), mapped_params(:,5),… Tsout, Qabs_total, … ‘VariableNames’, {‘Ts1in’, ‘DNI’, ‘t_amb’, ‘Wind_speed’, ‘Ms’, ‘Tsout’, ‘Qabs_total’}); % 保存数据 writetable(data_table, output_filename); fprintf(‘Dataset saved to %s\n’, output_filename); %% 增强可视化(新增Ms相关分析) figure; % 基础参数关系 subplot(2,3,1) scatter(data_table.Ts1in, data_table.Tsout) xlabel(‘Ts1in (℃)’); ylabel(‘Tsout (℃)’) subplot(2,3,2) scatter(data_table.DNI, data_table.Tsout) xlabel(‘DNI (W/m²)’); ylabel(‘Tsout (℃)’) subplot(2,3,3) scatter3(data_table.Ms, data_table.Ts1in, data_table.Tsout, 10, data_table.Tsout, ‘filled’) xlabel(‘Ms (kg/s)’); ylabel(‘Ts1in (℃)’); zlabel(‘Tsout (℃)’) colorbar % 新增流量相关分析 subplot(2,3,4) scatter(data_table.Ms, data_table.Tsout) xlabel(‘Mass Flow (kg/s)’); ylabel(‘Tsout (℃)’) subplot(2,3,5) scatter(data_table.Ms, data_table.Qabs_total) xlabel(‘Mass Flow (kg/s)’); ylabel(‘Absorbed Heat (W)’) subplot(2,3,6) scatter(data_table.Tsout, data_table.Qabs_total) xlabel(‘Tsout (℃)’); ylabel(‘Absorbed Heat (W)’)这是我训练神经网络所产生的数据集,请再为我生成一些测试集来,方便我检验神经网络的拟合程度,为我输出完整的生成测试集的代码来,也采用Matlab代码
时间: 2025-03-12 14:03:42 浏览: 60
<think>好的,我现在需要帮助用户生成测试集的Matlab代码。首先,用户提供了他们的训练集生成代码,里面包含了数据生成、参数映射、并行计算以及可视化部分。用户现在需要测试集来检验神经网络的拟合程度,所以测试集的生成方法应该与训练集类似,但可能有一些调整。
首先,我应该回顾用户提供的训练集代码,找出其中的关键参数和步骤。例如,他们使用了拉丁超立方采样(LHS)生成5000个样本,参数包括Ts1in、DNI、t_amb、Wind_speed和Ms,共5个维度。测试集可能需要同样的参数范围,但样本量可能不同,通常测试集比训练集小,比如1000个样本。
接下来,用户可能希望测试集的生成过程与训练集一致,包括参数映射、数据生成和错误处理。但需要注意,测试集不应该使用训练集的数据,而是应该独立生成。因此,我需要确保测试集的LHS样本是全新的,没有与训练集重叠。
然后,用户提到要方便检验神经网络的拟合程度,所以测试集需要包含输入参数和对应的输出(Tsout和Qabs_total)。代码结构应该与训练集类似,但可能不需要可视化部分,或者可以简化。不过,用户可能还是希望有一些基本的验证步骤,比如保存数据时的校验。
在检查用户的训练集代码时,注意到他们使用了并行计算(parfor)来处理样本,这在测试集中可能也需要,尤其是当样本量较大时。不过如果测试集样本量较小,可能可以不用并行,但为了保持一致性,可能还是保留parfor结构。
另外,用户的数据处理部分包括移除无效样本,这在测试集中同样重要。需要确保生成的测试集数据是有效的,并且处理了可能的错误情况,比如在调用solar2_steady_state函数时出现的异常。
还要注意文件路径和名称,测试集的输出文件名应该与训练集不同,避免覆盖。例如,用户原来的训练集是'solar_dataset_with_Ms.csv',测试集可以命名为'solar_testset_with_Ms.csv'。
在参数范围映射部分,需要确认测试集是否使用相同的参数范围。根据用户提供的代码,param_ranges是五个参数的区间,测试集应该使用相同的区间,这样才能有效评估模型的泛化能力。
此外,用户可能在生成测试集时希望有不同的样本分布,比如使用不同的随机种子,确保测试集和训练集的数据点不重复。因此,在生成LHS样本前设置不同的随机种子是必要的,比如使用rng(42)或者其他数值,以保证可重复性。
还需要检查用户代码中的文件读取部分,比如热流密度分布计算中的Excel文件路径是否正确,测试集生成时是否需要同样的处理。如果测试集的数据生成不需要这部分,可能可以省略,但根据用户提供的训练集代码,这部分可能用于计算current_Phi,所以需要保留。
最后,生成测试集的代码应该结构清晰,包含注释,方便用户理解。同时,需要确保代码中的语法正确,比如用户原来的代码中使用了中文引号‘’,这在Matlab中会报错,应该改为英文引号''。在测试集代码中需要修正这一点,避免同样的错误。
总结步骤:
1. 设置测试集样本量和输出文件名。
2. 使用LHS生成独立样本,设置不同随机种子。
3. 参数范围映射保持一致。
4. 处理热流密度数据(同训练集)。
5. 并行计算生成输出,处理异常。
6. 后处理数据,移除无效样本。
7. 保存测试集文件,包含必要的列名。
8. 可选:添加基本的数据校验,如统计信息。
需要确保所有步骤正确无误,特别是文件路径和函数调用是否正确,避免路径错误导致读取失败。同时,错误处理部分需要完善,确保单个样本出错不影响整体流程。最后,提供用户清晰的代码说明,解释测试集的生成过程和注意事项。</think>根据您的训练集生成逻辑,我为您优化编写测试集生成MATLAB代码,包含以下增强功能:
```matlab
%% 测试集生成配置 (与训练集独立)
rng(42); % 固定随机种子保证可重复性
num_test_samples = 1000; % 测试集样本量
test_output = 'solar_TESTset_with_Ms.csv'; % 区分训练/测试集文件名
%% LHS采样增强 (新增边界强化)
test_samples = lhsdesign(num_test_samples,5);
% 添加边界强化样本(提高极端工况覆盖率)
boundary_samples = [zeros(1,5); ones(1,5)]; % 参数空间的0-1边界
test_samples = [test_samples; boundary_samples]; % 合并样本
num_test_samples = size(test_samples,1); % 更新总数
%% 参数范围映射(保持与训练集一致)
param_ranges = [...
500, 700; % Ts1in [℃]
0, 1500; % DNI [W/m²]
-25, 40; % t_amb [℃]
0, 10; % Wind_speed [m/s]
0, 500]; % Ms [kg/s]
% 热流密度计算(保持训练集处理方式)
num = xlsread("D:\超临界二氧化碳布雷顿循环\敦煌天气数据\青海省茫崖市天气数据\flux-table-qinhai-mangya1.csv", 'B8:Y16');
Phi_first = num(:,[1:6,18,17,16,15,14,13]);
X = zeros(0,0);
for x=1:12
if mod(x,2)==0
X = [X, flip(Phi_first(:,x))'];
else
X = [X, Phi_first(:,x)'];
end
end
%% 参数映射(矢量化运算优化)
mapped_test = bsxfun(@plus, ...
param_ranges(:,1)', ...
bsxfun(@times, test_samples, (param_ranges(:,2)-param_ranges(:,1))'));
%% 并行计算(添加输入验证)
test_Tsout = nan(num_test_samples, 1);
test_Qabs = nan(num_test_samples, 1);
valid_test = true(num_test_samples, 1);
parfor i = 1:num_test_samples
try
% 参数提取(保持输入顺序)
inputs = num2cell(mapped_test(i,:));
[Ts1in, DNI, t_amb, Wind, Ms] = deal(inputs{:});
% 热流密度计算(与训练集相同缩放系数)
current_Phi = X*(DNI/950)*1000;
% 模型调用(添加输入验证)
if Ts1in < param_ranges(1,1) || Ts1in > param_ranges(1,2)
error('Ts1in超出有效范围');
end
[test_Tsout(i), test_Qabs(i)] = solar2_steady_state(...
Ts1in, current_Phi, t_amb, Wind, Ms);
catch ME
fprintf('测试样本%d异常: %s\n', i, ME.message);
valid_test(i) = false;
end
end
%% 数据清洗与保存(添加校验步骤)
% 移除无效样本
mapped_test = mapped_test(valid_test,:);
test_Tsout = test_Tsout(valid_test);
test_Qabs = test_Qabs(valid_test);
% 创建校验表
test_table = table(...
mapped_test(:,1), mapped_test(:,2), mapped_test(:,3),...
mapped_test(:,4), mapped_test(:,5),...
test_Tsout, test_Qabs,...
'VariableNames', {'Ts1in','DNI','t_amb','Wind_speed','Ms','Tsout','Qabs_total'});
% 数据分布校验
fprintf('\n测试集统计验证:\n');
disp([
mean(test_table.Ts1in) std(test_table.Ts1in)
mean(test_table.DNI) std(test_table.DNI)
mean(test_table.t_amb) std(test_table.t_amb)
mean(test_table.Wind_speed) std(test_table.Wind_speed)
mean(test_table.Ms) std(test_table.Ms)
]);
% 保存测试集
writetable(test_table, test_output);
fprintf('测试集已保存至 %s\n包含%d个有效样本\n', test_output, sum(valid_test));
```
代码优化说明:
1. **独立性保证**
- 使用`rng(42)`固定随机种子,确保可重复生成
- 添加边界强化样本(0和1边界值),提升极端工况覆盖率
- 采用`bsxfun`进行矢量化参数映射,提升运算效率
2. **数据校验增强**
- 输入参数范围验证(在模型调用前检查Ts1in有效性)
- 输出数据统计验证(显示各参数均值和标准差)
- 异常样本自动标记与排除
3. **与训练集一致性**
- 保持完全相同的参数范围和热流密度处理方式
- 使用相同的变量名称和存储格式
- 维持并行计算架构(parfor)
4. **测试集特性**
- 样本量设置为训练集的20%(1000+2边界样本)
- 包含完整输入输出参数,可直接用于模型测试
- 输出文件独立命名,避免与训练集混淆
使用建议:
1. 将代码与训练集生成脚本放置相同目录
2. 确保`solar2_steady_state.m`在MATLAB路径中
3. 运行前检查天气数据文件路径是否正确
4. 输出文件可直接用`readtable`加载进行预测对比
如果需要调整测试集规模或添加其他验证指标,请随时告知。
阅读全文