主要内容

从初始运行数据预测电池循环寿命

这个例子展示了如何使用线性回归(一种有监督的机器学习算法)预测快速充电锂离子电池的剩余周期寿命。使用基于物理建模的方法预测锂离子电池的循环寿命是非常复杂的,因为即使是来自同一家制造商的电池,其运行条件和设备的可变性也是不同的。对于这种情况,当有足够的测试数据可用时,基于机器学习的方法提供了很好的结果。在电池寿命的早期阶段,精确的电池循环寿命预测将有助于快速验证新的制造工艺。它还允许终端用户识别性能恶化,并有足够的时间更换故障电池。为此,仅考虑前100个周期的特征来预测剩余周期寿命,预测误差约为10%[1]。

数据集

该数据集包含124个标称容量为1.1 Ah、标称电压为3.3 V的锂离子电池在不同充放电情况下的测量数据。完整的数据集可以在这里访问[2],详细描述在这里[1]。对于这个例子,数据被整理成只包含与被提取的特征相关的测量的子集。这减少了下载的大小,而不改变机器学习模型的性能。训练数据包含41个单元格的测量,验证数据包含43个单元格的测量,测试数据包含40个单元格的测量。每个单元的数据存储在一个结构中,该结构包括以下信息:

  • 描述数据:电池条码,充电策略,周期

  • 每循环汇总数据:循环次数,放电容量,内阻,充电时间

  • 在一个周期内收集的数据:时间,温度,线性插值放电容量,线性插值电压

从MathWorks supportfiles站点加载数据(这是一金宝app个大数据集,约1.7GB)。

url =“https://ssd.mathworks.com/金宝appsupportfiles/predmaint/batterycyclelifeprediction/v1/batteryDischargeData.zip”;websave (“batteryDischargeData.zip”url);解压缩(“batteryDischargeData.zip”)负载('batterydischargedata');

特征提取

放电容量是反映电池健康状况的关键特性,其值是电动汽车行驶里程的指标。在训练数据中绘制前1000个细胞周期的放电容量图,以可视化其在细胞生命周期中的变化。

图,;i = 1:尺寸(trainData, 2)如果numel(traindata(i).summary.cycle)== numel(唯一(traindata(i).summary.cycle))图(TrainData(i).summary.cycle,traindata(i).summary.qdischarge);结束结束ylim ([0.85, 1.1]), xlim ([0, 1000]);ylabel ('放电容量(啊)');包含(“循环”);

从情节中可以看出,在生命接近尾声时,容量衰减加速。然而,容量衰减在前100次循环中是可以忽略不计的,它本身并不是一个很好的电池循环寿命预测功能。因此,考虑每个周期电压曲线的数据驱动方法,以及额外的测量,包括电池内阻和温度,用于预测剩余周期寿命。Q(V)的循环演化是一个重要的特征空间[1],Q(V)是放电电压曲线在给定周期内随电压变化的函数。特别地,放电电压在周期之间的变化曲线, Δ V ,是非常有效的退化诊断。因此,在第100 ~ 10个周期内,选择放电容量差作为电压的函数, Δ 1 0 0 - 1 0 V

图,;i = 1:size(testData,2) plot((testData(i).cycles(100))。问dlin - testData(i).cycles(10).Qdlin), testData(i).Vdlin)结束ylabel ('电压(v)');包含('Q_{100} - Q_{10} (Ah)');

使用以下方法计算汇总统计信息 Δ 1 0 0 - 1 0 V 每个单元的曲线作为条件指示器。重要的是要记住,这些概要统计数据不需要具有明确的物理意义,他们只需要表现出预测能力。例如,方差 Δ 1 0 0 - 1 0 V 并且循环寿命高度相关,如此日志绘图中所示,从而确认这种方法。

图;trainDataSize =大小(trainData, 2);cycleLife = 0 (trainDataSize, 1);DeltaQ_var = 0 (trainDataSize, 1);i = 1:trainDataSize cycleLife(i) = size(trainData(i).cycles,2) + 1;DeltaQ_var (i) = var (trainData (i) .cycles(100)。Qdlin trainData (i) .cycles (10) .Qdlin);结束重对数(DeltaQ_var cycleLife,'o')ylabel('循环生活');包含('Var(Q_{100} - Q_{10}) (Ah^2)');

接下来,从原始测量数据中提取以下特征(变量名在括号中)[1]:

  • Δ 1 0 0 - 1 0 V 日志方差(DeltaQ_var)

  • Δ 1 0 0 - 1 0 V 最小日志(DeltaQ_min)

  • 容量衰减曲线线性拟合斜率,周期2至100 [CapFadeCycle2Slope]

  • 容量衰减曲线线性拟合的截距,周期2到100 [CapFadeCycle2Intercept]

  • 循环2的放电容量[Qd2]

  • 前5个周期平均充电时间[AvgChargeTime]

  • 最小内阻,循环2至100 [minir]

  • 周期2和100之间的内阻差[IRDiff2And100]

helperGetFeatures函数接受原始测量数据并计算上述特征。它返回XTrain在表和中包含特性yTrain包含预期的剩余循环寿命。

[XTrain, yTrain] = helperGetFeatures (trainData);头(XTrain)
ans =8×8表DeltaQ_var DeltaQ_min CapFadeCycle2Slope CapFadeCycle2Intercept Qd2 AvgChargeTime MinIR IRDiff2And100  __________ __________ __________________ ______________________ ______ _____________ ________ _____________ - 1.0809 1.0753 13.409 0.016764 -3.3898 5.0839 -1.9638 6.4708 e-06 e-05 e-05 -4.3754 -1.6928 1.6313 1.0841 1.0797 12.025 0.016098 - 4.4186 e-050.015923 -0.00012443 -3.8068 -1.4216 -8.491e-06 1.0974 1.0939 10.025 0.016083 -3.7309e-05 -4.1181 -1.6089 2.2859e-05 1.0589 1.0538 11.669 0.016963 -0.00030445 -4.0225 -1.5407 1.5969e -05 1.0664 1.0611-1.3383 -1.0356e-05 1.0889 1.0851 9.9247 0.016205

模型开发:带弹性网正则化的线性回归

使用正则化线性模型来预测细胞的剩余周期寿命。线性模型计算成本低,但可解释性高。线性模型的形式为:

y w T x + β

在哪里 y 是细胞的周期数吗 x 是一个 p 单元格的维特征向量 w p -维模型系数矢量和 β 是标量拦截。使用弹性网进行线性模型,以解决特征之间的高相关性。为了 α. 严格在0和1之间,且非负 λ. ,正则化系数,弹性网解决了问题:

w ˆ 最小值 w y - X w - β 2 2 + λ. P α. w

在哪里 P α. w 1 - α. 2 w 2 2 + α. w 1 .弹性网岭回归方法 α. 接近于0,这是相同的套索正则化什么时候 α. 1 .培训数据用于选择Quand参数 α. λ. ,并确定系数的值, w .的套索函数返回拟合的最小二乘回归系数和关于模型的拟合信息作为每个输出 α. λ. 价值。的套索函数接受值为的向量 λ. 参数。因此,对于每个值 α. ,模型系数 w λ. 计算出最小均方根误差值。如[1]所提议的,使用带有1个蒙特卡罗重复的四次交叉验证进行交叉验证。

RNG(“默认”) alphaVec = 0.01:0.1:1;lambdaVec = 0:0.01:1;MCReps = 1;cvFold = 4;rmseList = 0(长度(alphaVec), 1);minLambdaMSE = 0(长度(alphaVec), 1);wModelList =细胞(1、长度(alphaVec));betaVec =细胞(1、长度(alphaVec));i = 1:长度(alphavec)[系数,fitinfo] =...套索(XTrain。Variables,yTrain,'Α'alphaVec(我),“简历”cvFold,“MCReps”MCReps,“λ”, lambdaVec);wModelList{我}=系数(:,fitInfo.IndexMinMSE);betaVec{我}= fitInfo.Intercept (fitInfo.IndexMinMSE);indexMinMSE = fitInfo.IndexMinMSE;rmseList (i) =√fitInfo.MSE (indexMinMSE));minLambdaMSE (i) = fitInfo.LambdaMinMSE;结束

为使拟合模型稳健,使用验证数据选择的最终值 α. λ. 封锁。为此,选择与使用训练数据计算的四个最低RMSE值相对应的系数。

numVal = 4;[, idx] =排序(rmseList);val = (1: numVal);指数= idx (1: numVal);α= alphaVec(指数);λ= minLambdaMSE(指数);wModel = wModelList(指数);β= betaVec(指数);

对于每组系数,计算预测值和验证数据的RMSE。

[XVal, yVal] = helperGetFeatures (valData);rmseValModel = 0 (numVal);valList = 1:numVal yPredVal =Variables*wModel{valList} + beta{valList}); rmseValModel(valList) = sqrt(mean((yPredVal-yVal).^2));结束

使用验证数据时选择具有最少的RMSE的模型。与训练数据的最低RMSE值相关的模型不是对应于验证数据的最低RMSE值的模型。使用验证数据,从而提高了模型的鲁棒性。

[rmseminval,Idx] = min(RmsevalModel);wmodelfinal = wmodel {idx};betafinal = beta {idx};

训练模型的绩效评估

测试数据包含40个单元格对应的测量值。提取特征和对应的响应testData.利用训练后的模型预测每个细胞的剩余周期寿命testData

[XTest,欧美]= helperGetFeatures (testData);yPredTest = (XTest。Variables*wModelFinal + betaFinal);

可视化测试数据的预测与实际周期寿命图。

图;yPredTest散射(欧美);refline (1,0);标题(“预测与实际循环寿命”)ylabel(循环寿命预测的);包含(实际的循环寿命的);

理想情况下,上图中的所有点都应该靠近对角线。从上图可以看出,当剩余周期寿命在500到1200个周期之间时,经过训练的模型表现良好。超过1200个循环,模型性能下降。该模型一直低估了该地区剩余的循环寿命。这主要是因为测试和验证数据集包含更多的细胞,总寿命约为1000个周期。

计算预测的剩余循环寿命的RMSE。

errTest = (yPredTest-yTest);rmseTestModel =√意味着(errTest ^ 2))
rmseTestModel = 211.6148

另一个考虑的性能评估指标是将[1]定义为的平均误差百分比

e r r 1 n Σ 1 n | y - y ˆ | y × 1 0 0

n =元素个数(欧美);nr = abs(yTest - yPredTest);errVal = (1 / n) * (nr. /次)* 100和
errVal = 9.9817

结论

这个例子展示了如何使用一个线性回归模型与弹性网正则化的电池循环寿命预测基于测量仅从前100次循环。从原始测量数据中提取自定义特征,并利用训练数据拟合弹性网正则化线性回归模型。然后使用验证数据集选择超参数。利用该模型对试验数据进行性能评价。仅使用前100个周期的测量数据,测试数据集中细胞剩余周期寿命预测的RMSE为211.6,平均百分比误差为9.98%。

参考

[1] Severson,K.A.,Attia,P.M.,Jin,N。et al。“容量下降前的数据驱动电池循环寿命预测。”NAT能量4,383 - 391(2019)。https://doi.org/10.1038/s41560-019-0356-8

[2]https://data.matr.io/1/

金宝app支持功能

函数[xtable,y] =螺杆特征(批量)HELPERGETFEATURES函数接受原始测量数据并进行计算%以下特点:% Q_{100-10}(V)方差[DeltaQ_var]% Q_{100-10}(V) minimum [DeltaQ_min]容量衰减曲线的线性拟合周期为2到100 [CapFadeCycle2Slope]容量衰减曲线线性拟合的截距,周期2到100 [CapFadeCycle2Intercept]%循环2时的放电容量[Qd2]%前5个周期的平均充电时间[AvgChargeTime]最小内阻,周期2至100 [MinIR]%周期2和100之间的内阻差[IRDiff2And100]n =大小(批量,2);电池数量%预分配变量y = 0 (N, 1);DeltaQ_var = 0 (N, 1);DeltaQ_min = 0 (N, 1);CapFadeCycle2Slope = 0 (N, 1);CapFadeCycle2Intercept = 0 (N, 1);Qd2 = 0 (N, 1);AvgChargeTime = 0 (N, 1);IntegralTemp = 0 (N, 1);MinIR = 0 (N, 1);IRDiff2And100 = 0 (N, 1);i = 1: N%循环寿命Y (i,1) = size(batch(i).cycles,2) + 1;%确定周期与时间间隔numCycles =大小(批处理(i)。周期,2);timeGapCycleIdx = [];jBadCycle = 0;jCycle = 2: numCycles dt = diff(batch(i).cycles(jCycle).t);如果max(dt) > 5*mean(dt) jBadCycle = jBadCycle + 1;timeGapCycleIdx (jBadCycle) = jCycle;结束结束%移除带有时间间隔的周期批处理(i) .cycles (timeGapCycleIdx) = [];批处理(i) .summary.QDischarge (timeGapCycleIdx) = [];批处理(i) .summary.IR (timeGapCycleIdx) = [];批处理(i) .summary.chargetime (timeGapCycleIdx) = [];%compute q_100_10 statsDeltaQ =批(i) .cycles(100)。问dlin - batch(i).cycles(10).Qdlin; DeltaQ_var(i) = log10(abs(var(DeltaQ))); DeltaQ_min(i) = log10(abs(min(DeltaQ)));从循环开始的能力衰减曲线的线性拟合斜率和截距% 2循环100coeff2 = polyfit(batch(i).summary.cycle(2:100), batch(i).summary.QDischarge(2:100),1);CapFadeCycle2Slope (i) = coeff2 (1);CapFadeCycle2Intercept (i) = coeff2 (2);%循环2放电容量Qd2 (i) =批(i) .summary.QDischarge (2);%前5个循环(2至6)的平均充电时间AvgChargeTime (i) =意味着(批处理(i) .summary.chargetime (2:6));从循环2到100的温度积分tempIntT = 0;jCycle = 2:100 tempIntT = tempIntT + trapz(batch(i).cycles(jCycle))。t,批处理(i) .cycles (jCycle) .T);结束IntegralTemp (i) = tempIntT;最小内阻,循环2到100temp =批(i) .summary.IR (2:10 0);MinIR (i) = min(临时(临时~ = 0));IRDiff2And100(i) = batch(i).summary.IR(100) - batch(i).summary.IR(2);结束xTable = table(var, min,...CapFadeCycle2Slope CapFadeCycle2Intercept,...Qd2, AvgChargeTime, MinIR, IRDiff2And100);结束

另请参阅

相关话题