用深度學習(LSTM)實現時間序列預測:從數據到閉環預測全解析

用深度學習(LSTM)實現時間序列預測:從數據到閉環預測全解析

時間序列預測是工業、金融、環境等領域的核心需求——小到預測設備溫度波動,大到預測股價走勢,都需要從歷史數據中挖掘時序規律。長短期記憶網絡(LSTM)憑借對“長期依賴關系”的捕捉能力,成為時序預測的主流模型之一。

本文將基于MATLAB深度學習工具箱,以波形數據集(WaveformData) 為例,完整拆解LSTM時間序列預測的實現流程,重點講解“閉環預測”的核心邏輯(用前一次預測結果作為下一次輸入,無需真實值即可多步預測),并對代碼逐行、參數逐個進行解析。

一、整體背景:LSTM與兩種預測模式

LSTM是一種循環神經網絡(RNN),通過“門控機制”(遺忘門、輸入門、輸出門)動態更新“隱藏狀態”,從而記住序列中的關鍵歷史信息,避免普通RNN的“梯度消失”問題。

時序預測有兩種核心模式,也是本文的重點對比對象:

  • 開環預測:每次預測都需要“真實的歷史數據”作為輸入(比如預測第t步需要第t-1步的真實值),適合能實時獲取真實數據的場景。
  • 閉環預測:僅用初始真實數據初始化,后續預測完全依賴“前一次的預測結果”作為輸入(無需真實值),適合需要一次性預測多步未來、或無法獲取實時真實數據的場景(如預測未來200天的溫度)。

本文將從數據加載到閉環預測,一步步實現完整流程。

二、完整實現流程與代碼解析

1. 第一步:加載與探索數據

首先加載示例數據集,了解數據結構,為后續處理做準備。

代碼與逐行解析
% 加載波形數據集(MATLAB內置示例數據)
load WaveformData% 查看前5個序列的結構(數據是cell數組,每個元素是一個序列)
data(1:5)% 計算序列的通道數(所有序列通道數一致,才能訓練網絡)
numChannels = size(data{1},1)% 可視化前4個序列(堆疊圖展示多通道)
figure
tiledlayout(2,2)  % 創建2x2的子圖布局
for i = 1:4nexttile  % 激活下一個子圖stackedplot(data{i}')  % 轉置序列:讓時間步為x軸,通道為y軸xlabel("Time Step")  % x軸標簽:時間步
end% 劃分訓練集與測試集(9:1拆分)
numObservations = numel(data);  % 總序列數(data是cell數組,numel取元素個數)
idxTrain = 1:floor(0.9*numObservations);  % 訓練集索引(前90%)
idxTest = floor(0.9*numObservations)+1:numObservations;  % 測試集索引(后10%)
dataTrain = data(idxTrain);  % 訓練集序列
dataTest = data(idxTest);    % 測試集序列
關鍵參數與概念
  • WaveformData:MATLAB內置的合成波形數據集,結構為numObservations×1的cell數組,每個cell元素是numChannels×numTimeSteps的矩陣(numChannels=3,即每個時間步有3個特征;numTimeSteps為序列長度,不同序列長度不同)。
  • stackedplot:堆疊圖函數,適合展示多通道時序數據(每個通道一條線,避免重疊)。
  • 數據劃分邏輯:9:1拆分是時序預測的常用比例,既保證訓練集足夠大(學習規律),又保留測試集(評估泛化能力)。

2. 第二步:準備訓練數據(核心:移位目標序列+歸一化)

LSTM訓練需要“輸入-目標”配對的監督數據。時序預測的核心技巧是:輸入為“去掉最后一個時間步的序列”,目標為“移位一個時間步的序列”,讓LSTM學習“當前時間步→下一個時間步”的映射關系。

同時,為避免訓練發散、提升收斂速度,需要對數據做“零均值單位方差”歸一化。

代碼與逐行解析
% 1. 構建訓練集的“輸入-目標”配對(移位序列)
for n = 1:numel(dataTrain)  % 遍歷每個訓練序列X = dataTrain{n};       % 取第n個訓練序列(numChannels×numTimeSteps)XTrain{n} = X(:,1:end-1);  % 輸入:去掉最后一個時間步(無法預測它的下一個值)TTrain{n} = X(:,2:end);    % 目標:移位一個時間步(每個輸入對應下一個時間步的真實值)
end% 2. 歸一化:計算訓練集的均值和標準差(所有序列拼接后統計,保證一致性)
muX = mean(cat(2,XTrain{:}),2);  % 輸入的均值:cat(2,...)按時間步拼接所有序列,mean(...,2)按通道算均值
sigmaX = std(cat(2,XTrain{:}),0,2);  % 輸入的標準差:0表示除以N-1(無偏估計),2表示按通道算muT = mean(cat(2,TTrain{:}),2);  % 目標的均值
sigmaT = std(cat(2,TTrain{:}),0,2);  % 目標的標準差% 3. 對輸入和目標進行歸一化(用訓練集的統計量,避免數據泄露)
for n = 1:numel(XTrain)XTrain{n} = (XTrain{n} - muX) ./ sigmaX;  % 輸入歸一化:(原始-均值)/標準差TTrain{n} = (TTrain{n} - muT) ./ sigmaT;  % 目標歸一化
end
關鍵邏輯解釋
  • 移位序列的原因:假設序列為[t1,t2,t3,t4],輸入XTrain[t1,t2,t3],目標TTrain[t2,t3,t4],讓LSTM學習“t1→t2”“t2→t3”“t3→t4”的映射,最終能實現“輸入任意序列→預測下一個時間步”。
  • 歸一化的必要性:若不同通道的數值范圍差異大(如通道1是0-1,通道2是100-200),訓練時會導致梯度更新失衡,模型難以收斂。用訓練集統計量歸一化,是為了避免“測試集信息泄露到訓練集”(測試集的統計量未知)。

3. 第三步:定義LSTM網絡架構

時序預測的LSTM網絡需要適配“序列輸入→序列輸出”的需求,核心層包括:序列輸入層、LSTM層、全連接層、回歸層。

代碼與逐行解析
layers = [sequenceInputLayer(numChannels)  % 序列輸入層:輸入維度=通道數(numChannels=3)lstmLayer(128)                   % LSTM層:128個隱藏單元(決定學習能力)fullyConnectedLayer(numChannels) % 全連接層:輸出維度=通道數(與輸入通道一致)regressionLayer];                % 回歸層:定義回歸任務的損失函數(默認均方誤差MSE)
各層參數與作用詳解
層名稱參數配置作用說明
sequenceInputLayernumChannels=3接收“通道數×時間步”的序列輸入,輸入維度必須與數據的通道數一致(否則維度不匹配)。
lstmLayer128個隱藏單元隱藏單元數量決定LSTM的“記憶容量”:128個單元可捕捉中等復雜度的時序規律;數量越多學習能力越強,但易過擬合。
fullyConnectedLayernumChannels=3將LSTM輸出的128維隱藏狀態“映射”到3維(與輸入通道數一致),確保輸出序列的維度與目標序列匹配。
regressionLayer無參數(默認)回歸任務的輸出層,計算“預測值-真實值”的均方誤差(MSE),作為訓練的損失函數,指導網絡更新權重。

4. 第四步:指定訓練選項

訓練選項決定模型的優化策略,需結合數據規模、網絡復雜度調整。

代碼與逐行解析
options = trainingOptions("adam", ...  % 優化器:Adam(自適應學習率,適合時序數據)MaxEpochs=200, ...                 % 最大訓練輪數:200輪(平衡訓練效果與時間)SequencePaddingDirection="left", ...% 序列對齊方式:左側補零(保護右側有效信息)Shuffle="every-epoch", ...         % 數據打亂:每輪訓練前打亂訓練集,避免過擬合Plots="training-progress", ...     % 可視化:顯示訓練進度(損失曲線、準確率等)Verbose=0);                        % 日志輸出:0表示不打印詳細訓練日志(僅看進度圖)
關鍵選項解釋
  • Adam優化器:比SGD(隨機梯度下降)收斂更快,通過自適應學習率調整不同參數的更新步長,適合LSTM這類復雜網絡。
  • MaxEpochs=200:200輪是針對2000個序列的經驗值——輪數太少可能欠擬合(沒學會規律),太多則可能過擬合(記住訓練集噪聲)。
  • SequencePaddingDirection=“left”:不同序列長度不同,訓練時需補零對齊。左側補零是為了保護“右側的近期信息”(時序數據中,右側時間步更重要),避免右側補零干擾預測。

5. 第五步:訓練LSTM網絡

調用trainNetwork函數,用訓練集(XTrain, TTrain)和訓練選項(options)訓練網絡。

代碼與解析
% 訓練網絡:輸入(XTrain)、目標(TTrain)、網絡架構(layers)、訓練選項(options)
net = trainNetwork(XTrain,TTrain,layers,options);
  • 輸出:訓練好的LSTM網絡net,包含學習到的權重、偏置和網絡結構。
  • 訓練過程:運行時會彈出“訓練進度圖”,可觀察訓練損失(Training Loss)的下降趨勢——若損失趨于平穩,說明網絡收斂。

6. 第六步:測試網絡(評估泛化能力)

測試的核心是:用訓練好的網絡預測測試集,計算誤差(RMSE)評估泛化能力。

代碼與逐行解析
% 1. 準備測試數據(與訓練數據處理邏輯一致:移位+歸一化)
for n = 1:size(dataTest,1)  % 遍歷每個測試序列X = dataTest{n};        % 取第n個測試序列XTest{n} = (X(:,1:end-1) - muX) ./ sigmaX;  % 測試輸入:移位+用訓練集統計量歸一化TTest{n} = (X(:,2:end) - muT) ./ sigmaT;    % 測試目標:移位+歸一化
end% 2. 用測試集預測(指定左側補零,與訓練一致)
YTest = predict(net,XTest,SequencePaddingDirection="left");% 3. 計算每個測試序列的RMSE(均方根誤差,評估預測精度)
for i = 1:size(YTest,1)% RMSE = sqrt(平均(預測值-真實值)^2),"all"表示對所有元素計算rmse(i) = sqrt(mean((YTest{i} - TTest{i}).^2,"all"));
end% 4. 可視化RMSE分布(直方圖)
figure
histogram(rmse)  % 繪制RMSE的頻率分布
xlabel("RMSE")    % x軸:RMSE值(越小精度越高)
ylabel("Frequency")  % y軸:頻率(多少個序列的RMSE落在該區間)% 5. 計算所有測試序列的平均RMSE
mean(rmse)
評估邏輯
  • RMSE的意義:RMSE越小,預測值與真實值的偏差越小。例如,若平均RMSE=0.1,說明預測值與真實值的平均偏差僅0.1(歸一化后的值,反歸一化后可還原為原始尺度)。
  • 為什么用訓練集統計量歸一化:測試時無法獲取“未來數據的統計量”,用訓練集統計量才能模擬真實預測場景(避免數據泄露)。

7. 第七步:預測未來時間步(重點:開環vs閉環)

測試僅驗證“單步預測”能力,實際應用中常需“多步預測”(如預測未來200個時間步)。此時需區分開環與閉環兩種模式,閉環預測是本文核心

7.1 先理解:開環預測(依賴真實值)

開環預測的邏輯是:每次預測都需要“前一個時間步的真實值”作為輸入,適合能實時獲取真實數據的場景(如實時監測設備數據,用真實值預測下一秒)。

% 選擇一個測試序列(索引=2)
idx = 2;
X = XTest{idx};  % 測試輸入序列
T = TTest{idx};  % 測試目標序列% 1. 初始化網絡狀態(重置隱藏狀態,避免歷史數據干擾)
net = resetState(net);
% 2. 用前75個時間步的真實數據更新網絡狀態(讓網絡“記住”初始上下文)
offset = 75;  % 初始真實數據的時間步長度
[net,~] = predictAndUpdateState(net,X(:,1:offset));% 3. 開環預測:用真實值作為輸入,預測剩余時間步
numTimeSteps = size(X,2);  % 測試序列總時間步
numPredictionTimeSteps = numTimeSteps - offset;  % 需預測的時間步數量
Y_open = zeros(numChannels,numPredictionTimeSteps);  % 存儲開環預測結果for t = 1:numPredictionTimeStepsXt = X(:,offset+t);  % 輸入:第offset+t步的真實值(開環的核心:依賴真實值)[net,Y_open(:,t)] = predictAndUpdateState(net,Xt);  % 預測+更新網絡狀態
end% 4. 可視化開環預測結果
figure
t = tiledlayout(numChannels,1);  % 按通道堆疊子圖
title(t,"Open Loop Forecasting")
for i = 1:numChannelsnexttileplot(T(i,:))  % 真實值(目標序列)hold on% 預測值:從offset步開始,拼接offset步的真實值+預測值plot(offset:numTimeSteps,[T(i,offset) Y_open(i,:)],'--')ylabel("Channel " + i)
end
xlabel("Time Step")
nexttile(1)
legend(["True Value" "Forecasted Value"])
  • 開環的局限性:必須獲取每個時間步的真實值才能繼續預測,無法一次性預測多步未來(如無法直接預測未來200步,需等每一步真實值產生)。
7.2 核心:閉環預測(無需真實值,用前一次預測當輸入)

閉環預測的邏輯是:僅用初始真實數據初始化,后續預測完全依賴“前一次的預測結果”作為輸入,可一次性預測任意多步未來,適合無法獲取實時真實數據的場景(如預測未來一個月的銷量)。

代碼與逐行解析
% 1. 重置網絡狀態(關鍵!清除歷史隱藏狀態,確保從干凈的初始狀態開始)
net = resetState(net);% 2. 用測試序列的所有真實數據初始化網絡狀態(讓網絡“記住”完整的初始上下文)
offset = size(X,2);  % offset=測試序列的總時間步(用全部真實數據初始化)
[net,Z] = predictAndUpdateState(net,X);  % Z是初始預測結果(與測試序列長度一致)% 3. 閉環預測:預測未來200個時間步(可自定義數量)
numPredictionTimeSteps = 200;  % 需預測的未來時間步數量
Xt = Z(:,end);  % 初始輸入:最后一個時間步的預測值(閉環的核心:用預測值當輸入)
Y_closed = zeros(numChannels,numPredictionTimeSteps);  % 存儲閉環預測結果% 循環預測:每一步用前一次的預測值作為輸入
for t = 1:numPredictionTimeSteps% 預測當前時間步+更新網絡狀態[net,Y_closed(:,t)] = predictAndUpdateState(net,Xt);% 更新輸入:下一次預測用當前的預測值Xt = Y_closed(:,t);
end% 4. 可視化閉環預測結果
numTimeSteps = offset + numPredictionTimeSteps;  % 總時間步=初始真實數據+預測數據
figure
t = tiledlayout(numChannels,1);
title(t,"Closed Loop Forecasting")  % 標題:閉環預測for i = 1:numChannelsnexttileplot(T(i,1:offset))  % 初始真實數據(前offset步)hold on% 預測數據:從offset步開始,拼接offset步的真實值+未來200步的預測值plot(offset:numTimeSteps,[T(i,offset) Y_closed(i,:)],'--')ylabel("Channel " + i)
endxlabel("Time Step")
nexttile(1)
legend(["Input (True Value)" "Forecasted Value"])
閉環預測的核心細節
  1. 為什么要resetState
    LSTM的隱藏狀態會“記憶”歷史數據,若不重置,網絡會攜帶上一次預測的殘留信息(如之前預測過的其他序列),導致當前預測的初始狀態錯誤,誤差被不斷放大。resetState能將隱藏狀態清零,確保從“干凈的初始狀態”開始學習當前序列的上下文。

  2. predictAndUpdateState的作用
    該函數是閉環預測的核心工具,同時完成兩個任務:

    • 基于當前輸入(真實值或預測值)計算預測結果;
    • 更新網絡的隱藏狀態(讓網絡“記住”當前輸入的信息,為下一次預測做準備)。
  3. 循環邏輯的關鍵
    每次循環中,Xt = Y_closed(:,t)將“當前預測值”作為“下一次預測的輸入”,形成“預測→輸入→再預測”的閉環,無需任何真實值即可持續預測多步未來。

三、閉環預測的優缺點與適用場景

特點優點缺點適用場景
數據依賴僅需初始真實數據,后續無需真實值誤差會累積(前一步預測不準,后一步偏差更大)無法獲取實時真實數據、需一次性預測多步未來(如預測未來1年的季節性波動)
靈活性可自定義預測步數(如預測200步、500步)精度通常低于開環預測長期趨勢預測、資源有限無法實時采集數據的場景
計算效率一次性循環完成多步預測,無需等待真實數據需合理初始化網絡狀態(否則初始誤差大)批量預測、離線預測任務

四、總結

本文通過完整的MATLAB代碼,拆解了LSTM時間序列預測的全流程:從數據加載與移位處理、網絡架構設計、訓練優化,到開環與閉環預測的實現。核心結論如下:

  1. 數據處理是基礎:移位目標序列讓LSTM學習“當前→下一個”的映射,歸一化避免訓練發散,左側補零保護有效信息。
  2. 網絡架構需適配任務:sequenceInputLayer匹配通道數,lstmLayer隱藏單元數量平衡學習能力與過擬合,regressionLayer適配回歸任務。
  3. 閉環預測是核心亮點:通過resetState初始化狀態、predictAndUpdateState預測+更新狀態、循環用前一次預測當輸入,實現無需真實值的多步預測,適合實際應用中的長期預測需求。

掌握這套流程后,你可以將其遷移到自己的時序數據(如溫度、銷量、股價),只需調整通道數、隱藏單元數量、預測步數等參數,即可快速實現定制化的時間序列預測。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/100386.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/100386.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/100386.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

gpu-z功能介紹,安裝與使用方法

GPU-Z 功能介紹、安裝與使用方法 一、核心功能 硬件信息檢測 識別顯卡型號、制造商、核心架構(如NVIDIA Ada Lovelace、AMD RDNA 3)、制造工藝(如5nm、7nm)。顯示顯存類型(GDDR6X、HBM2e)、容量、帶寬及顯…

數據搬家后如何處理舊 iPhone

每年,蘋果都會推出新款 iPhone,激發了人們升級到 iPhone 17、iPhone 17 Pro、iPhone 17 Pro Max 或 iPhone Air 等新機型的熱情。但在獲得新 iPhone 之前,有一件重要的事情要做:將數據從舊 iPhone 轉移到新設備。雖然許多用戶都能…

Java關鍵字深度解析(上)

這是一份全面的Java關鍵字實戰指南 目錄 1.數據類型關鍵字:內存布局與性能優化 1.1 基礎類型的內存密碼 byte-內存的極簡主義者 int-Java世界的萬能鑰匙 long - 時間與ID的守護者 1.2 引用類型的架構設計 String-不是關鍵字但勝于關鍵字 2.訪問修飾符:企業級權限控制 …

C語言深度解析:指針數組與數組指針的區別與應用

目錄 1 引言:從名字理解本質區別 2 指針數組:靈活管理多個指針 2.1 基本概念與聲明方式 2.2 內存布局與特性 2.3 典型應用場景:字符串數組與多維度數據管理 2.3.1 靜態分配示例:字符串數組 2.3.2 動態分配示例:…

Node.js 高級應用:負載均衡與流量限制

在當今高并發的網絡應用環境中,如何有效地分配服務器資源并保護系統免受惡意攻擊是開發者必須面對的重要問題。Node.js 作為一款廣受歡迎的服務器端 JavaScript 運行時環境,提供了豐富的工具和模塊來應對這些挑戰。本文將深入探討如何在 Node.js 中實現負…

信任鏈驗證流程

信任鏈驗證流程 (The Chain of Trust)整個過程就像一場嚴格的接力賽,每一棒都必須從可信的上一位手中接過接力棒(信任),驗證無誤后,再跑自己的那段路,并把信任傳遞給下一棒現在,我們來詳細解讀圖…

黃昏時刻復古膠片風格人像風光攝影后期Lr調色教程,手機濾鏡PS+Lightroom預設下載!

調色教程這套 黃昏時刻復古膠片風格人像風光攝影后期 Lr 調色方案,以落日余暉為核心色彩元素,加入復古膠片質感,讓畫面充滿溫暖與懷舊氛圍。整體色調偏向橙紅與青綠的互補對比,天空的夕陽光影與人像膚色相互映襯,既有膠…

硬件驅動——I.MX6ULL裸機啟動(3)(按鍵設置及中斷設置

重點:1.GIC:(Generic Interrupt Controller)通用中斷控制器,是ARM架構中用于管理中斷的核心模塊,主要用于現代多核處理器系統。它負責接收,分發并分發中斷請求,減輕CPU負擔&#x…

用deepseek對GPU服務器進行壓力測試

利用 DeepSeek 模型對 GPU 服務器進行壓力測試,核心思路是通過模擬高負載的模型推理 / 微調任務,驗證 GPU 服務器在計算、顯存、網絡等維度的承載能力,同時觀察穩定性與性能瓶頸。以下是具體的測試方案,涵蓋測試環境準備、核心測試…

ARM(7)IMX6ULL 按鍵控制(輪詢 + 中斷)優化工程

一、硬件介紹1. 開關功能定義共 3 個開關(兩紅一黃),功能分工明確:中間開關:復位按鈕左邊開關:低功耗按鈕右邊開關:用戶獨立控制的試驗按鍵(核心控制對象)2. 核心電平邏輯…

【QT隨筆】什么是Qt元對象系統?Qt元對象系統的核心機制與應用實踐

【QT隨筆】什么是Qt元對象系統?Qt元對象系統的核心機制與應用實踐 之所以寫下這篇文章,是因為前段時間自己面試的時候被問到了!因此想借此分享一波!!!本文主要詳細解釋Qt元對象系統的概念、作用及實現機制…

從技術視角解析加密貨幣/虛擬貨幣/穩定幣的設計與演進

隨著加密貨幣行情的持續走高,除了資產價值,我想試著從底層程序設計與架構角度解析比特幣、以太坊、穩定幣以及新興公鏈的核心技術方案。作者在2018年設計實施了基于區塊鏈技術的金融項目,并榮獲了國家課題進步獎,對加密貨幣及場景…

[MySQL]Order By:排序的藝術

[MySQL]Order By:排序的藝術 1. 簡介 在數據庫管理中,數據的排序是一項至關重要的操作。MySQL 的 ORDER BY 子句為我們提供了強大而靈活的功能,用于對查詢結果進行排序。無論是按照字母順序排列名稱,還是根據日期或數值進行升序…

【工具代碼】使用Python截取視頻片段,截取視頻中的音頻,截取音頻片段

目錄 ■截取視頻方法 1.下載 ffmpeg-8.0-essentials_build 2.配置到環境變量 3.python代碼 4.運行 5.效果 ■更多 截取視頻中的音頻 截取音頻 Sony的CR3圖片,轉換為JPG ■截取視頻方法 1.下載 ffmpeg-8.0-essentials_build "https://www.gyan.de…

Three.js 平面始終朝向相機

instanceMesh需要讓實例像粒子一樣始終朝向相機 可以如下處理shaderexport const billboarding // billboarding函數的GLSL實現 // 參數: // - position: 頂點動態位置偏移 // - positionLocal: mesh的position // - horizontal: 水平方向是否朝向相機 // - vertical: 垂直方…

旗訊 OCR 識別系統深度解析:一站式解決表格、手寫文字、證件識別難題!

在數字化辦公日益普及的今天,“紙質文檔轉電子”“圖片信息提取” 等需求愈發頻繁,但傳統手動錄入不僅效率低下,還容易出現數據錯誤。近期發現一款實用性極強的工具 —— 旗訊數字 OCR 識別系統,其覆蓋多場景的識別功能、極簡操作…

MissionPlanner架構梳理之(十四)日志瀏覽

概述和目的 Mission Planner 中的日志瀏覽系統提供了加載、查看、分析和解讀 ArduPilot 驅動的飛行器生成的飛行日志的工具。飛行日志包含飛行操作期間記錄的關鍵遙測數據,使用戶能夠查看飛行性能、診斷問題并從過去的飛行中獲取見解。 本頁記錄了日志瀏覽系統的架…

機器學習shap分析案例

在進行數據分析和機器學習時經常用到shap,本文對shap相關的操作進行演示。波士頓數據集鏈接在這里。 SHAP Analysis Guide Set up 導入必要包 import pandas as pd import numpy as np import lightgbm as lgb import matplotlib import matplotlib.pyplot as p…

網絡編程相關函數

1. 套接字操作相關1.1 socketint socket(int domain, int type, int protocol);參數說明int domain協議族,常用 AF_INET(IPv4)、AF_INET6(IPv6)int type套接字類型,SOCK_DGRAM(UDP)、…

ESLint 自定義 Processor(處理器)

ESLint 自定義 Processor(處理器) 🔹 什么是 Processor? 在 ESLint 中,Processor(處理器)是一種擴展機制,允許處理非標準 JavaScript/TypeScript 文件。默認情況下,ESLin…