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