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