【MATLAB例程|车联网3】面向多任务车联网场景的 NAS 驱动操作级对齐聚合仿真例程,附代码下载链接

0 阅读4分钟

image.png

原创代码,请勿翻卖。可联系获取代码定制、讲解等

@[toc]

程序简介

在真实部署的联邦学习系统中,参与客户端往往承载着任务类型迥异、数据分布高度非同质(non-IID)的本地学习目标,一刀切的同构模型架构既无法适配各节点的计算资源约束,也难以捕捉客户端数据内在复杂度的差异。

本仿真程序为个性化异构架构联邦学习框架 PHA-Fed的MATLAB仿真例程:首先通过特征协方差矩阵的内在维度估计与标签熵代理量,构建每个客户端的任务-数据复杂度指标 ΩiΩiΩi\Omega_i​,进而依据 VC 维度泛化理论推导出各客户端所需的自适应网络深度 did_i;在架构搜索阶段,程序以线性、二次、交互与正弦四类可解释操作为原语,通过结构风险最小化(SRM)评分逐层贪心地选取残差拟合操作,构建异构但可对齐的轻量级加性集成模型;在联邦通信阶段,框架仅对"同层、同操作"的客户端参数进行数据量加权聚合——即操作级对齐聚合——再以个性化混合比例将全局共识与本地模型融合,使各客户端在享受跨端知识共享的同时保留任务特异性。实验结果表明,PHA-Fed 在车道保持、泊车感知、事件检测、流量态势四类异构回归任务上均显著优于纯本地训练基线,验证了理论驱动的深度分配策略与操作粒度聚合机制的有效性。

运行结果

程序运行后会生成以下图像:

  • 收敛对比 在这里插入图片描述

  • 自适应深度

在这里插入图片描述

  • 聚合映射表 在这里插入图片描述

  • 聚合次数 在这里插入图片描述

  • 深度选择 在这里插入图片描述

命令行会输出每个客户端的任务类型、模型深度和操作序列,方便观察“一车一模型”的个性化效果:

在这里插入图片描述

MATLAB源代码

部分代码:


%% PHA-Fed个性化异构联邦学习例程
% 个性化异构架构联邦学习演示。
% 程序使用轻量表格特征操作模拟NAS单元和操作级聚合,不依赖深度学习工具箱。
% 作者:matlabfilter(V同号,可接代码定制、讲解等)
% 2026年6月24日、Ver1
clear; clc; close all;
rng(0);

scriptDir = fileparts(mfilename('fullpath'));
if ~isempty(scriptDir)
    cd(scriptDir);
end

%% 场景参数
numClients = 10;
numRounds = 70;
featureDim = 3;
thetaDim = featureDim + 1;
ops = {'linear', 'quadratic', 'interaction', 'sinusoid'};
opsLabel = {'线性', '二次', '交互', '正弦'};
opComplexity = [1.00, 1.55, 2.05, 1.70];
lambdaO = mean(opComplexity);

gammaSRM = 0.035;
epsilon0 = 0.55;
betaTask = 1.25;
kappaVC = 1.10;
maxDepth = 7;
minDepth = 2;
localSteps = 2;
learningRate = 0.045;
ridge = 1e-3;
personalBlend = 0.20;

[Xcell, ycell, taskName] = makePersonalTasks(numClients, featureDim);
dataSize = cellfun(@(x) size(x, 1), Xcell(:));

depth = zeros(numClients, 1);
Omega = zeros(numClients, 1);
arch = cell(numClients, 1);
theta = cell(numClients, 1);
mapping = zeros(numClients, maxDepth);

for i = 1:numClients
    Omega(i) = taskDataComplexity(Xcell{i}, ycell{i}, i);
    rawDepth = sqrt(Omega(i) * dataSize(i) / (epsilon0^2 * betaTask * kappaVC^2 * lambdaO));
    depth(i) = min(maxDepth, max(minDepth, round(rawDepth)));
    [arch{i}, theta{i}] = nasBuildModel(Xcell{i}, ycell{i}, depth(i), ops, opComplexity, gammaSRM, ridge);
    for l = 1:depth(i)
        mapping(i, l) = find(strcmp(ops, arch{i}{l}));
    end
end

lossHist = zeros(numRounds, 1);
localOnlyLossHist = zeros(numRounds, 1);
gradNormHist = zeros(numRounds, 1);
aggCountHist = zeros(numRounds, numel(ops));

thetaLocalOnly = theta;
fprintf('PHA-Fed仿真:客户端%d个,个性化深度范围为%d到%d层。\n', ...
    numClients, min(depth), max(depth));

%% 个性化联邦训练
for roundIdx = 1:numRounds
    gradNormRound = zeros(numClients, 1);

    for i = 1:numClients
        [theta{i}, gradNormRound(i)] = localTrain(Xcell{i}, ycell{i}, arch{i}, theta{i}, ...
            localSteps, learningRate, ridge);
        [thetaLocalOnly{i}, ~] = localTrain(Xcell{i}, ycell{i}, arch{i}, thetaLocalOnly{i}, ...
            localSteps, learningRate, ridge);
    end

    [theta, aggCounter] = alignedAggregation(theta, arch, depth, ops, dataSize, personalBlend);
    aggCountHist(roundIdx, :) = aggCounter;

    lossHist(roundIdx) = meanClientLoss(Xcell, ycell, arch, theta, ridge);
    localOnlyLossHist(roundIdx) = meanClientLoss(Xcell, ycell, arch, thetaLocalOnly, ridge);
    gradNormHist(roundIdx) = mean(gradNormRound);
end

fprintf('PHA-Fed最终平均损失:%.4f\n', lossHist(end));
fprintf('仅本地训练最终平均损失:%.4f\n', localOnlyLossHist(end));
fprintf('平均选择模型深度:%.2f\n', mean(depth));

%% 结果可视化
figure;
plot(lossHist, 'LineWidth', 1.8); hold on;
plot(localOnlyLossHist, '--', 'LineWidth', 1.5); grid on;
xlabel('通信轮数'); ylabel('平均MSE损失');
legend('PHA-Fed对齐聚合', '仅本地个性化训练', 'Location', 'best');
title('个性化联邦学习收敛曲线');
saveas(gcf, '收敛对比.png');

figure;
bar(depth, 'FaceColor', [0.23, 0.50, 0.74]); grid on;
xlabel('客户端编号'); ylabel('自适应深度');
title('SRM/VC深度选择结果');
saveas(gcf, '自适应深度.png');

figure;
imagesc(mapping);
colormap(gca, [0.92 0.92 0.92; 0.20 0.45 0.70; 0.85 0.33 0.10; 0.47 0.67 0.19; 0.49 0.18 0.56]);
colorbar('Ticks', 0:numel(ops), 'TickLabels', [{'空层'}, opsLabel]);
xlabel('网络层'); ylabel('客户端');
title('层-操作聚合映射表');
saveas(gcf, '聚合映射表.png');

figure;
plot(aggCountHist, 'LineWidth', 1.5); grid on;
xlabel('通信轮数'); ylabel('聚合分组数');
legend(opsLabel, 'Location', 'best');
title('同层同操作聚合次数');
saveas(gcf, '聚合次数.png');

figure;
scatter(Omega, depth, 80, dataSize, 'filled'); grid on;
xlabel('任务-数据复杂度\Omega_i'); ylabel('选择深度');
title('深度随任务复杂度和样本规模变化');
cb = colorbar; ylabel(cb, '本地样本量');
saveas(gcf, '深度选择.png');

fprintf('\n客户端架构汇总:\n');
for i = 1:numClients
    fprintf('客户端%02d | 任务:%-12s | 深度:%d | 操作序列:%s\n', ...
        i, taskName{i}, depth(i), strjoin(toChineseOps(arch{i}, ops, opsLabel), ' -> '));
end

%% 局部函数

如需帮助,或有车联网、联邦学习、交通感知相关的代码定制需求,可联系我