生活随笔
收集整理的這篇文章主要介紹了
SVM分类问题
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
監(jiān)督式學(xué)習(xí)(Supervised Learning)常用算法包括:線性回歸(Linear Regression)、邏輯回歸(Logistic Regression)、神經(jīng)網(wǎng)絡(luò)(Neural Network)以及支持向量機(jī)(Support Vector Machine,SVM)等。支持向量機(jī)與邏輯回歸算法類似,都是解決二分類或多分類問(wèn)題,但是SVM在非線性回歸預(yù)測(cè)方面具有更優(yōu)秀的分類效果,所以SVM又被稱為最大間距分類器。
本文不對(duì)支持向量機(jī)的原理進(jìn)行詳細(xì)解釋,直接運(yùn)用matlab自帶的工具箱函數(shù)svmtrain、svmclassify解決實(shí)際的二分類問(wèn)題。
導(dǎo)入數(shù)據(jù):
clear; close all; clc;%% ================ load fisheriris.mat ================load fisheriris.mat
1、對(duì)于線性分類問(wèn)題,我們選取線性核函數(shù),原始數(shù)據(jù)包括訓(xùn)練數(shù)據(jù)和測(cè)試數(shù)據(jù)兩部分。
data = meas(51:end,3:4); % column 3,column 4作為特征值group = species(51:end); % 類別idx = randperm(size(data,1));N = length(idx); % SVM trainT = floor(N*0.9); % 90組數(shù)據(jù)作為訓(xùn)練數(shù)據(jù)xdata = data(idx(1:T),:);xgroup = group(idx(1:T));svmStr = svmtrain(xdata,xgroup,'Showplot',true);
訓(xùn)練過(guò)程得到結(jié)構(gòu)體svmStr,對(duì)測(cè)試數(shù)據(jù)進(jìn)行預(yù)測(cè)
% SVM predictP = floor(N*0.1); % 10組預(yù)測(cè)數(shù)據(jù)ydata = data(idx(T+1:end),:);ygroup = group(idx(T+1:end));pgroup = svmclassify(svmStr,ydata,'Showplot',true); % svm預(yù)測(cè)hold on;plot(ydata(:,1),ydata(:,2),'bs','Markersize',12);accuracy1 = sum(strcmp(pgroup,ygroup))/P*100; % 預(yù)測(cè)準(zhǔn)確性hold off;
程序運(yùn)行結(jié)果如下:
圖中,方塊*號(hào)表示測(cè)試數(shù)據(jù)的預(yù)測(cè)結(jié)果,accuracy1結(jié)果為90%(上下浮動(dòng))。
2、對(duì)于非線性分類問(wèn)題,我們選取高斯核函數(shù)RBF,原始數(shù)據(jù)包括訓(xùn)練數(shù)據(jù)和測(cè)試數(shù)據(jù)兩部分。
訓(xùn)練過(guò)程前,導(dǎo)入原始數(shù)據(jù):
data = meas(51:end,1:2); % column 1,column 2作為特征值group = species(51:end); % 類別idx = randperm(size(data,1));N = length(idx); % SVM trainT = floor(N*0.9); % 90組數(shù)據(jù)作為訓(xùn)練數(shù)據(jù)xdata = data(idx(1:T),:);xgroup = group(idx(1:T));
對(duì)于高斯核函數(shù),有兩個(gè)參數(shù)對(duì)SVM的分類效果有著重要的影響:一個(gè)是sigma;另一個(gè)是C。
首先討論sigma的影響,sigma反映了RBF函數(shù)從最大值點(diǎn)向周圍函數(shù)值下降的速度,sigma越大,下降速度越慢,對(duì)應(yīng)RBF函數(shù)越平緩;sigma越小,下降速度越快,對(duì)應(yīng)RBF函數(shù)越陡峭。對(duì)于不同的sigma,程序代碼:
% different sigmafigure;sigma = 0.5;svmStr = svmtrain(xdata,xgroup,'kernel_function','rbf','rbf_sigma',...sigma,'showplot',true);title('sigma = 0.5');figure;sigma = 1;svmStr = svmtrain(xdata,xgroup,'kernel_function','rbf','rbf_sigma',...sigma,'showplot',true);title('sigma = 1');figure;sigma = 3;svmStr = svmtrain(xdata,xgroup,'kernel_function','rbf','rbf_sigma',...sigma,'showplot',true);title('sigma = 3');
分類平面分別如下:
從圖中可以看出,sigma越小,分類曲線越復(fù)雜,事實(shí)也確實(shí)如此。因?yàn)閟igma越小,RBF函數(shù)越陡峭,下降速度越大,預(yù)測(cè)過(guò)程容易發(fā)生過(guò)擬合問(wèn)題,使分類模型對(duì)訓(xùn)練數(shù)據(jù)過(guò)分?jǐn)M合,而對(duì)測(cè)試數(shù)據(jù)預(yù)測(cè)效果不佳。
然后討論C的影響,程序代碼如下:
% different Cfigure;C = 1;svmStr = svmtrain(xdata,xgroup,'kernel_function','rbf','boxconstraint',...C,'showplot',true);title('C = 0.1');figure;C = 8;svmStr = svmtrain(xdata,xgroup,'kernel_function','rbf','boxconstraint',...C,'showplot',true);title('C = 1');figure;C = 64;svmStr = svmtrain(xdata,xgroup,'kernel_function','rbf','boxconstraint',...C,'showplot',true);title('C = 10');
分類平面如下:
從圖中可以發(fā)現(xiàn),C越大,分類曲線越復(fù)雜,也就是說(shuō)越容易發(fā)生過(guò)擬合,因?yàn)镃對(duì)應(yīng)邏輯回歸的lambda的倒數(shù)。
若令sigma=1,C=1,則對(duì)測(cè)試數(shù)據(jù)的預(yù)測(cè)程序:
% SVM predictP = floor(N*0.1); % 10組預(yù)測(cè)數(shù)據(jù)ydata = data(idx(T+1:end),:);ygroup = group(idx(T+1:end));% sigma = 1,C = 1,defaultfigure;svmStr = svmtrain(xdata,xgroup,'kernel_function','rbf','showplot',true);pgroup = svmclassify(svmStr,ydata,'Showplot',true); % svm預(yù)測(cè)hold on;plot(ydata(:,1),ydata(:,2),'bs','Markersize',12);accuracy2 = sum(strcmp(pgroup,ygroup))/P*100; % 預(yù)測(cè)準(zhǔn)確性hold off;
程序運(yùn)行結(jié)果如下:
圖中,方塊*號(hào)表示測(cè)試數(shù)據(jù)的預(yù)測(cè)結(jié)果,accuracy2結(jié)果為70%(上下浮動(dòng))。
分類效果不佳因?yàn)閮蓚€(gè)特征量的選擇,可以選擇更合適的特征量。
本文轉(zhuǎn)自:https://blog.csdn.net/red_stone1/article/details/54313821
總結(jié)
以上是生活随笔為你收集整理的SVM分类问题的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。