支持向量机实现鸢尾花数据集分类matlab
問題描述:
在進行感知機,以及邏輯斯蒂回歸問題的討論中,我們都以二分類問題為例。其中對于線性不可分的數據集,感知機和邏輯斯蒂回歸已然失效,邏輯斯蒂回歸對感知機進行的優化,是進行了一種思維上的“偷懶”,不再武斷地判斷預測數據屬于哪個類,而是“圓滑”地告訴我們該數據屬于哪一個的概率多大,通過對極大似然函數的參數估計,實現了模型的學習;通過極大似然估計,實現了數據類別的預測。但是這種優化并沒有對線性不可分數據集提出解決方法,支持向量機,運用了幾何間隔最大化(硬間隔或軟間隔)和核技巧,將問題通過拉格朗日對偶轉化,“投靠”了更高維的空間,即將線性不可分的數據集通過核技巧映射到高維空間(事實上,支持向量機并沒有直接將空間進行映射,而是通過核技巧將內積進行從歐氏空間到希爾伯特空間的轉換),企圖從高維空間找到一個超平面能將數據集正確分類。
直觀思路:
該思路的比較直觀的解釋,如果我們利用有限的特征不能將事物分類,那么我們可以將這些有限的特征通過某些關系組合構成新的特征從而識別出某類事物。如圖1是原始數據集在某平面的映射,可見它是線性不可分的,我們通過
圖1 擁有兩個特征的數據集
核技巧可以將其“映射”到高維空間,我們猜想在高維空間這個數據集是線性可分的,于是得到圖2,重新映射后,發現可以進行線性分類。
圖2 三維空間的映射
圖3 重新找到一個平面進行映射
適用范圍:
二分類模型,屬于非線性分類器,策略為間隔最大化。
對于數據集不同的情況,采取的學習策略也不同。
圖4 超平面與支持向量
直觀理解:如果一個樣例點靠近我們的超平面,我們將它對應的 增大,類似于懲罰,為了使松弛變量發揮作用,設置一個懲罰參數,作為上界, 如果大于這個參數則均取得這個參數,以便于讓松弛項發揮作用。當松弛變量 =0,則說明不需要進行軟約束既滿足正確分類且滿足硬間隔最大化,樣例在間隔邊界上;當松弛變量增大,說明該樣例已經進入了兩個間隔之間,松弛變量的數值越大,則說明我們需要對這個樣采取更放松的條件,當放松的條件超過某個值,即 >1,說明該樣例已經被目前的超平面錯誤分類。
待續。。。
概念補充:
關于“凸”
實例運行:
預先準備了數據集,數據為隨機生成,并且根據預設的函數關系(為驗證SVM的有效性,采用了非線性的函數關系),進行了分類。
使用了線性可分以及線性不可分的數據集對不同的核函數進行測試和驗證,以下為測試結果。
圖 5 線性核函數
圖 6 線性核函數準確率
圖 7 高斯核函數
圖 8 高斯核函數準確率
圖 9 sigmoid核函數
圖 10 sigmoid核函數準確率
圖 11 多項式核函數
圖 12 多項式核函數準確率
線性不可分數據集:
圖 13 線性核函數
圖 14 線性核函數準確率
圖 15 高斯核函數
圖 16 高斯核函數準確率
圖 17 sigmoid核函數
圖 18 sigmoid核函數準確率
圖 19 多項式核函數
圖 20 多項式核函數準確率
結論:
由上不難看出,對于線性可分的數據集,線性核函數表現良好,但多項式核函數表現欠佳;但對于線性不可分數據集,則情況相反。高斯核函數對于兩種情況表現都比較好,這說明高斯核函數對于空間映射更具有普適性。
基于支持向量機的多分類問題:
方法一:One-Versus-Rest(一對多)
訓練時依次把某個類別的樣本歸為一類,其他剩余的樣本歸為另一類,這樣k個類別的樣本就構造出了k個SVM。分類時將未知樣本分類為具有最大分類函數值的那類。
優點:
分類速度快,分離超平面個數為數據類別數。缺點:存在分類重疊與不可分類現象。
分類重疊現象:
在進行測試時,對于每一類label,svm模型都會選擇說測試數據屬于這一類,導致都想“爭搶”測試樣本;此類問題比較容易解決,選擇一個置信度最高的類即可(幾何間隔最大)。
不可分類現象:
在進行測試時,對于每一類label,svm都會說不屬于自己這一類,導致都選擇“排斥”測試樣本,這導致多分類svm失效。
數據集偏斜現象:
訓練集本身,對于每一類樣本數據個數不對等,相差較多的情況,這樣學得的超平面,為了保證間隔最小,會導致讓小數據類別更多地被誤分類,這是不難理解的,因為犧牲小部分樣例誤分類如果可以讓大數目樣本更多的被正確分類,這種犧牲對于損失函數下降是有意義的,從而導致在測試時本屬于小數目樣本的數據可能被誤分類為大數目的樣本類別中。One-Versus-Rest 方案正是人為的造成了數據集偏斜。
方法二:One-Versus-One(一對一)
具體做法是在任意兩類樣本之間設計一個SVM,因此k個類別的樣本就需要設計k(k-1)/2個SVM。當對一個未知樣本進行分類時,最后得票最多的類別即為該未知樣本的類別。在訓練時往往比一對多花的時間少,并且由于采用了投票表決的方式,一定程度上解決了樣本不可分問題,但是分類的類別多的時候,會使svm數目爆炸。
方法三:Directed Acyclic Graph SVM(有向無環圖)DAG SVM
DAG存在的一個問題是單分類器的誤判代價較高。如上圖若根分類器判斷錯誤,輸入真實類別為A,卻被錯分至右邊,這次誤判將直接導致輸入不會被正確分類。故而在選擇根分類器時需選擇魯棒性較強的一個二分類器,子樹的根分類器同理。
方法四:層次支持向量機
待續。。。
參考:
機器學習中對核函數的理解:
https://link.zhihu.com/?target=http%3A//mp.weixin.qq.com/s%3F__biz%3DMzIxNDIwMTk2OQ%3D%3D%26mid%3D2649077019%26idx%3D1%26sn%3De0c4a6c502e3668e1dc410f21e531cfd%26scene%3D0%23wechat_redirect
核函數的定義和作用是什么?:
https://www.zhihu.com/question/24627666
機器學習概念篇:一文詳解凸函數和凸優化,干貨滿滿
https://mp.weixin.qq.com/s?src=11×tamp=1619016438&ver=3022&signature=vq2-rqI8DivdbDhKDqFMHs3Pc7uV-eZr3yWYxWxlMdktd4m4tTrA5q0X8I8GwZbo8QcFZKWWU5X1sakYzBPFviW7siF48zmFxf-ww-RF4AX5eaINFwM2tRxmQS*FfJ&new=1
拉格朗日對偶性
https://zhuanlan.zhihu.com/p/45431511
線性可分支持向量機推廣到線性不可分(四)
https://zhuanlan.zhihu.com/p/42773288
機器學習-白板推導系列(七)-核方法(Kernel Method)筆記
https://zhuanlan.zhihu.com/p/337498283
支持向量機SVM—實現多分類問題的解決方案
https://blog.csdn.net/weixin_44822636/article/details/110820652
算法原理代碼
%% 樣本準備 close;clear;clc;data_features = 3; [train_data,train_label,test_data,test_label,m1,n1,m2,n2] = data_build(1000,data_features,0.5); %% 模型訓練 Kernel = 'mullinear';% Kernel 核技巧備選:gaussian linear sigmoid mullinear triangle svm = train_svm(train_data',train_label',Kernel,10); % svm = train_svm(X,Y,kertype,C) C為變量上界(懲罰因子) svm為結構體 %% 模型測試 result = test_svm(svm,test_data',test_label',Kernel); fprintf('訓練完成!\n應用模型:SVM 支持向量機\n優化算法:interior-point-convex\n核函數:%s\n測試集識別率為:%f\n',Kernel,result.accuracy); %% 作圖顯示數據以及訓練結果;中間為支持向量[二維] draw_svm(train_data,train_label,svm,data_features,Kernel);function [train_data,train_label,test_data,test_label,m1,n1,m2,n2] = data_build(data_num,data_features,k) % [train,test] = data_build(data_num,data_features,k) % 功能:生成數據并實現訓練集和測試集分類 % 語法和參數列表: % [train_data,train_label,test_data,test_label,m1,n1,m2,n2] = data_build(data_num,data_features,k) % input: % data_num -- 數據總量 % data_features -- 特征維數 % k -- 用于訓練的比例 % % output: % 返回訓練集與測試集的數據及標簽(類別) % 名稱一一對應不再注釋 % m1,n1,m2,n2分別為train_data,test_data的行列數data = randn(data_num,data_features); label = zeros(data_num,1);for i = 1:data_num% 根據數據特征數目設置分類依據if data_features == 2 % if data(i,1)^2+data(i,2)^2 > 1if data(i,1)+data(i,2) > 1label(i)=1;elselabel(i)=-1;endelseif data_features > 2if data(i,1)^2+data(i,2)^2+data(i,3)^2 < 1label(i)=1;elselabel(i)=-1;endend end% 亂序排列 randIndex = randperm(data_num); data_new=data(randIndex,:); label_new=label(randIndex,:);k = k*data_num; train_data=data_new(1:k,:); train_label=label_new(1:k,:); test_data=data_new(k+1:end,:); test_label=label_new(k+1:end,:); [m1,n1] = size(train_data); [m2,n2] = size(test_data); endfunction draw_svm(train_data,train_label,svm,data_features,Kernel) % 功能說明:根據數據特征的維數判斷,進而分別繪圖 % 函數語法及參數列表:draw_svm(inputArg1,data_features) % input: % train_data: 訓練數據集 % train_label:訓練集數據的類別 % svm:svm結構體(詳見train_svm,help train_svm) % data_features特征維數switch data_featurescase 2plot(train_data(train_label==1,1),train_data(train_label==1,2),'ro',train_data(train_label==-1,1),train_data(train_label==-1,2),'go');hold on;plot(svm.data(1,:),svm.data(2,:),'mo');hold on;title(['樣本分布',Kernel]); % 顯示支持向量 'mo'品紅色的圈otherwiseplot3(train_data(train_label==1,1),train_data(train_label==1,2),train_data(train_label==1,3),'r.');hold on;plot3(train_data(train_label==-1,1),train_data(train_label==-1,2),train_data(train_label==-1,3),'gx');hold on;plot3(svm.data(1,:),svm.data(2,:),svm.data(3,:),'mo');hold on;title(['樣本分布',Kernel]); end endfunction K = kernel(X,Y,kerneltype) % 功能:支持多種核運算; % 語法結構:K = kernel(X,Y,kerneltype),kerneltype選擇核技巧 % 'linear':線性內積 % K(v1,v2) = <v1,v2> % 'gaussian':高斯核 % % K(v1,v2)=exp(-gama||v1-v2||^2) % 'sigmoid':sigmoid核;雙曲正切函數 % K(v1,v2)=tanh(gama<v1,v2>+c) % 'mullinear':多項式核 % K(v1,v2)=<v1,v2>^d;d為多項式的次數 % 'triangle':三角核 % K(v1,v2)=-||v1-v2||^d% 在svm中運用線性,高斯或者sigmoid效果比較好 switch kerneltypecase 'linear' % 線性內積K = X'*Y;case 'sigmoid'belta = 0.01;theta = 0.001;K = tanh(belta*X'*Y+theta);case 'gaussian'% k(v1,v2) = exp(-||v1-v2||^2/(2sigma^2))delta = 2*1.414;delta = delta*delta;XX = sum(X'.*X',2);YY = sum(Y'.*Y',2);XY = X'*Y;K = abs(repmat(XX,[1 size(YY,1)]) + repmat(YY',[size(XX,1) 1]) - 2*XY);K = exp(-K./delta);case 'mullinear'K = (X'*Y).^2; % case'triangle' % K = -norm(X-Y,1)^2;end endfunction result = test_svm(svm, test_data, test_label, kerneltype) % 功能說明: % 完成測試集的預測以及準確率的輸出 % 語法習慣核參數列表:result = test(svm, test_data, test_label, kerneltype) % input: % svm: train_svm函數返回的結構體(詳見help train_svm) % test_data: 測試數據 % test_label:測試集標簽 % kerneltype:核技巧種類,形式參數,可選:linear gaussian sigmoid mullinear triangle % output: % result:結構體,屬性如下 % result.Y:測試集中數據的預測類別 result.Y ∈{+1,-1} % result.accuracy:測試集的準確率% 教材非線性支持向量機學習算法的策略為選擇a的一個正分量0< a <C進行計算 % 此處選擇了對所有滿足0< ai <C求得bi,并對b進行取平均運算 sum_b = svm.label - (svm.a'.* svm.label)*kernel(svm.data,svm.data,kerneltype); b = mean(sum_b); w = (svm.a'.* svm.label)*kernel(svm.data,test_data,kerneltype);% 統一起見,令 w = sigma(ai*yi*K(x,xi) result.Y = sign(w+b);% 加外殼符號函數進行分類 result.accuracy = size(find(result.Y==test_label))/size(test_label);% 預測正確的數據數目/總測試集數目 end function svm = train_svm(train_data,train_label,kertype,C) % 功能說明:完成SVM訓練 % 語法習慣與參數列表:svm = train_svm(train_data,train_label,kertype,B) % input: % train_data:訓練數據 % train_label:訓練數據的類別 % kertype:核函數的類別 % C 懲罰參數 % B 為變量約束中的上界 % output: % svm:是一個結構體,包含屬性如下: % svm.a :得到的凸二次規劃的解 % svm.data : 支持向量 % svm.label :支持向量的類別 % ------------*************************··········· % ------------關鍵函數quadprog的一些說明··········· % 函數quadprog:用于解二次規劃問題 % 問題描述: % min(x): 0.5·x'·H·x + f'·x % % A·x <= b, % s.t.: Aeq·x = beq; % lb <=x <= ub; % % 全參數語法結構:x = quadprog(H,f,A,b,Aeq,beq,lb,ub,x0,options); % 變量說明: % H,A,Qeq是矩陣,f,b,beq,lb,ub,x是向量 % options:選擇優化算法并進行設置 % 優化選項設置,對屬性進行設置: % 使用 optimoptions 或 optimset 創建選項(屬性); % 指定為 optimoptions 的輸出或 optimset 等返回的結構體。% 變量初始化以及超參設置 n = length(train_label); % 對變量的自由約束,上下界 H = (train_label'*train_label).*kernel(train_data,train_data,kertype);% H為yi*yj*K(xi,xj) f = -ones(n,1); % 保證f為列向量,原式中包含轉置操作 A = [];% 不含不等約束 b = [];% 不含不等約束 Aeq = train_label; % s.t.: aY = 0; beq = 0; % s.t.: aY = 0; lb = zeros(n,1); % 解:a 的范圍 ub = C*ones(n,1); % 0 <= a <= C a0 = zeros(n,1); % a0是解的初始近似值 options = optimset; % 'interior-point-convex'(默認優化算法) options.Display = 'iter-detailed';% 顯示優化步驟% x = quadprog(H,f,A,b,Aeq,beq,lb,ub,x0,options) 使用 options 中指定的優化選項求解上述問題。 % 使用 optimset 創建 options。如果不提供初始點,設置 x0 = []。 a = quadprog(H,f,A,b,Aeq,beq,lb,ub,a0,options);% 尋找支持向量;a>e 則認為train_data為支持向量 函數find查找邏輯為真的索引 e = 1e-4; sv_index = find(abs(a)>e); svm.a = a(sv_index); svm.data = train_data(:,sv_index);% 作圖顯示支持向量位置 svm.label = train_label(sv_index); end鳶尾花數據集SVM實戰
一 數據集信息:
··是一個很小的數據集,僅有150行,5列,每類有50個數據。該數據集的四個特征屬性的取值都是數值型的,他們具有相同的量綱,不需要做任何標準化的處理,第五列為通過前面四列所確定的鳶尾花所屬的類別名稱。
·數據集處理:為了增加實驗的科學性,隨機將樣本打亂了順序,進行重新排列。
二 2分類(基于前兩個特征):
首先完成課程的任務,即根據前一百條數據的前兩個特征完成學習,進行對鳶尾花的有效分類,并標注支持向量以及分離超平面效果如圖2-1,圖中紅色與綠色代表正負樣例,品紅色為支持向量,直線為分離超平面。
圖2-1 基于前一百個樣本兩個特征的分類
圖2-2 識別準確率
三 2分類(基于四個特征):
對于依靠前兩個特征,已經能夠將 ‘setosa’ 'versicolor’兩類正確分類,現嘗試利用四個特征對其進行分類,來驗證在有冗余分類特征的前提下,支持向量機是否還能應對。采用核函數仍然為’linear’,結果如圖3-1,準確率如圖3-2,增加數據特征維數之后,表現仍然良好,這是容易解釋的,因為鳶尾花數據集本身就是線性可分的。
參考:
鳶尾花(iris)數據集
https://www.gairuo.com/p/iris-dataset
代碼
%% 數據預處理和導入 close;clear;clc [train_data,train_label,test_data,test_label,m1,n1,m2,n2] = data_set(0.6,100); %% 模型訓練 Kernel = 'linear';% Kernel 核技巧備選:gaussian linear sigmoid mullinear svm = train_svm(train_data',train_label',Kernel,10); % svm = train_svm(X,Y,kertype,C) C為變量上界(懲罰因子) svm為結構體 %% 模型測試 result = test_svm(svm,test_data',test_label',Kernel); fprintf('訓練完成!\n應用模型:SVM 支持向量機\n優化算法:interior-point-convex\n核函數:%s\n測試集識別率為:%f\n',Kernel,result.accuracy); %% 作圖顯示數據以及訓練結果;中間為支持向量[三維] draw_svm(train_data,train_label,svm,3,Kernel);function [train_data,train_label,test_data,test_label,m1,n1,m2,n2] = data_set(k,data_num) % 功能說明:完成數據的預處理,setosa:1 versicolor:2 virginica:3 % 調用語法及參數說明:[data_iris,data_label] = data_set(); % load('data_iris.mat');load('data_label.mat'); data_label = zeros(data_num,1); for i = 1:data_numswitch species(i)case 'setosa'data_label(i) = 1;case 'versicolor'data_label(i) = -1; % case 'virginica' % data_label(i) = 3;end end data_iris = iris(1:data_num,:);% 亂序排列 randIndex = randperm(data_num); data_new=data_iris(randIndex,:); label_new=data_label(randIndex,:);% 分為兩組,比例k用于訓練,剩余用于測試 k = k*data_num; train_data=data_new(1:k,:); train_label=label_new(1:k,:); test_data=data_new(k+1:end,:); test_label=label_new(k+1:end,:); [m1,n1] = size(train_data); [m2,n2] = size(test_data); endfunction draw_svm(train_data,train_label,svm,data_features,Kernel) % 功能說明:根據數據特征的維數判斷,進而分別繪圖 % 函數語法及參數列表:draw_svm(inputArg1,data_features) % input: % train_data: 訓練數據集 % train_label:訓練集數據的類別 % svm:svm結構體(詳見train_svm,help train_svm) % data_features特征維數switch data_featurescase 2plot(train_data(train_label==1,1),train_data(train_label==1,2),'ro',train_data(train_label==-1,1),train_data(train_label==-1,2),'go');hold on;plot(svm.data(1,:),svm.data(2,:),'mo');hold on;title(['樣本分布',Kernel]); % 顯示支持向量 'mo'品紅色的圈[x1,x2] = meshgrid(4:0.01:7,2:0.01:5);[rows,cols] = size(x1); nt = rows*cols; Xt = [reshape(x1,1,nt);reshape(x2,1,nt)];Yt = ones(1,nt);result = test_svm(svm, Xt, Yt,Kernel);Yd = reshape(result.Y,rows,cols);contour(x1,x2,Yd,'m');otherwiseplot3(train_data(train_label==1,1),train_data(train_label==1,2),train_data(train_label==1,3),'r.');hold on;plot3(train_data(train_label==-1,1),train_data(train_label==-1,2),train_data(train_label==-1,3),'gx');hold on;plot3(svm.data(1,:),svm.data(2,:),svm.data(3,:),'mo');hold on;title(['樣本分布',Kernel]); end endfunction K = kernel(X,Y,kerneltype) % 功能:支持多種核運算; % 語法結構:K = kernel(X,Y,kerneltype),kerneltype選擇核技巧 % 'linear':線性內積 % K(v1,v2) = <v1,v2> % 'gaussian':高斯核 % % K(v1,v2)=exp(-gama||v1-v2||^2) % 'sigmoid':sigmoid核;雙曲正切函數 % K(v1,v2)=tanh(gama<v1,v2>+c) % 'mullinear':多項式核 % K(v1,v2)=<v1,v2>^d;d為多項式的次數 % 'triangle':三角核 % K(v1,v2)=-||v1-v2||^d% 在svm中運用線性,高斯或者sigmoid效果比較好 switch kerneltypecase 'linear' % 線性內積K = X'*Y;case 'sigmoid'belta = 0.01;theta = 0.001;K = tanh(belta*X*Y+theta);case 'gaussian'% k(v1,v2) = exp(-||v1-v2||^2/(2sigma^2))delta = 2*1.414;delta = delta*delta;XX = sum(X'.*X',2);YY = sum(Y'.*Y',2);XY = X'*Y;K = abs(repmat(XX,[1 size(YY,1)]) + repmat(YY',[size(XX,1) 1]) - 2*XY);K = exp(-K./delta);case 'mullinear'K = (X'*Y).^2; % case'triangle' % K = -norm(X-Y,1)^2;end endfunction result = test_svm(svm, test_data, test_label, kerneltype) % 功能說明: % 完成測試集的預測以及準確率的輸出 % 語法習慣核參數列表:result = test(svm, test_data, test_label, kerneltype) % input: % svm: train_svm函數返回的結構體(詳見help train_svm) % test_data: 測試數據 % test_label:測試集標簽 % kerneltype:核技巧種類,形式參數,可選:linear gaussian sigmoid mullinear triangle % output: % result:結構體,屬性如下 % result.Y:測試集中數據的預測類別 result.Y ∈{+1,-1} % result.accuracy:測試集的準確率% 教材非線性支持向量機學習算法的策略為選擇a的一個正分量0< a <C進行計算 % 此處選擇了對所有滿足0< ai <C求得bi,并對b進行取平均運算 sum_b = svm.label - (svm.a'.* svm.label)*kernel(svm.data,svm.data,kerneltype); b = mean(sum_b); w = (svm.a'.* svm.label)*kernel(svm.data,test_data,kerneltype);% 統一起見,令 w = sigma(ai*yi*K(x,xi) result.Y = sign(w+b);% 加外殼符號函數進行分類 result.plotx = min(test_data(1,:)):0.001: max(test_data(1,:));result.accuracy = size(find(result.Y==test_label))/size(test_label);% 預測正確的數據數目/總測試集數目 endfunction svm = train_svm(train_data,train_label,kertype,C) % 功能說明:完成SVM訓練 % 語法習慣與參數列表:svm = train_svm(train_data,train_label,kertype,B) % input: % train_data:訓練數據 % train_label:訓練數據的類別 % kertype:核函數的類別 % C 懲罰參數 % B 為變量約束中的上界 % output: % svm:是一個結構體,包含屬性如下: % svm.a :得到的凸二次規劃的解 % svm.data : 支持向量 % svm.label :支持向量的類別 % ------------*************************··········· % ------------關鍵函數quadprog的一些說明··········· % 函數quadprog:用于解二次規劃問題 % 問題描述: % min(x): 0.5·x'·H·x + f'·x % % A·x <= b, % s.t.: Aeq·x = beq; % lb <=x <= ub; % % 全參數語法結構:x = quadprog(H,f,A,b,Aeq,beq,lb,ub,x0,options); % 變量說明: % H,A,Qeq是矩陣,f,b,beq,lb,ub,x是向量 % options:選擇優化算法并進行設置 % 優化選項設置,對屬性進行設置: % 使用 optimoptions 或 optimset 創建選項(屬性); % 指定為 optimoptions 的輸出或 optimset 等返回的結構體。% 變量初始化以及超參設置 n = length(train_label); % 對變量的自由約束,上下界 H = (train_label'*train_label).*kernel(train_data,train_data,kertype);% H為yi*yj*K(xi,xj) f = -ones(n,1); % 保證f為列向量,原式中包含轉置操作 A = [];% 不含不等約束 b = [];% 不含不等約束 Aeq = train_label; % s.t.: aY = 0; beq = 0; % s.t.: aY = 0; lb = zeros(n,1); % 解:a 的范圍 ub = C*ones(n,1); % 0 <= a <= C a0 = zeros(n,1); % a0是解的初始近似值 options = optimset; % 'interior-point-convex'(默認優化算法) options.Display = 'iter-detailed';% 顯示優化步驟% x = quadprog(H,f,A,b,Aeq,beq,lb,ub,x0,options) 使用 options 中指定的優化選項求解上述問題。 % 使用 optimset 創建 options。如果不提供初始點,設置 x0 = []。 a = quadprog(H,f,A,b,Aeq,beq,lb,ub,a0,options);% 尋找支持向量;a>e 則認為train_data為支持向量 函數find查找邏輯為真的索引 e = 1e-4; sv_index = find(abs(a)>e); svm.a = a(sv_index); svm.data = train_data(:,sv_index);% 作圖顯示支持向量位置 svm.label = train_label(sv_index); end注:
writer :M寶可夢
引用請注明出處,謝謝合作!
處理之后的數據集及完整代碼見:
https://download.csdn.net/download/weixin_46257458/18477867
總結
以上是生活随笔為你收集整理的支持向量机实现鸢尾花数据集分类matlab的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: QQ浏览器被上网导航劫持
- 下一篇: 基于Adaboost实现鸢尾花数据集分类