机器学习(三):支持向量机SVM(含代码和注释)
目錄
- 1. 線性可分
- 2. 支持向量機SVM
1. 線性可分
二維空間中,線性可分數據表示為可用一條直線分開兩類數據;若不存在一條直線分開兩類數據,則為非線性可分
可以把它拓展到更高維度空間。若在三維空間中有一個二維平面能分開兩類數據,則為線性可分;否則線性不可分。若在N維空間中有一個N-1維平面能分開兩類數據,則為線性可分;否則線性不可分。
以二維空間為例,若一條直線w1x1 + w2x2 + b = 0能分開兩類數據,則可定義( w1x1 + w2x2 + b < 0) 和 ( w1x1 + w2x2 + b > 0) 來判斷數據屬于哪一類。
最終可定義為:
2. 支持向量機SVM
如果數據是線性可分的,那么肯定存在無數個超平面(直線可看作一維)可以將數據分開。而究竟哪一個超平面最好呢?支持向量機就是為了找到最合適的一個超平面來劃分數據。支持向量機是一個有監督學習算法,需要輸入Xi和輸出標簽Yi。
大多數人可能直觀感覺2號線最好,但是2號線是如何找出來的呢?它一定是最好的嗎?不一定,但是支持向量機可以找到唯一的一條最優直線。
在二維空間中,定義支持向量為直線分別兩側平移,直至接觸到數據,所接觸到的數據被稱為“支持向量”(圖中標紅的樣本點),兩條平移直線間的間隔為Margin
因此,支持向量機SVM尋找的最優分類直線應滿足三個條件:
(1) 該直線分開了兩類;
(2) 該直線最大化間隔margin;
(3) 該直線處于間隔的中間,到所有支持向量距離相等
在高維空間中,直線可換為超平面。尋找最優超平面的問題可以變為用嚴格的數學推導求解最優化問題,結論如下:
具體推導:
首先聲明兩個事實:
基于事實1,我們可以利用a(a不等于0)去縮放w和b,可以看作是在高維空間中,我們選取得超平面( w轉置x+b=0等價于 aw轉置x+ab = 0 )不變,而是通過收縮因子a,將支持向量x0(距離超平面最近的樣本點)拉近到超平面附近,使其滿足|w轉置x0+b| = 1,當然,理論上可以不為1,為了方便表示,取1。
基于事實2,支持向量x0到超平面的距離如下式:(分子等于1是由上面定義 |w轉置x0+b| = 1 得來的)
因此,若想要最大化支持向量到超平面距離d,則需要最小化||w||。(取1/2的||w||的平方是為了方便求導,本質上還是最小化||w||)
由于支持向量到超平面的距離會等于1,支持向量以外的樣本點到超平面的距離會大于1,因此可以得到以下限制條件:
其中,yi是為了協調超平面兩邊的樣本點xi計算(w轉置xi+b>1,此時定義yi = +1)或者(w轉置xi+b < -1 ,此時定義yi = -1),與第一部分線性可分的最終定義類似。
以上是在數據線性可分的情況下的推論,如果數據線性不可分,我們需要對上述推導進行修改,基本思想為將低維空間中線性不可分的數據映射到高維空間,使其在高維空間中線性可分,具體推導不在贅述,可以觀看浙江大學mooc機器學習胡浩基老師的支持向量機課程,以上是觀看老師課程后的簡要筆記+自己的理解,可能存在不足之處。
matlab實現代碼(需要提前導入svm工具包,我的是3.21版本的libsvm,可以對照代碼,修改成自己的數據集):
%% I. 清空環境變量 clear all clc%% II. 導入數據,可換為自己的數據 load BreastTissue_data.mat%% % 1. 隨機產生訓練集和測試集 n = randperm(size(matrix,1));%% % 2. 訓練集——80個樣本 train_matrix = matrix(n(1:80),:); train_label = label(n(1:80),:);%% % 3. 測試集——26個樣本 test_matrix = matrix(n(81:end),:); test_label = label(n(81:end),:);%% III. 數據歸一化 [Train_matrix,PS] = mapminmax(train_matrix'); Train_matrix = Train_matrix'; Test_matrix = mapminmax('apply',test_matrix',PS); Test_matrix = Test_matrix';%% IV. SVM創建/訓練(RBF核函數) %% % 1. 尋找最佳c/g參數——交叉驗證方法 [c,g] = meshgrid(-10:0.2:10,-10:0.2:10); [m,n] = size(c); cg = zeros(m,n); eps = 10^(-4); v = 5; bestc = 1; bestg = 0.1; bestacc = 0; for i = 1:mfor j = 1:ncmd = ['-v ',num2str(v),' -t 2',' -c ',num2str(2^c(i,j)),' -g ',num2str(2^g(i,j))];cg(i,j) = svmtrain(train_label,Train_matrix,cmd); if cg(i,j) > bestaccbestacc = cg(i,j);bestc = 2^c(i,j);bestg = 2^g(i,j);end if abs( cg(i,j)-bestacc )<=eps && bestc > 2^c(i,j) bestacc = cg(i,j);bestc = 2^c(i,j);bestg = 2^g(i,j);end end end cmd = [' -t 2',' -c ',num2str(bestc),' -g ',num2str(bestg)];%% % 2. 創建/訓練SVM模型(利用上面選出的最好參數訓練) model = svmtrain(train_label,Train_matrix,cmd);%% V. SVM仿真測試 [predict_label_1,accuracy_1,~] = svmpredict(train_label,Train_matrix,model); [predict_label_2,accuracy_2,~] = svmpredict(test_label,Test_matrix,model); %result_1 = [train_label predict_label_1]; %result_2 = [test_label predict_label_2];%% VI. 繪圖 figure plot(1:length(test_label),test_label,'r-*') hold on plot(1:length(test_label),predict_label_2,'b:o') grid on legend('真實類別','預測類別') xlabel('測試集樣本編號') ylabel('測試集樣本類別') string = {'測試集SVM預測結果對比(RBF核函數)';['accuracy = ' num2str(accuracy_2(1)) '%']}; title(string)參考結果圖:
總結
以上是生活随笔為你收集整理的机器学习(三):支持向量机SVM(含代码和注释)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 大数据之Spark教程
- 下一篇: python网络爬虫与信息提取视频_Py