日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

机器学习(三):支持向量机SVM(含代码和注释)

發(fā)布時間:2025/3/15 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 机器学习(三):支持向量机SVM(含代码和注释) 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

目錄

  • 1. 線性可分
  • 2. 支持向量機SVM

1. 線性可分

二維空間中,線性可分數(shù)據(jù)表示為可用一條直線分開兩類數(shù)據(jù);若不存在一條直線分開兩類數(shù)據(jù),則為非線性可分

可以把它拓展到更高維度空間。若在三維空間中有一個二維平面能分開兩類數(shù)據(jù),則為線性可分;否則線性不可分。若在N維空間中有一個N-1維平面能分開兩類數(shù)據(jù),則為線性可分;否則線性不可分。


以二維空間為例,若一條直線w1x1 + w2x2 + b = 0能分開兩類數(shù)據(jù),則可定義( w1x1 + w2x2 + b < 0) 和 ( w1x1 + w2x2 + b > 0) 來判斷數(shù)據(jù)屬于哪一類。

最終可定義為:

2. 支持向量機SVM

如果數(shù)據(jù)是線性可分的,那么肯定存在無數(shù)個超平面(直線可看作一維)可以將數(shù)據(jù)分開。而究竟哪一個超平面最好呢?支持向量機就是為了找到最合適的一個超平面來劃分數(shù)據(jù)。支持向量機是一個有監(jiān)督學習算法,需要輸入Xi和輸出標簽Yi。

大多數(shù)人可能直觀感覺2號線最好,但是2號線是如何找出來的呢?它一定是最好的嗎?不一定,但是支持向量機可以找到唯一的一條最優(yōu)直線。
在二維空間中,定義支持向量為直線分別兩側(cè)平移,直至接觸到數(shù)據(jù),所接觸到的數(shù)據(jù)被稱為“支持向量”(圖中標紅的樣本點),兩條平移直線間的間隔為Margin

因此,支持向量機SVM尋找的最優(yōu)分類直線應(yīng)滿足三個條件:
(1) 該直線分開了兩類;
(2) 該直線最大化間隔margin;
(3) 該直線處于間隔的中間,到所有支持向量距離相等
在高維空間中,直線可換為超平面。尋找最優(yōu)超平面的問題可以變?yōu)橛脟栏竦臄?shù)學推導求解最優(yōu)化問題,結(jié)論如下:

具體推導:
首先聲明兩個事實:


基于事實1,我們可以利用a(a不等于0)去縮放w和b,可以看作是在高維空間中,我們選取得超平面( w轉(zhuǎn)置x+b=0等價于 aw轉(zhuǎn)置x+ab = 0 )不變,而是通過收縮因子a,將支持向量x0(距離超平面最近的樣本點)拉近到超平面附近,使其滿足|w轉(zhuǎn)置x0+b| = 1,當然,理論上可以不為1,為了方便表示,取1。

基于事實2,支持向量x0到超平面的距離如下式:(分子等于1是由上面定義 |w轉(zhuǎn)置x0+b| = 1 得來的)

因此,若想要最大化支持向量到超平面距離d,則需要最小化||w||。(取1/2的||w||的平方是為了方便求導,本質(zhì)上還是最小化||w||)

由于支持向量到超平面的距離會等于1,支持向量以外的樣本點到超平面的距離會大于1,因此可以得到以下限制條件:

其中,yi是為了協(xié)調(diào)超平面兩邊的樣本點xi計算(w轉(zhuǎn)置xi+b>1,此時定義yi = +1)或者(w轉(zhuǎn)置xi+b < -1 ,此時定義yi = -1),與第一部分線性可分的最終定義類似。

以上是在數(shù)據(jù)線性可分的情況下的推論,如果數(shù)據(jù)線性不可分,我們需要對上述推導進行修改,基本思想為將低維空間中線性不可分的數(shù)據(jù)映射到高維空間,使其在高維空間中線性可分,具體推導不在贅述,可以觀看浙江大學mooc機器學習胡浩基老師的支持向量機課程,以上是觀看老師課程后的簡要筆記+自己的理解,可能存在不足之處。

matlab實現(xiàn)代碼(需要提前導入svm工具包,我的是3.21版本的libsvm,可以對照代碼,修改成自己的數(shù)據(jù)集):

%% I. 清空環(huán)境變量 clear all clc%% II. 導入數(shù)據(jù),可換為自己的數(shù)據(jù) load BreastTissue_data.mat%% % 1. 隨機產(chǎn)生訓練集和測試集 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. 數(shù)據(jù)歸一化 [Train_matrix,PS] = mapminmax(train_matrix'); Train_matrix = Train_matrix'; Test_matrix = mapminmax('apply',test_matrix',PS); Test_matrix = Test_matrix';%% IV. SVM創(chuàng)建/訓練(RBF核函數(shù)) %% % 1. 尋找最佳c/g參數(shù)——交叉驗證方法 [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. 創(chuàng)建/訓練SVM模型(利用上面選出的最好參數(shù)訓練) 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('真實類別','預(yù)測類別') xlabel('測試集樣本編號') ylabel('測試集樣本類別') string = {'測試集SVM預(yù)測結(jié)果對比(RBF核函數(shù))';['accuracy = ' num2str(accuracy_2(1)) '%']}; title(string)

參考結(jié)果圖:

與50位技術(shù)專家面對面20年技術(shù)見證,附贈技術(shù)全景圖

總結(jié)

以上是生活随笔為你收集整理的机器学习(三):支持向量机SVM(含代码和注释)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。