基于KAN神经网络的锂电池SOH估算模型(NASA数据集)【MATLAB】

基于KAN神经网络的锂电池SOH估算模型(NASA数据集)

摘要:健康状态(State of Health,SOH)是锂电池全生命周期管理的核心指标。本文提出一种基于柯尔莫哥洛夫-阿诺德网络(Kolmogorov-Arnold Network,KAN)的锂电池SOH估算方法,以NASA电池老化数据集(B0005)为研究对象,通过多项式样条函数逼近非线性映射关系,结合L1/L2正则化与拟牛顿优化算法,实现对电池SOH的高精度估计。文章将从数据处理、网络架构到训练细节进行完整的代码级讲解。


目录

  1. 研究背景与意义
  2. KAN网络原理
  3. NASA电池数据集介绍
  4. 数据预处理流程
  5. KAN网络架构设计
  6. 前向传播实现
  7. 损失函数与正则化
  8. 模型训练策略
  9. 评价指标体系
  10. 可视化分析
  11. 完整参数配置总览
  12. 总结与展望

研究背景与意义

锂离子电池在新能源汽车、储能电站、消费电子等领域得到广泛应用。随着充放电循环次数增加,电池容量逐渐衰减,SOH(State of Health) 定义为:

SOH = C 现有容量 C 额定容量 × 100 % \text{SOH} = \frac{C_{\text{现有容量}}}{C_{\text{额定容量}}} \times 100\% SOH=C额定容量C现有容量×100%

准确估算SOH是实现电池管理系统(BMS)精细化运营的前提,也是预测剩余寿命(RUL)的基础。

传统方法的局限性

方法类别 代表算法 主要缺点
基于模型 等效电路模型、电化学模型 参数辨识困难,计算量大,泛化性弱
基于滤波器 EKF、UKF、PF 依赖精确模型,噪声协方差难以标定
传统机器学习 SVM、GPR、RF 特征工程依赖人工经验,难以捕捉长程时序依赖
深度学习 LSTM、CNN、TCN 黑盒特性强,可解释性差,训练数据需求量大
KAN 本文方法 可解释性强,参数效率高,非线性逼近能力突出

KAN网络作为2024年提出的新型神经网络架构,以其边上可学习激活函数的特性,在小样本科学计算场景中展现出优异性能,尤其适合电池SOH这类具有物理规律约束的回归任务。


KAN网络原理

柯尔莫哥洛夫-阿诺德表示定理

KAN的理论基础是柯尔莫哥洛夫-阿诺德(KA)表示定理

任意连续多元函数 f : [ 0 , 1 ] n → R f: [0,1]^n \to \mathbb{R} f:[0,1]n→R 均可表示为:

f ( x 1 , x 2 , ... , x n ) = ∑ q = 0 2 n Φ q ( ∑ p = 1 n ϕ q , p ( x p ) ) f(x_1, x_2, \ldots, x_n) = \sum_{q=0}^{2n} \Phi_q \left( \sum_{p=1}^{n} \phi_{q,p}(x_p) \right) f(x1,x2,...,xn)=q=0∑2nΦq(p=1∑nϕq,p(xp))

其中:

  • ϕ q , p : [ 0 , 1 ] → R \phi_{q,p}: [0,1] \to \mathbb{R} ϕq,p:[0,1]→R 为内层单变量函数(边函数)
  • Φ q : R → R \Phi_q: \mathbb{R} \to \mathbb{R} Φq:R→R 为外层单变量函数

KAN与MLP的本质区别

对比维度 MLP(传统神经网络) KAN
激活函数位置 节点上(固定函数) 上(可学习函数)
权重角色 线性变换系数 无固定权重,函数本身即参数
非线性来源 固定的ReLU/Sigmoid 可训练的样条/多项式函数
可解释性 低(权重无直观含义) (每条边的函数可直接可视化)
参数效率 相对低 相对高(对平滑函数逼近效率更优)

本文实现的简化KAN

考虑到MATLAB实现的工程可行性,本文采用多项式基函数替代标准KAN中的B样条,构建如下两层结构:

复制代码
输入层 x ∈ R^{input_dim}
    ↓  φ_{q,p}(x_p):多项式逼近,阶数 poly_order=4
中间层 h ∈ R^{hidden_dim}  (hidden_dim=8)
    ↓  Ψ_q(h_q):多项式逼近,阶数 poly_order=4
输出层 y ∈ R^1  (SOH预测值)

NASA电池数据集介绍

数据集来源

本文使用 NASA Ames Prognostics Center of Excellence(PCoE) 公开发布的电池老化实验数据集,文件名 HF_B0005.xlsx 对应 B0005号电池(额定容量2 Ah,18650型)。

实验条件

参数
电池型号 18650锂离子电池
额定容量 2 Ah
充电制度 CC-CV(1.5A恒流充至4.2V,再恒压至20mA)
放电制度 2A恒流放电至2.7V
实验温度 室温(约24°C)
循环次数 约168次(至容量衰减至额定值的70%)

特征工程

数据文件中每一行代表一次充放电循环,特征列(前 input_dim 列)通常包含从充放电曲线中提取的健康特征因子(Health Indicators, HIs) ,最后一列为对应的 SOH 标签值。常见健康特征包括:

  • 恒流充电阶段时长
  • 恒压充电阶段电荷量
  • 放电结束电压
  • 充电初始电压
  • 放电容量(直接指标)
  • 充电电压曲线面积

数据预处理流程

顺序划分策略

与分类任务随机划分不同,电池SOH估算属于时序退化预测,必须保持时间顺序------前70%循环作训练集,后30%循环作测试集:

matlab 复制代码
num_train = round(num_samples * 0.7);   % 前70%
trainInd = 1:num_train;                  % 时序不可打乱!
testInd  = (num_train + 1):num_samples;

⚠️ 为何不能随机划分? 若随机划分,测试集中的"未来"数据会在训练集中出现,导致数据泄露(Data Leakage),评估结果虚高,不具工程参考价值。

归一化处理

将输入特征和输出标签均归一化到 [0, 1] 区间(而非[-1,1]),更适合多项式基函数的数值稳定性:

matlab 复制代码
[p_train, ps_input]  = mapminmax(X_train, 0, 1);
[t_train, ps_output] = mapminmax(Y_train, 0, 1);

% 测试集严格复用训练集的归一化参数
p_test = mapminmax('apply', X_test, ps_input);
t_test = mapminmax('apply', Y_test, ps_output);

归一化后需将矩阵转置为 样本×特征 的行优先格式,以配合 forward_KAN 函数的输入约定:

matlab 复制代码
p_train = p_train';   % [n_train × input_dim]
t_train = t_train';   % [n_train × 1]

KAN网络架构设计

参数规模计算

KAN模型的全部可学习参数被展平为一维向量 theta,其总长度为:

复制代码
φ 参数量(第一层)= input_dim × hidden_dim × poly_order
Ψ 参数量(第二层)= hidden_dim × poly_order

total = phi_size + psi_size

以本文配置为例(input_dim 取决于数据,hidden_dim=8, poly_order=4):

θ 总长 = d × 8 × 4 ⏟ ϕ + 8 × 4 ⏟ Ψ = 32 d + 32 \theta_{\text{总长}} = \underbrace{d \times 8 \times 4}{\phi} + \underbrace{8 \times 4}{\Psi} = 32d + 32 θ总长=ϕ d×8×4+Ψ 8×4=32d+32

与同等规模MLP(约 d × 8 + 8 × 1 = 8 d + 8 d \times 8 + 8 \times 1 = 8d + 8 d×8+8×1=8d+8 参数)相比,KAN因每条边需要存储整个多项式系数,参数量更多,但表达能力更强。

参数初始化

matlab 复制代码
theta = 0.01 * (2*rand(theta_len, 1) - 1);  % 均匀分布在 [-0.01, 0.01]

采用小幅度随机初始化,防止多项式高阶项在初始阶段产生数值爆炸,是保证训练稳定的关键。


前向传播实现

第一层:φ 映射(输入→隐藏)

对每个隐藏单元 q q q 和每个输入特征 p p p,计算多项式函数值并累加:

h q = ∑ p = 1 d ϕ q , p ( x p ) , ϕ q , p ( x ) = ∑ k = 1 K c k ⋅ x K − k h_q = \sum_{p=1}^{d} \phi_{q,p}(x_p), \quad \phi_{q,p}(x) = \sum_{k=1}^{K} c_k \cdot x^{K-k} hq=p=1∑dϕq,p(xp),ϕq,p(x)=k=1∑Kck⋅xK−k

多项式项矩阵结构 (以 poly_order=4 为例):

P = [ x 1 3 x 1 2 x 1 1 x 2 3 x 2 2 x 2 1 ⋮ ⋮ ⋮ ⋮ x N 3 x N 2 x N 1 ] N × K \mathbf{P} = \begin{bmatrix} x_1^3 & x_1^2 & x_1 & 1 \\ x_2^3 & x_2^2 & x_2 & 1 \\ \vdots & \vdots & \vdots & \vdots \\ x_N^3 & x_N^2 & x_N & 1 \end{bmatrix}_{N \times K} P= x13x23⋮xN3x12x22⋮xN2x1x2⋮xN11⋮1 N×K

矩阵乘法 P ⋅ c \mathbf{P} \cdot \mathbf{c} P⋅c 即为对所有样本同时计算多项式值,比逐样本循环效率高出数十倍。

第二层:Ψ 映射(隐藏→输出)

结构与第一层完全对称,以中间层激活 h q h_q hq 为输入,输出累加得到最终预测:

y ^ = ∑ q = 1 H Ψ q ( h q ) \hat{y} = \sum_{q=1}^{H} \Psi_q(h_q) y^=q=1∑HΨq(hq)

损失函数与正则化

复合损失函数

本模型采用 MSE + L2 + L1 三项复合损失:

L ( θ ) = 1 N ∑ i = 1 N ( y ^ i − y i ) 2 ⏟ MSE拟合损失 + λ ∥ θ ∥ 2 2 ⏟ L2正则 + α ∥ θ ∥ 1 ⏟ L1正则 \mathcal{L}(\theta) = \underbrace{\frac{1}{N}\sum_{i=1}^{N}(\hat{y}i - y_i)^2}{\text{MSE拟合损失}} + \underbrace{\lambda \|\theta\|2^2}{\text{L2正则}} + \underbrace{\alpha \|\theta\|1}{\text{L1正则}} L(θ)=MSE拟合损失 N1i=1∑N(y^i−yi)2+L2正则 λ∥θ∥22+L1正则 α∥θ∥1

matlab 复制代码
mse_loss = mean((predictions - Y).^2);
l2_reg   = lambda * sum(theta.^2);     % lambda = 1e-4
l1_reg   = alpha  * sum(abs(theta));   % alpha  = 1e-2
loss = mse_loss + l2_reg + l1_reg;

两种正则化的作用对比

正则化类型 系数 数学形式 主要作用 对多项式系数的效果
L2(岭回归) λ=1e-4 λ ∣ θ ∣ 2 2 \lambda|\theta|_2^2 λ∣θ∣22 防止参数过大,平滑模型 所有系数均匀缩小,抑制振荡
L1(Lasso) α=1e-3 α ∣ θ ∣ 1 \alpha|\theta|_1 α∣θ∣1 产生稀疏解,自动特征选择 低重要性边的系数趋于精确0

两者结合(类似Elastic Net)兼顾平滑性与稀疏性,对于电池SOH这种特征间存在物理相关性的场景尤为重要:L1会自动"剪枝"冗余的多项式边,而L2防止保留边的系数过度放大。

维度安全处理

损失函数中包含多处维度检查,解决MATLAB中行/列向量不一致的常见问题:

matlab 复制代码
% 确保预测值与标签维度一致
if size(Y, 1) ~= size(forward_fn(theta, X), 1)
    Y = Y';
end
if size(predictions, 2) > size(predictions, 1)
    predictions = predictions';
end

模型训练策略

优化算法:拟牛顿法(L-BFGS)

选择 quasi-newton(即L-BFGS变体)而非梯度下降的原因:

对比项 梯度下降(SGD/Adam) 拟牛顿法(L-BFGS)
收敛速度 慢(一阶方法) (近似二阶方法)
超参数 需调学习率 无需学习率,自动线搜索
内存占用 中等(存储Hessian近似)
适用数据量 大规模(数万样本以上) 中小规模(电池数据典型场景)
对损失面的要求 宽松 需损失函数较平滑

NASA B0005数据集样本量约168条,属于典型的小样本科学计算场景,拟牛顿法在此类问题上收敛速度远优于SGD类方法。

模型持久化

训练完成后保存模型参数,支持 TYPE=0 直接加载预训练模型进行推断,无需重新训练:

matlab 复制代码
% 保存
save('KAN_model.mat', 'theta_opt', 'input_dim', 'hidden_dim', ...
     'poly_order', 'ps_input', 'ps_output');

% 加载(TYPE=0时)
load('KAN_model.mat', 'theta_opt', ...);

工程实践提示 :归一化参数(ps_input, ps_output)必须随模型权重一同保存,否则加载后预测时的反归一化将产生错误结果。


评价指标体系

模型从四个维度对预测结果进行定量评估:

指标定义

MAE = 1 N ∑ i = 1 N ∣ y i − y ^ i ∣ \text{MAE} = \frac{1}{N}\sum_{i=1}^{N}|y_i - \hat{y}_i| MAE=N1i=1∑N∣yi−y^i∣

RMSE = 1 N ∑ i = 1 N ( y i − y ^ i ) 2 \text{RMSE} = \sqrt{\frac{1}{N}\sum_{i=1}^{N}(y_i - \hat{y}_i)^2} RMSE=N1i=1∑N(yi−y^i)2

MAPE = 1 N ∑ i = 1 N ∣ y i − y ^ i ∣ ∣ y i ∣ × 100 % \text{MAPE} = \frac{1}{N}\sum_{i=1}^{N}\frac{|y_i - \hat{y}_i|}{|y_i|} \times 100\% MAPE=N1i=1∑N∣yi∣∣yi−y^i∣×100%

R 2 = 1 − ∑ i = 1 N ( y i − y ^ i ) 2 ∑ i = 1 N ( y i − y ˉ ) 2 R^2 = 1 - \frac{\sum_{i=1}^{N}(y_i - \hat{y}i)^2}{\sum{i=1}^{N}(y_i - \bar{y})^2} R2=1−∑i=1N(yi−yˉ)2∑i=1N(yi−y^i)2

matlab 复制代码
function [mae, mse, rmse, mape, R2] = calc_error(Y_real, Y_pred)
    error     = Y_real - Y_pred;
    abs_error = abs(error);
    rel_error = abs_error ./ abs(Y_real);
    rel_error(~isfinite(rel_error)) = 0;   % 防止零值除法

    mae  = mean(abs_error);
    mse  = mean(error.^2);
    rmse = sqrt(mse);
    mape = mean(rel_error) * 100;

    SS_res = sum(error.^2);
    SS_tot = sum((Y_real - mean(Y_real)).^2);
    R2 = 1 - (SS_res / SS_tot);
end

各指标的解读方向

指标 理想值 特点 在SOH估算中的意义
MAE → 0 对异常值不敏感,反映平均偏差 直接体现SOH估计误差的工程量级(如±1%)
RMSE → 0 对大误差惩罚强,反映误差波动 衡量最坏情况下的预测质量
MAPE → 0% 相对误差,跨尺度可比 评估SOH从高到低不同阶段的预测一致性
→ 1 衡量预测值对实际退化趋势的解释程度 R²>0.99 才具备工程实用价值

可视化分析

代码生成四幅图形,从不同角度全面评估模型性能:

图1:预测结果对比曲线


关注点:预测曲线是否紧密跟随实际SOH退化趋势;在容量突降("拐点")附近的跟踪能力。

图2:逐样本预测误差

关注点:误差是否随循环次数增加呈现系统性漂移(趋势性误差暗示模型在测试集末段外推能力不足)。

图3:残差分布直方图

关注点:残差是否近似正态分布且均值为0(符合无偏估计假设);是否存在重尾(偶发大误差)。

图4:预测值与实际值回归图

关注点:散点是否紧密分布在对角线(y=x)附近;偏离方向可判断模型是否系统性高估或低估SOH。


完整参数配置总览

matlab 复制代码
%% ====== 超参数配置汇总 ======
TYPE        = 1;        % 1=重新训练,0=加载预训练
train_ratio = 0.70;     % 训练集比例(前70%循环)
test_ratio  = 0.30;     % 测试集比例(后30%循环)
hidden_dim  = 8;        % KAN隐藏单元数(H)
poly_order  = 4;        % 多项式阶数(K,范围2-8)
lambda      = 1e-4;     % L2正则化系数
alpha       = 1e-3;     % L1正则化系数
max_iter    = 100;      % 最大迭代次数

超参数敏感性分析

超参数 增大的影响 减小的影响 建议范围
hidden_dim 表达能力增强,训练变慢,过拟合风险增加 欠拟合,模型简单 4 ~ 16
poly_order 逼近复杂函数能力增强,数值不稳定风险增加 仅能拟合低阶关系 2 ~ 6
lambda(L2) 模型更平滑,可能欠拟合 过拟合风险增加 1e-5 ~ 1e-3
alpha(L1) 模型更稀疏,自动剪枝 保留更多边 1e-3 ~ 1e-1
max_iter 拟合更充分,训练时间增加 可能训练不充分 50 ~ 500

总结与展望

本文小结

本文实现了一套完整的基于KAN的锂电池SOH估算流程:

  1. 数据层:时序顺序划分(70/30),[0,1] 归一化,防止数据泄露
  2. 模型层:两层多项式KAN,参数向量化存储,支持保存/加载
  3. 训练层 :MSE + L1 + L2复合损失,拟牛顿法优化,max_iter=100
  4. 评估层:MAE / RMSE / MAPE / R² 四维指标,四类可视化图表

与主流方法的对比优势

对比维度 LSTM CNN-LSTM KAN(本文)
可解释性 (每条边可视化)
小样本性能 一般(需大量数据) 一般 (参数效率高)
训练收敛速度 慢(需大量epoch) 中等 (拟牛顿二阶收敛)
特征选择能力 局部感受野 自动(L1稀疏化边)

潜在改进方向

方向 说明
B样条替代多项式 将多项式基函数替换为标准KAN的B样条,提升对局部非线性的逼近精度
多电池迁移学习 在B0005基础上预训练,迁移到B0006/B0007,验证跨电池泛化能力
时序特征融合 引入滑动窗口,将历史多步SOH序列作为额外输入特征
不确定性量化 结合MC Dropout或Ensemble方法,输出SOH估计的置信区间
在线更新机制 设计增量学习策略,随电池服役过程中持续更新模型参数

📌 运行说明

  • 数据文件 HF_B0005.xlsx 需与脚本置于同一目录下,最后一列为SOH标签,其余列为健康特征
  • 首次运行设置 TYPE=1 训练并保存模型;后续推断设置 TYPE=0 直接加载 KAN_model.mat
  • MATLAB版本建议 R2021b 及以上(fminuncquasi-newton 算法在旧版本中行为有差异)

代码下载

https://mbd.pub/o/bread/mbd-YZWcl5dxbQ==

相关推荐
wayz114 小时前
Day 5:KNN算法与相似K线匹配
人工智能·算法·机器学习
简简单单做算法4 小时前
基于PSO粒子群优化的Transformer-BiLSTM网络模型的时间序列预测算法matlab性能仿真
matlab·transformer·时间序列预测·bilstm·pso粒子群优化
ueotek4 小时前
Ansys Zemax | 在 MATLAB 或 Python 中使用 ZOS-API 进行光线追迹的批次处理
python·matlab·ansys·zemax·光学软件
全栈开发圈4 小时前
新书速览|MATLAB数据分析与可视化实践:视频教学版
开发语言·matlab·数据分析
志栋智能4 小时前
当巡检遇上超自动化:一场运维质量的系统性升级
运维·服务器·网络·数据库·人工智能·机器学习·自动化
爱代码的小黄人5 小时前
MATLAB中for循环实现递减遍历(通用方法)
开发语言·matlab
AI自动化工坊5 小时前
Caveman技能实战:优化AI对话风格实现65%的token成本节省
人工智能·深度学习·机器学习·ai·token·caveman
Evand J5 小时前
【MATLAB代码介绍】使用EKF融合惯导和DVL(速度)的MATLAB仿真例程
matlab·ekf·滤波·定位·导航·卡尔曼滤波·非线性滤波
南宫萧幕5 小时前
自动控制原理|稳定性与劳斯判据 知识点+计算题+MATLAB实现全套笔记
笔记·matlab·控制