主要内容

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

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

数据集

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

  • 描述性数据:电池条码,充电策略,循环寿命

  • 每周期汇总数据:周期数、放电容量、内阻、充电时间

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

从MathWorks支持文件站点加载数据(这是一个大数据集,约1.金宝app7GB)。

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

特征提取

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

图,i = 1:size(trainData,2)如果数字(trainData(i).summary.cycle) ==数字(唯一(trainData(i).summary.cycle)) plot(trainData(i).summary. cycle)。周期,trainData (i) .summary.QDischarge);结束结束ylim ([0.85, 1.1]), xlim ([0, 1000]);ylabel (“放电容量(啊)”);包含(“循环”);

正如在情节中所看到的,能力衰退在生命结束时加速。然而,容量衰减在前100次循环中可以忽略不计,这本身并不是一个很好的电池循环寿命预测特征。因此,考虑到每个周期的电压曲线,以及额外的测量,包括电池内阻和温度,可以考虑使用数据驱动的方法来预测剩余周期寿命。Q(V)的周期到周期演化,即放电电压曲线作为给定周期电压的函数,是一个重要的特征空间[1]。特别是放电电压曲线在循环之间的变化, Δ 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 = size(trainData,2);cycleLife = 0 (trainDataSize,1);DeltaQ_var = 0 (trainDataSize,1);1:trainDataSize cyclellife (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 log variance [DeltaQ_var]

  • Δ 1 0 0 - 1 0 V log minimum [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 -4.3754 -1.6928 1.6313 e-05 e-05 -4.1464 -1.5889 8.1708 1.0841 1.0797 12.025 0.016098 4.4186 e-06 e-06 1.08 1.0761 10.968 0.015923 -0.00012443 -3.8068 -1.4216 -8.491 1.0974 1.0939 10.025 0.016083 -3.7309 e-05 -4.1181 - -1.60892.2859e-05 1.0589 1.0538 11.669 0.015963 -0.00030445 -4.0225 -1.5407 2.5969e-05 1.0664 1.0611 10.798 0.016543 -0.00024655 -3.9697 -1.5077 1.7886e-05 1.0762 1.0721 10.147 0.016238 2.2163e-05 -3.6195 -1.3383 -1.0356e-05 1.0889 1.0851 9.9247 0.016205 -6.6087e-05

模型开发:弹性净正则化线性回归

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

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 .使用训练数据来选择超参数 α 而且 λ ,并确定系数的值, w .的套索函数返回拟合的最小二乘回归系数和关于模型拟合的信息作为每个输出 α 而且 λ 价值。的套索函数接受由值组成的向量 λ 参数。因此,对于的每一个值 α ,模型系数 w 而且 λ 计算得到最小RMSE值。如[1]中所建议的,使用4次交叉验证和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);wmodelist = cell(1,length(alphaVec));betaVec = cell(1,length(alphaVec));i=1:长度(alphaVec)[系数,fitInfo] =...套索(XTrain。Variables,yTrain,“α”alphaVec(我),“简历”cvFold,“MCReps”MCReps,“λ”, lambdaVec);wmodelist {i} = coefficients(:,fitInfo.IndexMinMSE);betaVec{i} = fitInfo.Intercept(fitInfo.IndexMinMSE);indexMinMSE = fitInfo.IndexMinMSE;rmseList(i) = sqrt(fitInfo.MSE(indexMinMSE));minLambdaMSE(i) = fitInfo.LambdaMinMSE;结束

为了使拟合模型具有鲁棒性,使用验证数据来选择的最终值 α 而且 λ hyperparameters。为此,选择对应于使用训练数据计算的四个最低RMSE值的系数。

numVal = 4;[out,idx] = sort(rmseList);val = out(1:numVal);索引= idx(1:numVal);alpha = alphaVec(指数);lambda = minLambdaMSE(索引);wModel = wmodelist (index);beta = betaVec(指数);

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

[XVal,yVal] = helperGetFeatures(valData);rmseValModel = 0 (numVal);valList = 1:numVal yPredVal = (XVal。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,yTest] = helperGetFeatures(testData);yPredTest = (XTest。Variables*wModelFinal + betaFinal);

可视化测试数据的预测和实际循环寿命图。

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

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

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

errTest = (yPredTest-yTest);rmseTestModel =√rt(mean(errTest.^2))
rmseTestModel = 211.6148

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

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

n = numel(yTest);nr = abs(yTest - yPredTest);errVal = (1/n)*sum(n ./yTest)*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(batch)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 = size(batch,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 = size(batch(i)。周期,2);timegpcycleidx = [];jBadCycle = 0;jCycle = 2: numCycles dt = diff(batch(i).cycles(jCycle).t);如果max(dt) > 5*mean(dt) jBadCycle = jBadCycle + 1;timeGapCycleIdx(jBadCycle) = jCycle;结束结束删除有时间间隔的循环batch(i).cycles(timeGapCycleIdx) = [];batch(i).summary.QDischarge(timeGapCycleIdx) = [];batch(i).summary.IR(timeGapCycleIdx) = [];batch(i).summary.chargetime(timeGapCycleIdx) = [];%计算Q_100_10个统计DeltaQ = batch(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) = mean(batch(i).summary.chargetime(2:6));%从循环2到100的温度积分tempIntT = 0;jCycle = 2:10 tempIntT = tempIntT + trapz(batch(i).cycles(jCycle))。t,批处理(i) .cycles (jCycle) .T);结束IntegralTemp(i) = tempIntT;最小内阻,循环2至100次temp = batch(i).summary.IR(2:100);MinIR(i) = min(temp(temp~=0));IRDiff2And100(i) = batch(i).summary.IR(100) - batch(i).summary.IR(2);结束xTable = table(DeltaQ_var, DeltaQ_min,...CapFadeCycle2Slope CapFadeCycle2Intercept,...Qd2, AvgChargeTime, MinIR, IRDiff2And100);结束

另请参阅

相关的话题