%% CNN-RNN 通用分类：UCI HAR 多通道传感器序列案例
clear; clc; close all;
fprintf('=== CNN-RNN通用分类试用版 ===\n');
fprintf('最多100条样本；最多两层卷积；隐藏单元不超过64；最多训练30轮\n');
fprintf('试用版开放LSTM和GRU，结果图带试用版水印\n');
fprintf('完整功能与持续更新：www.khsci.com/docs\n\n');

%% 1. 导入数据
% X尺寸为2700×9×128：样本×传感器通道×时间点。
load('har_activity_data.mat', 'X', 'Y', 'splitLabels');

%% 2. 输入适配与固定划分
options.sampleDimension = 'auto'; % 自动把第一维识别为样本维。
options.sequenceAxis = 2;          % 单条样本[9,128]的第2维是时间轴。
options.splitLabels = splitLabels; % 1训练、2验证、3测试，按受试者隔离。
options.rTrain = 0.80;             % 有splitLabels时不参与划分。
options.validationRatio = 0.15;    % 有splitLabels时不参与划分。
options.shuffle = true;            % 训练阶段每轮打乱训练批次。
options.seed = 42;                 % 固定初始化和批次随机性。

%% 3. CNN-RNN 网络结构
options.networkType = 'LSTM';      % 使用LSTM汇总动作前后变化。
options.convChannels = [32, 64];   % 两层CNN依次提取局部动作模式。
options.kernelSize = 5;            % 一次观察相邻5个采样点。
options.poolSize = 2;              % 将128个时间点压缩为64步。
options.rnnHidden = 64;            % LSTM隐藏单元数。
options.dropout = 0.20;            % 分类头前随机失活20%。

%% 4. 训练参数
options.solverName = 'adam';       % 使用Adam优化器。
options.maxEpochs = 30;            % 试用版最多30轮。
options.learnRate = 0.001;         % 初始学习率。
options.batchSize = 16;            % 试用数据较少，每批16条保证每轮多次更新。
options.earlyStoppingPatience = 8; % 验证损失连续8次不改善则停止。
options.learnRateSchedule = 'piecewise'; % 分段降低后期学习率。
options.learnRateDropPeriod = 15;  % 每15轮衰减一次。
options.learnRateDropFactor = 0.5; % 学习率衰减为原来的50%。
options.classWeight = 'auto';      % 自动处理训练集类别数量差异。
options.executionEnvironment = 'auto'; % 自动选择GPU或CPU。

%% 5. 数据处理与图像输出
options.mapflag = 'on';            % on标准化；只从训练受试者估计参数。
options.figflag = 'on';            % on生成并保存五张图，off关闭绘图。
options.showFigures = 'on';        % on本地运行时弹出图窗。
options.caseName = 'HAR人体活动';
options.classNames = {'行走','上楼','下楼','坐着','站立','躺着'};

%% 6. 核心函数入口与输出说明
% X：样本数×通道数×时间长度；Y：每条序列的活动类别。
% splitLabels：1训练、2验证、3测试；本案例按受试者隔离。
% options：控制序列轴、CNN-RNN结构、训练与绘图；试用版最多100条。
% foreData/foreDataTrain：测试/训练预测；net：训练网络；info包含三集合索引、
% 真实标签、验证预测、得分、Accuracy/Precision/Recall/F1、训练和归一化信息。
[foreData, foreDataTrain, net, info] = FunClassCNNRNN(X, Y, options);
