據(jù)集Matlab處理全流程)
簡介本資源面向鋰電池健康狀態(tài)分析、剩余使用壽命預(yù)測等研究方向的科研人員與工程技術(shù)人員提供一套基于NASA公開電池數(shù)據(jù)集的容量特征提取完整解決方案。資源包含Matlab可直接運行的主程序rongliangtiqu.m、4個原始.mat實驗數(shù)據(jù)文件對應(yīng)B0005/B0006/B0007/B0018四款電池及4個結(jié)構(gòu)化Excel數(shù)據(jù)表含電流、電壓、容量等關(guān)鍵時序字段共9個文件總大小53.94MB.mat文件用于原始信號讀取與預(yù)處理Excel文件便于可視化分析與特征驗證.m腳本封裝了循環(huán)對齊、容量計算、衰減趨勢提取等核心邏輯。已有599人學(xué)習(xí)下載代碼經(jīng)作者八年Matlab算法仿真經(jīng)驗打磨支持一鍵加載、分步調(diào)試與多電池對比分析顯著降低時序特征工程門檻。讀者可直接復(fù)現(xiàn)容量衰減曲線、提取充放電平臺差值、循環(huán)效率、內(nèi)阻相關(guān)間接指標(biāo)等關(guān)鍵特征為后續(xù)構(gòu)建RUL預(yù)測模型提供標(biāo)準(zhǔn)化輸入基礎(chǔ)。 拿到NASA這套鋰電池老化數(shù)據(jù)集之后我第一件事不是急著寫特征提取代碼而是先打開Matlab把里面的結(jié)構(gòu)體翻了個底朝天。這套數(shù)據(jù)在電池健康管理圈子里幾乎是普適教材級別的存在做電池容量估計、健康狀態(tài)SOH預(yù)測、剩余壽命RUL預(yù)測大量論文的對比實驗都拿它當(dāng)基準(zhǔn)。但數(shù)據(jù)公開不等于拿來就能用——.mat文件里的結(jié)構(gòu)體嵌套了好幾層充電、放電、阻抗測試三條記錄線混在一起容量要自己一條條提特征更要逐條從曲線里算。這篇就完整記錄一下我基于NASA數(shù)據(jù)集做容量特征提取的完整流程代碼全部可運行包含數(shù)據(jù)解析、容量序列提取、等壓降放電時間、充電階段特征、IC曲線特征到最后的特征矩陣組裝和可視化。適合正在做電池健康管理課題、寫畢業(yè)論文或者剛?cè)腴T電池數(shù)據(jù)分析想找個真實數(shù)據(jù)練手的朋友。1. 項目概述與數(shù)據(jù)集摸底1.1 這套數(shù)據(jù)能解決什么問題電池老化的核心問題是容量衰減。NASA PCoEPrognostics Center of Excellence公開的這套鋰電池數(shù)據(jù)記錄的是18650電芯在室溫下反復(fù)充放電循環(huán)的完整過程涵蓋了充電電壓/電流曲線、放電電壓/電流曲線、表面溫度曲線以及每次循環(huán)后測得的EIS阻抗數(shù)據(jù)。對研究來說這套數(shù)據(jù)的價值在于它是一個標(biāo)準(zhǔn)的鋰離子電池退化全生命周期記錄——從出廠狀態(tài)一直跑到容量跌到額定值的70%~80%左右退化趨勢完整、數(shù)據(jù)密度足夠、狀態(tài)定義清晰。這個數(shù)據(jù)集能做的事情非常多。最經(jīng)典的任務(wù)是容量預(yù)測用前N次循環(huán)的數(shù)據(jù)預(yù)測后面第M次循環(huán)的容量值本質(zhì)是一個時間序列外推問題。其次是RUL預(yù)測設(shè)定失效閾值比如容量低于額定容量的80%就算失效用退化模型推斷剩余循環(huán)次數(shù)。再往下走還能做充放電曲線形狀分析、內(nèi)阻增長估計、老化機理辨識等進(jìn)階研究。對做BMS電池管理系統(tǒng)、儲能系統(tǒng)運維、電動車電池健康管理的人而言這套數(shù)據(jù)是一個極佳的算法驗證平臺——反正真實車載電池數(shù)據(jù)拿不到NASA這套公開數(shù)據(jù)在圈子里就是通用的benchmark。現(xiàn)在很多人直接拿著已經(jīng)發(fā)布的論文代碼跑實驗但真到自己做特征工程時才發(fā)現(xiàn)數(shù)據(jù)處理這一步才是大頭。我個人的建議是不要一上來就想著上Transformer、上深度學(xué)習(xí)先用經(jīng)典的特征提取把數(shù)據(jù)結(jié)構(gòu)吃透后續(xù)換什么模型都不虛。1.2 NASA數(shù)據(jù)集的內(nèi)部結(jié)構(gòu)解剖下載下來的文件一般是B0005.mat、B0006.mat、B0007.mat、B0018.mat這四組官方文檔里對應(yīng)的是4節(jié)不同的18650電池。用load命令加載后工作區(qū)里的變量名通常是B這是一個結(jié)構(gòu)體數(shù)組長度基本在160~200之間每一條記錄對應(yīng)實驗過程中的一次“事件”。我第一次打開這個結(jié)構(gòu)體時第一反應(yīng)是有點懵——因為B(k)這個元素里面type字段的值是變化的有的為charge有的為discharge有的為impedance。也就是說這個結(jié)構(gòu)體數(shù)組不是按電池編號組織的而是按時間順序記錄的實驗事件流水賬。charge字段下有一堆子字段discharge字段下又有一堆子字段還有一部分事件只有type為charge或discharge才具備對應(yīng)子結(jié)構(gòu)。type字段的含義非常關(guān)鍵type類型含義核心子字段charge充電過程記錄voltage_measured, current_measured, temperature_measured, voltage_charge, current_charge, timedischarge放電過程記錄voltage_measured, current_measured, temperature_measured, current_load, voltage_load, time, capacityimpedance阻抗測量記錄sense_current, battery_impedance, rectified_impedance, re, rct注意一個細(xì)節(jié)每次完整循環(huán)都是由一次charge事件和一次discharge事件組成的charge和discharge的number字段標(biāo)記的是循環(huán)次數(shù)。所以B數(shù)組里相鄰兩個元素可能number相同但type不同提取特征時不能簡單按數(shù)組順序硬切要先按type過濾再按number對齊。這個結(jié)構(gòu)看起來簡單但實際處理時容易犯一個低級錯誤——直接遍歷所有元素然后假設(shè)每個元素都有discharge子字段。如果某次事件是impedance類型訪問B(k).discharge會直接報錯。所以遍歷時第一件事就是判斷type是否為discharge這也算是一道正兒八經(jīng)的數(shù)據(jù)預(yù)處理門檻。2. 容量特征提取的設(shè)計思路2.1 為什么不能只盯著容量很多人一看到“容量特征提取”這個標(biāo)題第一個反應(yīng)是容量不是現(xiàn)成的嗎discharge.capacity字段直接拿出來不就行了沒錯B0005等數(shù)據(jù)集的放電記錄里確實直接存了容量值單位是Ah這是通過安時積分算出來的實際放電容量。但這里有一個關(guān)鍵區(qū)別在真正的工程場景中你是無法實時獲得容量的——電動車在行駛中不可能為了測容量專門做一次完整放電循環(huán)BMS通常只能在線采集電壓、電流、溫度這些傳感器數(shù)據(jù)。容量是我們要預(yù)測的“標(biāo)簽”但特征提取的目標(biāo)是找到那些可以在線測量的、與容量高度相關(guān)的“替代指標(biāo)”。換句話說容量一次循環(huán)只能測到一次但電壓曲線、電流曲線、溫度曲線在整個循環(huán)過程中是連續(xù)記錄的從這些曲線里提取出的特征可以做到高頻采樣為后續(xù)模型提供多維度輸入。另外還有一個實際問題NASA數(shù)據(jù)里的capacity字段雖然可以直接讀但這個值本身存在測量噪聲而且如果數(shù)據(jù)版本不同、預(yù)處理方式不同容量序列不一定光滑。直接拿原始容量序列做訓(xùn)練模型很容易過擬合噪聲。通過提取等壓降時間、IC曲線峰值、充電階段時長等特征可以在一定程度上平滑掉瞬時測量誤差這也是特征工程的核心價值之一——對原始數(shù)據(jù)進(jìn)行壓縮清洗提煉出穩(wěn)定的健康指標(biāo)。2.2 常見特征提取路線對比鋰電池容量特征提取經(jīng)過這么多年發(fā)展基本形成了三條公認(rèn)的技術(shù)路線。第一條是“直接統(tǒng)計特征”就是從單次循環(huán)的原始曲線里直接計算出標(biāo)量值比如放電容量、放電中值電壓、溫度峰值、庫倫效率等。這個路線計算量小、可解釋性強但特征物理意義相對粗糙信息利用率不高。第二條是“曲線形態(tài)特征”也就是從充放電曲線的形態(tài)變化中提取特征。典型的代表是等壓降放電時間、恒流充電時間占比、電壓平臺寬度、ICIncremental Capacity曲線峰值位置和峰值高度等。這些特征對老化的物理響應(yīng)更敏感而且由于是對曲線整體形態(tài)做統(tǒng)計抗噪聲能力比直接讀數(shù)好很多。這是我個人最推薦優(yōu)先嘗試的路線。第三條是“模型驅(qū)動特征”比如通過等效電路模型在線辨識歐姆內(nèi)阻、極化內(nèi)阻、時間常數(shù)等參數(shù)然后用這些參數(shù)隨循環(huán)的變化趨勢來間接反映容量衰減。這條路線機理清晰但對建模能力和計算資源要求較高數(shù)據(jù)質(zhì)量不好時參數(shù)辨識結(jié)果容易發(fā)散。我的建議是把前兩條路線結(jié)合先用直接統(tǒng)計特征快速驗證數(shù)據(jù)質(zhì)量再上曲線形態(tài)特征來提高預(yù)測精度。下面這張表整理了常用的特征類別和它們各自的定位特征類別典型特征主要優(yōu)勢計算難度直接統(tǒng)計放電容量、中值電壓、溫度峰值簡單直觀、計算快低放電曲線形態(tài)等壓降放電時間、平臺電壓抗噪、與容量強相關(guān)低充電曲線形態(tài)CC時間、CV時間占比在線可測、物理含義清晰中增量容量分析IC峰值高度、峰值電壓機理信息豐富中高阻抗模型參數(shù)歐姆內(nèi)阻、Rct電荷轉(zhuǎn)移內(nèi)阻直接關(guān)聯(lián)老化機理高從實操經(jīng)驗看如果你做的是容量預(yù)測回歸任務(wù)等壓降放電時間和IC峰值往往是最先出效果的兩個特征。前者幾乎不用預(yù)處理就能拿到很高的相關(guān)性后者則需要仔細(xì)處理曲線平滑才能穩(wěn)定工作。3. Matlab完整實現(xiàn)流程3.1 數(shù)據(jù)加載與容量序列提取整個流程的第一步是把.mat文件里的數(shù)據(jù)轉(zhuǎn)換成我們需要的表格化數(shù)據(jù)。新建一個腳本先把文件加載進(jìn)來并查看變量信息。%% 1. 加載NASA電池老化數(shù)據(jù) % 文件需放在當(dāng)前目錄下從NASA PCoE公開數(shù)據(jù)倉庫下載 clear; clc; close all; load(B0005.mat); % 加載后的變量名為B是一個結(jié)構(gòu)體數(shù)組 fprintf(B數(shù)組長度%d\n, length(B));這里我可以多說一句Matlab老版本和R2020以后的版本在細(xì)節(jié)函數(shù)上有一些差異。整套代碼我盡量用基礎(chǔ)通用的寫法唯一需要注意的是smoothdata函數(shù)在R2017a之后才出現(xiàn)如果你手頭是比較老的版本需要手動寫一個滑動平均函數(shù)替換。接下來遍歷結(jié)構(gòu)體數(shù)組提取所有放電事件里的容量值。這里有一個關(guān)鍵點放電事件才能提取容量充電事件沒有capacity字段所以必須先判斷type。%% 2. 提取容量序列 cap_list []; % 容量序列 num_list []; % 循環(huán)編號 event_idx []; % 對應(yīng)事件索引 for k 1:length(B) if isfield(B(k), type) strcmp(B(k).type, discharge) cap_list(end1) B(k).discharge.capacity; %#okSAGROW num_list(end1) B(k).number; %#okSAGROW event_idx(end1) k; %#okSAGROW end end運行完這步cap_list就是一個行向量每個元素對應(yīng)一次放電循環(huán)的容量。num_list記錄的是對應(yīng)的循環(huán)編號。注意如果數(shù)據(jù)本身連續(xù)完整num_list應(yīng)該是從1開始每次加1的序列但不要想當(dāng)然——先打印出來看一眼再往后走這是最基本的習(xí)慣。我習(xí)慣打完數(shù)據(jù)后立刻畫一張容量衰減曲線確認(rèn)數(shù)據(jù)形態(tài)再繼續(xù)。這個步驟可以幫助快速發(fā)現(xiàn)數(shù)據(jù)有沒有跳變、異常點、缺數(shù)等問題。%% 3. 可視化容量衰減趨勢 figure(Name, Capacity Fade); plot(num_list, cap_list, .-, MarkerSize, 8); grid on; xlabel(Cycle Number); ylabel(Capacity (Ah)); title(B0005 放電容量老化曲線);正常情況應(yīng)該看到一條整體向下、略有波動的曲線。如果看到某幾個點突然跳到0.5Ah以下或者突變成幾倍那大概率是數(shù)據(jù)結(jié)構(gòu)理解錯了回頭檢查type判斷邏輯。3.2 放電等壓降時間特征提取直接取容量雖然方便但容量的測量依賴安時積分受電流傳感器漂移影響。等壓降放電時間這個特征思路是在放電過程中記錄電壓從同一個起始值降到同一個終止值所經(jīng)歷的時間。隨著電池老化電壓下降速度變快同樣的電壓區(qū)間放電所需時間變短這個時間序列與容量衰減有很強的相關(guān)性而且它對電流積分誤差不敏感是工程上非常實用的一個健康指標(biāo)。這里選取的電壓區(qū)間通常是放電平臺附近的區(qū)間比如4.0V到3.6V。對于B0005這樣的電池空電狀態(tài)在2.7V附近放電平臺在3.7V左右4.0V到3.6V正好覆蓋平臺區(qū)物理意義清晰。%% 4. 提取等壓降放電時間 v_high 4.0; % 起始電壓閾值 v_low 3.6; % 終止電壓閾值 eq_time_list nan(1, length(cap_list)); idx_out 1; for k 1:length(B) if ~(isfield(B(k), type) strcmp(B(k).type, discharge)) continue; end v B(k).discharge.voltage_measured; t B(k).discharge.time; % 找到電壓首次降到閾值以下的索引 i_high find(v v_high, 1, first); i_low find(v v_low, 1, first); if ~isempty(i_high) ~isempty(i_low) i_low i_high eq_time_list(idx_out) t(i_low) - t(i_high); end idx_out idx_out 1; end這段代碼里我特意加了幾個防御條件i_low大于i_high才計算因為如果電池已經(jīng)嚴(yán)重老化可能一開始放電電壓就低于v_high或者很快跌到v_low這時候計算出來的時間沒有意義。如果出現(xiàn)NaN后面的特征矩陣?yán)镆浀糜胒illmissing處理。從實測效果看B0005的等壓降時間序列與容量序列的相關(guān)系數(shù)通常能到0.99以上這已經(jīng)是相當(dāng)強的線性關(guān)系。這也是為什么很多論文里直接拿這個特征做一維回歸就能得到不錯的容量預(yù)測結(jié)果。3.3 充電過程特征提取充電過程同樣包含大量老化信息。NASA數(shù)據(jù)集的充電協(xié)議是恒流恒壓模式先用恒定電流充到截止電壓通常是4.2V然后轉(zhuǎn)為恒壓充電電流逐漸減小直到截止電流。隨著電池老化恒流充電階段占整個充電過程的比例會縮小恒壓充電階段的比例會擴大。這個變化本質(zhì)上反映了電池極化阻抗的增長。提取充電的恒流階段時間邏輯是找電流開始明顯下降的時間點。代碼如下%% 5. 提取恒流充電時間CC cc_time_list nan(1, length(cap_list)); idx_out 1; for k 1:length(B) if ~(isfield(B(k), type) strcmp(B(k).type, charge)) continue; end i_charge B(k).charge.current_measured; t_charge B(k).charge.time; if length(i_charge) 5 idx_out idx_out 1; continue; end % 取電流絕對值的最大值 i_max max(abs(i_charge)); % 電流降到峰值的90%以下認(rèn)為恒流階段結(jié)束 i_end find(abs(i_charge) 0.9 * i_max, 1, first); if ~isempty(i_end) cc_time_list(idx_out) t_charge(i_end) - t_charge(1); end idx_out idx_out 1; end這里有一個需要注意的細(xì)節(jié)充電記錄的電流可能是正值也可能有負(fù)值視數(shù)據(jù)版本而定所以判斷時用絕對值。用0.9倍峰值電流作為恒流階段結(jié)束的閾值是一個經(jīng)驗值實測中效果不錯。如果你發(fā)現(xiàn)cc_time序列在后期循環(huán)里急劇下降說明電池極化嚴(yán)重這個特征有極好的退化指示作用。除了CC時間還可以提取整個充電階段的總時間、恒壓階段的容量占比等。后面這些特征思路類似通過判斷電流變化趨勢來切分階段不再贅述。3.4 IC曲線特征提取IC曲線全稱Incremental Capacity曲線核心是計算dQ/dV也就是單位電壓變化對應(yīng)的容量增量。對鋰離子電池來說放電或充電過程中電壓平臺上會出現(xiàn)明顯的峰值峰值的位置和高度對應(yīng)著電極材料相變過程。電池老化后活性材料減少IC曲線的峰值高度會降低、位置會發(fā)生偏移。因此IC峰值高度和峰值電壓是很有價值的機理型健康特征。IC曲線的計算有兩個坑一是原始數(shù)據(jù)的電壓采樣不均勻直接差分噪聲特別大二是不插值直接計算時電壓值不在均勻網(wǎng)格上后續(xù)提取峰值很麻煩。所以標(biāo)準(zhǔn)做法是先對電壓做均勻重采樣再差分。%% 6. 定義IC曲線特征提取函數(shù) function [peak_pos, peak_val, v_mid, ic_s] calc_ic_features(v, q, v_res) % v: 放電電壓序列 % q: 放電容量序列累積電量 % v_res: 電壓重采樣間隔默認(rèn)0.01V % 對電壓和容量做去重排序 [v_sort, idx_sort] unique(v); q_sort q(idx_sort); % 定義均勻電壓網(wǎng)格 v_min ceil(min(v_sort) / v_res) * v_res; v_max floor(max(v_sort) / v_res) * v_res; v_grid v_min : v_res : v_max; if length(v_grid) 5 peak_pos nan; peak_val nan; v_mid nan; ic_s nan; return; end % 雙曲線插值到均勻網(wǎng)格 q_grid interp1(v_sort, q_sort, v_grid, pchip); % 計算差分容量 dq diff(q_grid); dv diff(v_grid); ic dq ./ dv; v_mid v_grid(1:end-1) dv/2; % 平滑處理窗口大小根據(jù)數(shù)據(jù)點密度調(diào)整 ic_s smoothdata(ic, movmean, 5); % 提取主峰 [peak_val, idx_peak] max(ic_s); peak_pos v_mid(idx_peak); end這里用unique給電壓排序去重是因為原始數(shù)據(jù)中電壓偶爾會因采樣原因出現(xiàn)相同值interp1要求x必須是嚴(yán)格單調(diào)的重復(fù)值會直接報錯。插值方法選擇pchip而不是spline原因是spline在數(shù)據(jù)點稀疏時容易產(chǎn)生過沖而pchip保形性更好符合電池曲線平滑單調(diào)的物理特性。計算IC曲線時需要一個關(guān)鍵的輸入累積容量q。放電記錄里的capacity字段是整次循環(huán)的總?cè)萘康獻(xiàn)C曲線要求的是放電過程中的累積容量弧線不是整次循環(huán)的總值。這個需要通過電流對時間積分來獲得%% 7. 在循環(huán)內(nèi)計算累積容量并提取IC特征 % 以某個放電事件為例 k_use event_idx(1); % 取第一個放電事件 v_disc B(k_use).discharge.voltage_measured; i_disc B(k_use).discharge.current_measured; t_disc B(k_use).discharge.time; % 注意電流方向如果記錄為負(fù)值表示放電方向 q_cum cumtrapz(t_disc, abs(i_disc)) / 3600; % Ah [peak_pos, peak_val, ~, ~] calc_ic_features(v_disc, q_cum, 0.01); fprintf(IC峰值電壓%.3f V峰值高度%.3f Ah/V\n, peak_pos, peak_val);用循環(huán)把所有放電事件的IC峰值特征批量提取出來就可以得到兩條新的特征序列IC峰值電壓序列和IC峰值高度序列。從實際效果看IC峰值高度隨循環(huán)的下降趨勢與容量衰減一致性很高峰值電壓的變化則能反映電極材料老化狀態(tài)兩者組合在一起相當(dāng)有價值。3.5 特征矩陣組裝與可視化上面提取的每條特征都是獨立的一維向量長度等于放電循環(huán)數(shù)。后續(xù)做模型訓(xùn)練時需要把這些特征按循環(huán)編號對齊成一張二維特征表。%% 8. 組裝特征表格 features table(); features.cycle num_list; features.capacity cap_list; features.eq_time eq_time_list; features.cc_time cc_time_list; % 如果有IC特征序列也拼進(jìn)來 % features.ic_peak_pos ic_peak_pos_list; % features.ic_peak_val ic_peak_val_list; % 查看前10行 head(features, 10)用table的好處是后續(xù)直接可以接fitlm、fitcensemble這類模型接口。另外我建議把所有特征和容量畫成一張多子圖對比圖輔助觀察退化趨勢和相關(guān)關(guān)系%% 9. 多特征趨勢對比 figure(Name, Feature Trends, Position, [100 100 1000 800]); tiledlayout(2, 2, Padding, compact); nexttile; plot(features.cycle, features.capacity, .-, LineWidth, 1.2); grid on; xlabel(Cycle); ylabel(Capacity (Ah)); title(容量衰減); nexttile; plot(features.cycle, features.eq_time, .-, LineWidth, 1.2); grid on; xlabel(Cycle); ylabel(Equal voltage time (s)); title(等壓降放電時間); nexttile; plot(features.cycle, features.cc_time, .-, LineWidth, 1.2); grid on; xlabel(Cycle); ylabel(CC charge time (s)); title(恒流充電時間); nexttile; scatter(features.eq_time, features.capacity, 20, features.cycle, filled); grid on; xlabel(等壓降時間 (s)); ylabel(容量 (Ah)); title(等壓降時間與容量散點圖); colorbar;等壓降時間與容量的散點圖如果呈現(xiàn)出一條近似直線分布說明這個特征選取得非常成功后面做線性回歸、高斯過程回歸都有很好的基礎(chǔ)。三個趨勢子圖則可以直觀看到哪些特征和容量的變化趨勢一致、哪些特征有異常波動。4. 常見問題與排查技巧實錄4.1 循環(huán)編號對不齊有一次我在做多電池對比時發(fā)現(xiàn)B0006提取出來的容量序列長度與B0005不一致而且循環(huán)編號跳變非常嚴(yán)重。后來排查發(fā)現(xiàn)不同電池的實驗計劃并不完全相同有些電池中間插入了額外的阻抗測試事件有些事件編號順序存在跳躍。解決辦法是不依賴數(shù)組順序始終用type和number兩個字段聯(lián)合定位循環(huán)事件。而且要養(yǎng)成每處理完一個數(shù)據(jù)集就打印循環(huán)編號范圍的習(xí)慣。4.2 等壓降時間全是NaN等壓降時間提取過程中如果出現(xiàn)大量NaN最常見的原因是選定的電壓區(qū)間不在該電池的實際放電范圍內(nèi)。比如你按4.0V到3.6V設(shè)置但某些電池放電起始電壓只有3.9V甚至更低那find(v v_high, 1, first)幾乎找不到合理的起始點。遇到這種問題先用min、max命令看一下該電池的放電電壓范圍再調(diào)整電壓區(qū)間。另一個潛在原因是放電數(shù)據(jù)里存在個別異常電壓點導(dǎo)致找到的起始索引早于真實平臺。我在實際處理B0018時就出現(xiàn)過這種情況后來在代碼里加了中值濾波對電壓序列做預(yù)處理問題就解決了。4.3 IC曲線噪聲大到無法提取峰值IC曲線對數(shù)據(jù)質(zhì)量特別敏感。如果你直接對原始電壓和原始電流積分結(jié)果做差分大概率會得到一條鋸齒狀亂線。處理的核心是重采樣和插值順序先對電壓排序去重再插值到均勻網(wǎng)格之后才做差分。另外平滑窗口大小也不是越大越好窗口太大會把真正的峰削平太小又濾不掉噪聲。我的經(jīng)驗是5~11點移動平均窗口比較合適具體數(shù)值根據(jù)數(shù)據(jù)點密度靈活調(diào)整。如果計算IC曲線時interp1報錯說“數(shù)據(jù)點必須唯一”那是因為電壓序列中有重復(fù)值。用unique處理一下就能解決。這個錯誤信息很多人在論壇上問過其實根本原因是放電結(jié)束時電壓停在截止電壓附近采集系統(tǒng)可能連續(xù)采了幾個完全相同的電壓點。4.4 特征與容量相關(guān)性不高如果你提取出來的特征和容量做散點圖看不出任何關(guān)系先不要懷疑電池數(shù)據(jù)大概率是特征沒對齊。最典型的錯誤是特征序列長度與容量序列長度不一致導(dǎo)致錯位或者特征序列里有NaN沒處理散點圖直接稀疏了一多半。用Matlab的corrcoef函數(shù)可以快速檢查相關(guān)性記得要先用rmmissing或fillmissing清理NaN。如果清理之后相關(guān)性依然很低那就要回到物理層面思考了——你選的特征是否真的對應(yīng)老化趨勢。比如充電總時間這個特征在恒流恒壓充電策略下早期可能和容量相關(guān)性很強但到了老化后期由于恒壓階段被截止電流截斷總時間的變化變得極其平緩這類特征就不適合單獨用于容量估計。建議多提取幾個特征然后用逐步回歸或LASSO做一次特征篩選。4.5 數(shù)據(jù)版本差異與容量字段缺失NASA數(shù)據(jù)集的下載版本比較多不同來源的.mat文件在字段命名上存在細(xì)微差異。有些版本的discharge記錄里有capacity字段有些版本則只有current和voltage需要自己算容量。遇到這種情況千萬別慌容量本質(zhì)上就是電流對時間積分% 手動積分計算容量 q_calc trapz(t_disc, abs(i_disc)) / 3600; % 單位Ah但注意這種計算方式在采樣率較低或者電流噪聲較大的情況下會有一定積分誤差建議與已知的容量值做一次對比校準(zhǔn)。我個人處理下來trapz積分結(jié)果與數(shù)據(jù)集自帶capacity字段的偏差通常在1%以內(nèi)用于特征分析足夠。寫在后面做完整個特征提取流程之后我最大的體會是特征提取不是寫一個函數(shù)就完事而是圍繞物理背景反復(fù)校驗的過程。等壓降時間和IC峰值這些特征之所以好用是因為它們踩在了電池老化機理的節(jié)骨眼上——一個反映的是同等工作量下的時間變化一個反映的是材料活性衰減。這套代碼跑通之后后續(xù)接機器學(xué)習(xí)模型就非常順了。建議第一次做電池數(shù)據(jù)分析的朋友先從B0005單電池入手等所有特征都能穩(wěn)定提取、可視化趨勢出來后再擴展到多電池對比整個過程就不會亂。本文還有配套的精品資源點擊獲取