• 正文
    • NO.1|CNN(卷積神經(jīng)網(wǎng)絡)的數(shù)學模型
    • NO.2|SVM(支持向量機)的數(shù)學模型
    • NO.3|CNN-SVM組合模型
  • 相關推薦
申請入駐 產(chǎn)業(yè)圖譜

CNN-SVM時間序列預測/詳細原理講解

03/24 15:30
400
加入交流群
掃碼加入
獲取工程師必備禮包
參與熱點資訊討論

CNN-SVM(卷積神經(jīng)網(wǎng)絡-支持向量機)是一種將卷積神經(jīng)網(wǎng)絡(CNN)與支持向量機(SVM)組合起來的深度學習模型。CNN-SVM模型的目標是通過結(jié)合CNN的特征提取能力和SVM的分類能力來提升圖像分類、模式識別等任務的性能。以下詳細介紹這兩種模型各自的數(shù)學原理及其組合后的工作原理。

NO.1|CNN(卷積神經(jīng)網(wǎng)絡)的數(shù)學模型

CNN是一種適用于圖像處理和其他結(jié)構(gòu)化數(shù)據(jù)的深度神經(jīng)網(wǎng)絡。其核心組成部分包括卷積層、池化層和全連接層。

1.1 卷積層的數(shù)學表示

卷積層的主要作用是從輸入數(shù)據(jù)中提取特征。假設輸入是一幅圖像I,卷積核K大小為m×n,則卷積操作可以表示為:

其中,S(i,j)是卷積操作后的輸出特征圖上的像素值。通過滑動卷積核在圖像上進行卷積操作,生成新的特征圖。多個卷積核可以捕捉圖像的不同特征,如邊緣、紋理等。

1.2 池化層的數(shù)學表示

池化層 (Pooling)通常用來減少特征圖的大小,從而減小計算量并增加模型的魯棒性。最常見的池化操作是最大池化(Max Pooling),其數(shù)學表示為:

這里,P(i,j)是池化后的輸出,池化窗口選取了輸入特征圖$S(i,j)$上的一個小塊區(qū)域,通過最大值或平均值等方式進行降維。

1.3 全連接層

全連接層將來自卷積和池化后的特征展平為向量,并通過權(quán)重矩陣W和偏置項b進行線性變換:

x是輸入的展平特征向量,z是全連接層的輸出。最后,這些輸出通過激活函數(shù)(如ReLU或Softmax) 得到最終的分類結(jié)果。

NO.2|SVM(支持向量機)的數(shù)學模型

SVM是一種用于二分類問題的監(jiān)督學習模型,其核心思想是通過找到一個最優(yōu)的超平面來將不同類別的數(shù)據(jù)分開。對給定的訓練數(shù)據(jù)??,其中xi是輸入向量,??表示類別標簽。SVM試圖找到一個超平面:

其中,w是權(quán)重向量,b是偏置項。為了找到最優(yōu)的超平面,SVM的目標是最大化超平面到兩類數(shù)據(jù)的最小距離,這轉(zhuǎn)化為一個優(yōu)化問題:

同時滿足約束條件:

當數(shù)據(jù)不完全線性可分時,可以引入松弛變量$xi_{i}$ 來允許一些數(shù)據(jù)點被錯誤分類:

其中C是調(diào)節(jié)懲罰項的超參數(shù)。對于非線性可分問題,SWM誦過使用核函數(shù)將數(shù)據(jù)映的到高維空間,使其線性可分。常見的核函數(shù)有線性核、多項式核和RBF核。

NO.3|CNN-SVM組合模型

CNN-SVM模型結(jié)合了CNN的特征提取能力和SVW的強分類能力。其基本思路是使用CNN進行特征提取,然后將這些提取到的高維持征輸入到SWM進行分類。與直接使用CNN的全連接層和Softmax分類器相比,SVM分類器能夠更好地處理高維特征空間中的復雜分類問題。

3.1 CNN-SVM模型的結(jié)構(gòu)

1. CNN部分:CNN首先處理輸入數(shù)據(jù)(如圖像),通過多層的卷積、池化操作提取出多尺度的特征表示。這些特征保留了圖像的空間結(jié)構(gòu)信息。

2. 漸征向量:在經(jīng)過CNN的最后一層 (通常是展平后的特征圖或全連接層),我們得到一個高維特征向量x。

3. SVM分類器:將CNN提取的特征向量輸入到SWM模型中進行分類。SWM通過計算樣本到超平面的距離來確定其所屬類別。SVM部分可以用線性或核SVM,具體取決于數(shù)據(jù)的分布和復雜性。

3.2 CNN-SVM的數(shù)學表示

設??是CNN對輸入圖像$I$提取的特征向量。然后,我們使用SVM進行分類:

其中w和b是SVM模型的參數(shù)。SVM將學習如何在特征空間中找到一個超平面來區(qū)分不同類別的樣本。

3.3 部分代碼

%% 定義卷積神經(jīng)網(wǎng)絡結(jié)構(gòu)cnn_architecture = [    imageInputLayer([size(scaled_train_input, 1) 1 1], "Name", "input_layer")
    convolution2dLayer([3, 1], 16, 'Padding', 'same')         % 3x1 卷積核,生成16個通道    batchNormalizationLayer                                   % 批量歸一化    reluLayer                                                 % ReLU 激活層
    maxPooling2dLayer([2, 1], 'Stride', 1)                    % 最大池化層,步長為1    convolution2dLayer([2, 1], 32)                            % 2x1 卷積核,生成32個通道    batchNormalizationLayer                                   % 批量歸一化    reluLayer                                                 % ReLU 激活層
    maxPooling2dLayer([2, 1], 'Stride', 1)                    % 第二層池化,步長為1
    fullyConnectedLayer(25)                                   % 全連接層,25個神經(jīng)元    reluLayer                                                 % ReLU 激活層    fullyConnectedLayer(1)                                    % 輸出層    regressionLayer                                           % 回歸層用于計算損失];
%% 設置訓練選項train_options = trainingOptions('adam', ...    'MaxEpochs', 150, ...    'GradientThreshold', 1, ...    'InitialLearnRate', 0.01, ...    'LearnRateSchedule', 'piecewise', ...    'LearnRateDropPeriod', 70, ...    'LearnRateDropFactor', 0.1, ...    'L2Regularization', 0.001, ...    'ExecutionEnvironment', 'cpu', ...    'Verbose', 1, ...    'Plots', 'none');
%% 訓練CNN模型tictrained_cnn = trainNetwork(reshaped_input_train, target_train', cnn_architecture, train_options);toc
%% 提取CNN特征selected_layer_name = 'pool2';train_features = activations(trained_cnn, reshaped_input_train, selected_layer_name, 'OutputAs', 'rows');test_features = activations(trained_cnn, reshaped_input_test, selected_layer_name, 'OutputAs', 'rows');
%% 轉(zhuǎn)換為雙精度train_features = double(train_features); test_features = double(test_features);output_train = double(output_train); output_test = double(output_test);
%% SVM訓練與預測opt_c = 0.01;opt_g = 150;svm_command = [' -s 4 -t 0 -c ', num2str(opt_c), ' -g ', num2str(opt_g)];svm_model = libsvmtrain(output_train', train_features, svm_command);[train_predictions, train_accuracy, ~] = libsvmpredict(output_train', train_features, svm_model);[test_predictions, test_accuracy, ~] = libsvmpredict(output_test', test_features, svm_model);
%% 反歸一化train_predictions_denorm = mapminmax('reverse', train_predictions, output_norm_params);test_predictions_denorm = mapminmax('reverse', test_predictions, output_norm_params);

1.均方差(MSE):0.265752.根均方差(RMSE):0.515513.平均絕對誤差(MAE):0.345794.平均相對百分誤差(MAPE):2.6756%5.R2:99.1024%
…………測試集誤差指標…………1.均方差(MSE):0.301552.根均方差(RMSE):0.549133.平均絕對誤差(MAE):0.394074.平均相對百分誤差(MAPE):3.0429%5.R2:98.9411%

 

相關推薦