基于MATLAB的LS-SVM实现方法以及SVM的一些知识点
使用之前需要把LSSVMlabv1_8_R2009b_R2011a解壓 并在matlab中添加到路徑中
下載鏈接:http://www.esat.kuleuven.be/sista/lssvmlab/
我使用的是 V1.8版本。
matlab版本我使用的是2019a。
關于SVM具體敘述可以看這篇文章:
?SVM(支持向量機)原理及數學推導全過程詳解
這里不具體說LS-SVM原理了,主要介紹MATLAB實現LS-SVM的步驟。
In Support Vector Machines (SVMs), the solution of the classification problem is characterized by a (convex) quadratic programming (QP) problem. In a modified version of SVMs, called Least Squares SVM classifiers (LS-SVMs), a least-squares cost function is proposed so as to obtain a linear set of equations in the dual space.
目錄
一、機器學習中常用的一些名詞
1.偏差與方差
2. SVM的參數gamma(γ),懲罰因子C,正則化參數Lambda(λ)
二、LS-SVM工具箱實例的一些參數
2.1 模型參數
2.2 輸入樣本以及函數參數
三、LS-SVM工具箱函數使用方法
四、LS-SVM完整實現過程
4.1 使用參數的方法
4.2 使用接口的方法
五、重點是關于尋優的方法
六、多分類LS-SVM
一、機器學習中常用的一些名詞
1.偏差與方差
偏差(bias):偏差是衡量期望預測值和真實值的偏離程度。即N次預測的平均值(也叫期望值),和實際真實值的差距。所以偏差bias=E(p(x)) - f(x)。
即bias是指一個模型在不同訓練集上的平均表現和真實值的差異,用來衡量一個模型的擬合能力,刻畫了學習算法本身的擬合能力。
方差(variance):方差用于衡量預測值之間的關系,和真實值無關。即對于給定的一個預測模型,N次預測結果之間的方差,度量了同樣大小的訓練集的變動所導致的學習性能的變化,刻畫了數據擾動所造成的影響。variance= E((p(x) - E(p(x)))^2)。這個公式就是數學里的方差公式,反應的是統計量的離散程度。
也可以這樣描述:訓練數據在不同迭代階段的訓練模型中,預測值的變化波動情況(或稱之為離散情況)。從數學角度看,可以理解為每個預測值與預測均值差的平方和的再求平均數。通常在模型訓練中,初始階段模型復雜度不高,為低方差;隨著訓練量加大,模型逐步擬合訓練數據,復雜度開始變高,此時方差會逐漸變高。
即variance指一個模型在不同訓練集上的差異,用來衡量一個模型是否容易過擬合。
一般訓練程度越強,偏差越小,方差越大,泛化誤差一般在中間有一個最小值,如果偏差較大,方差較小,此時一般稱為欠擬合,而偏差較小,方差較大稱為過擬合。
1.1 以下面的打靶圖為例進行解釋:
先搞清楚圖中各元素的含義!紅色中心代表目標值,每一個藍點,都代表了一個訓練模型的預測數據,即根據不同的訓練集訓練出一個訓練模型,再用這個訓練模型作出一次預測結果。
左下角的“打靶圖”,假設我們的目標是中心的紅點,所有的預測值都偏離了目標位置,這就是偏差;
在右上角的“打靶圖”中,預測值圍繞著紅色中心周圍,沒有大的偏差,但是整體太分散了,不集中,這就是方差。
?
- 低偏差,低方差:這是訓練的理想模型,此時藍色點集基本落在靶心范圍內,且數據離散程度小,基本在靶心范圍內;
- 低偏差,高方差:這是深度學習面臨的最大問題,過擬合了。也就是模型太貼合訓練數據了,導致其泛化(或通用)能力差,若遇到測試集,則準確度下降的厲害。通過對偏差的定義,不難發現,偏差是一個期望值(平均值),如果一次射擊偏左5環,另一次射擊偏右5環,最終偏差是0。但是沒一槍打中靶心,所以方差是巨大的,這種情況也是需要改進的。
- 高偏差,低方差:這往往是訓練的初始階段。每次射擊都很準確的擊中同一個位置,故極端的情況方差為0。只不過,這個位置距離靶心相差了十萬八千里。對于射擊而言,每次都打到同一個點,很可能是因為它打的不是靶心。對于模型而言,往往是因為模型過于簡單,才會造成“準”的假象。提高模型的復雜度,往往可以減少高偏差。
- 高偏差,高方差:這是訓練最糟糕的情況,準確度差,數據的離散程度也差。
1.2 以stanford課程《機器學習》的說法
偏差和方差
通常用代價函數J(平方差函數)評價數據擬合程度好壞。如果只關注Jtrain(訓練集誤差)的話,通常會導致過擬合,因此還需要關注Jcv(交叉驗證集誤差)。
高偏差:Jtrain和Jcv都很大,并且Jtrain≈Jcv。對應欠擬合。
高方差:Jtrain較小,Jcv遠大于Jtrain。對應過擬合。
下圖d代表多項式擬合的階數,d越高,擬合函數越復雜,越可能發生過擬合。
1、高偏差對應著欠擬合,此時Jtrain也較大,可以理解為對任何新數據(不論其是否屬于訓練集),都有著較大的Jcv誤差,偏離真實預測較大。
2、高方差對應著過擬合,此時Jtrain很小,對于新數據來說,如果其屬性與訓練集類似,它的Jcv就會小些,如果屬性與訓練集不同,Jcv就會很大,因此有一個比較大的波動,因此說是高方差。
模型修改策略
高方差,過擬合:增大數據規模、減小數據特征數(維數)、增大正則化系數λ
高偏差,欠擬合:增多數據特征數、添加高次多項式特征、減小正則化系數λ
實際優化過程中,我們的目標就是使模型處于欠擬合和過擬合之間一個平衡的位置。???
1.3 模型誤差
模型誤差 = 偏差 + 方差 + 不可避免的誤差(噪音)。一般來說,隨著模型復雜度的增加,方差會逐漸增大,偏差會逐漸減小,見下圖:
?
2. SVM的參數gamma(γ),懲罰因子C,正則化參數Lambda(λ)
2.1 懲罰因子C
在SVM的理論分析中我們知道決策平面與支持向量之間有一個距離差,而在實際工程中,參數c正是影響了支持向量與決策平面之間的距離。先看看公式:
C是懲罰因子,決定了你有多重視離群點帶來的損失,有的資料解釋為對誤差的容忍度,其實這句話提到的誤差不是誤差。具體效果為:
c越大,分類越嚴格,不能有錯誤,容易過擬合;
c越小,意味著有更大的錯誤容忍度,容易欠擬合。
具體可以通過下圖展示:
c越大分類結果越好相應的泛化能力降低,c越小,我們的決策邊界更大一些,即在訓練時容忍一些樣本的誤差,拿一些邊界更寬的樣本作為支持向量。
2.2 正則化參數Lambda(λ)
使用處理機器學習中的目標函數時,有時會發生過擬合。此時常常對模型的參數做一定的限制,使得模型偏好更簡單的參數,這就叫“正則化”(regularization)。
最常見的正則化方法,就是(軟性地)限制參數的大小。
設目標函數是要最小化的,所有參數組成向量w。
如果往目標函數上加上(參數向量w的L1范數),這就是L1正則化;
如果往目標函數上加上(參數向量w的L2范數的平方的一半),這就是L2正則化。
L1正則化的優點是優化后的參數向量往往比較稀疏;L2正則化的優點是其正則化項處處可導。
SVM并不是“損失函數”、“正則化”等概念的典型例子。
但是在SVM中正則化參數與懲罰因子成倒數關系,C=1/λ。
所以在SVM的算法中沒再提到正則化參數。
2.3 gamma(γ)參數
gamma是選擇RBF函數作為kernel后,該函數自帶的一個參數。隱含地決定了對低維的樣本進行高維映射到新的特征空間后的分布。
根據RBF公式里面的sigma和gamma的關系如下:
?這里面大家需要注意的就是gamma的物理意義,大家提到很多的RBF的幅寬,它會影響每個支持向量對應的高斯的作用范圍,從而影響泛化性能。我的理解:如果gamma設的太大,sgm(σ)會很小,sgm(σ)很小的高斯分布長得又高又瘦,?會造成只會作用于支持向量樣本附近,對于未知樣本分類效果很差,存在訓練準確率可以很高,(如果讓sgm(σ)無窮小,則理論上,高斯核的SVM可以擬合任何非線性數據,但容易過擬合)而測試準確率不高的可能,就是通常說的過擬合;而如果設的過小,則會造成平滑效應太大,無法在訓練集上得到特別高的準確率,也會影響測試集的準確率。
總結來說就是:
gamma越大,映射的維度越高,訓練的結果越好,支持向量越少,但是越容易引起過擬合,即泛化能力低。
gamma值越小,支持向量越多。支持向量的個數影響訓練與預測的速度,而且也會影響準確率。
?
總結:
過擬合:減小C或gamma;
欠擬合:增大C或gamma。
?
?
二、LS-SVM工具箱實例的一些參數
2.1 模型參數
根據原文:
In order to make an LS-SVM model (with Gaussian RBF kernel), we need two tuning parame-
ters: γ (gam) is the regularization parameter, determining the trade-off between the training error
minimization and smoothness. In the common case of the Gaussian RBF kernel, σ2(sig2) is the
squared bandwidth.
所以實用工具時候的一些參數是存在出入的,需要進行對應。
即:
工具箱中的γ (gam)指的不是上面提到的高斯核參數gamma(γ),而是與懲罰因子C是倒數關系的;
工具箱中的σ2(sig2)與高斯核參數gamma(γ)關系如下:
2.2 輸入樣本以及函數參數
這個直接在函數使用的地方說。
三、LS-SVM工具箱函數使用方法
3.1 函數參數
在一個完整的訓練流程中,每個函數一定要使用相同的參數選項!比如數據是否初始化,在每個函數中都要保持一致。
參數含義:X代表訓練樣本(每一行為一個樣本,則每一列為一維特征);
? ? ? ? ? ? ? ? ? Y代表訓練樣本標簽;
? ? ? ? ? ? ? ? ? type有兩種類型,classfication, 用于分類, function estimation, 用于函數回歸;
? ? ? ? ? ? ? ? ?'RBF_kernel'代表使用的是徑向基核函數,還包括lin_kernel、poly_kernel、MLP_kernel
? ? ? ? ? ? ? ? ? preprocess是數據已經進行歸一化,′original ′是數據沒有進行歸一化, 缺省時是′preprocess′
? ? ? ? ? ? ? ? ?'simplex' 通過在參數空間窮盡對比得到最好的參數。是simplex單純形法(模擬退火法,工具箱默認方法).%'gridsearch'是二次規劃法?
? ? ? ? ? ? ? ? ?crossvalidatelssvm代表使用交叉驗證進行尋優
? ? ? ? ? ? ? ? ?L-fold代表采用L折交叉驗證
3.2 涉及到的函數
尋參函數:tunelssvm
作用:根據尋優方法找到當前輸入訓練集所對應的的最優gam,sig2。其實在函數內部進行了模型訓練,最后取的準確率最高的一組參數。
使用示例:?
[gam,sig2] = tunelssvm({X,Y,type,[],[],'RBF_kernel','preprocess'},'simplex',... 'crossvalidatelssvm',{L_fold,'misclass'});接口函數:initlssvm
作用:將訓練模型當做句柄使用。示例:
model = initlssvm(X,Y,type,[],[],’RBF_kernel’);model = tunelssvm(model,’simplex’,’crossvalidatelssvm’,{L_fold,’misclass’});還包括訓練函數,預測函數,畫圖函數,ROC曲線函數。
具體看例子吧,很簡單的使用,注釋很詳細,沒必要重復說。
四、LS-SVM完整實現過程
4.1 使用參數的方法
close all;clear;clc; X = 2.*rand(100,2)-1; Y = sign(sin(X(:,1))+X(:,2)); %% 參數設置 % gam = 10;sig2 = 0.2;%可以指定,也可以參數尋優找到type = 'classification'; L_fold = 10; % L-fold crossvalidation [gam,sig2] = tunelssvm({X,Y,type,[],[],'RBF_kernel','preprocess'},'simplex',... 'crossvalidatelssvm',{L_fold,'misclass'});%尋優方法還可選'gridsearch'%% 模型訓練和圖形化顯示 [alpha,b] = trainlssvm({X,Y,type,gam,sig2,'RBF_kernel','preprocess'}); plotlssvm({X,Y,type,gam,sig2,'RBF_kernel','preprocess'},{alpha,b});%% 利用訓練模型進行預測 Xt = 2.*rand(10,2)-1; disp(' >> Ytest = simlssvm({X,Y,type,gam,sig2,''RBF_kernel'',''preprocess''},{alpha,b},Xt);'); Ytest = simlssvm({X,Y,type,gam,sig2,'RBF_kernel','preprocess'},{alpha,b},Xt);%% 利用公式計算真實值,并與模型預測結果進行對比 YY = sign(sin(Xt(:,1))+Xt(:,2)); figure subplot(2,1,1) plot(Xt,Ytest,'*'); title('模型預測結果','fontsize',13); subplot(2,1,2) plot(Xt,YY,'*'); title('公式計算結果','fontsize',13); ypred = length(find(Ytest==YY))/(length(Ytest)) * 100; disp(['accuracy = ' ,num2str(ypred),'%'])%% ROC曲線 Y_latent = latentlssvm({X,Y,type,gam,sig2,'RBF_kernel'},{alpha,b},X); %需要潛在的變量來制作ROC曲線 [area,se,thresholds,oneMinusSpec,Sens]=roc(Y_latent,Y); [thresholds oneMinusSpec Sens];4.2 使用接口的方法
%% load 數據 close all;clear;clc; X = 2.*rand(100,2)-1; Y = sign(sin(X(:,1))+X(:,2));type = 'classification'; L_fold = 10; % L-fold crossvalidation%% 獲得對象接口 model = initlssvm(X,Y,type,[],[],'RBF_kernel');%% 參數尋優 model = tunelssvm(model,'simplex','crossvalidatelssvm',{L_fold,'misclass'});%% 模型訓練和圖形化顯示 model = trainlssvm(model); plotlssvm(model);%% 利用訓練模型進行預測 Xt = 2.*rand(10,2)-1; Ytest = simlssvm(model,Xt);%% 利用公式計算真實值,并與模型預測結果進行對比 YY = sign(sin(Xt(:,1))+Xt(:,2)); figure subplot(2,1,1) plot(Xt,Ytest,'*'); title('模型預測結果','fontsize',13); subplot(2,1,2) plot(Xt,YY,'*'); title('公式計算結果','fontsize',13); ypred = length(find(Ytest==YY))/(length(Ytest)) * 100; disp(['accuracy = ' ,num2str(ypred),'%'])%% ROC曲線 % latent variables are needed to make the ROC curve Y_latent = latentlssvm(model,X); [area,se,thresholds,oneMinusSpec,Sens]=roc(Y_latent,Y); [thresholds oneMinusSpec Sens];五、重點是關于尋優的方法
本文上面使用的是默認的模擬退火法,還可以使用遺傳算法,粒子群算法實現。
六、多分類LS-SVM
這里介紹的是二分類SVM,下一篇介紹一下多分類LS-SVM,利用工具箱并不麻煩。將輸入標簽在訓練模型前進行編碼,預測后進行解碼就可以。
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
總結
以上是生活随笔為你收集整理的基于MATLAB的LS-SVM实现方法以及SVM的一些知识点的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 面试了一个2年程序员,竟然只会curd,
- 下一篇: 服务器显示数据库,显示数据库服务器上的数