支援向量機(SVM)演算法的matlab的實現

2021-07-03 16:16:58 字數 4433 閱讀 2793

支援向量機是一種分類演算法之一,matlab中也有相應的函式來對其進行求解;下面貼乙個小例子,這個例子**於我們實際的專案。

clc;

clear;

n=10;

%下面的資料是我們實際專案中的訓練樣例(樣例中有8個屬性)

correctdata=[0,0.2,0.8,0,0,0,2,2];

errordata_reversepharse=[1,0.8,0.2,1,0,0,2,2];

errordata_countloss=[0.2,0.4,0.6,0.2,0,0,1,1];

errordata_x=[0.5,0.5,0.5,1,1,0,0,0];

errordata_lower=[0.2,0,1,0.2,0,0,0,0];

errordata_local_x=[0.2,0.2,0.8,0.4,0.4,0,0,0];

errordata_z=[0.53,0.55,0.45,1,0,1,0,0];

errordata_high=[0.8,1,0,0.8,0,0,0,0];

errordata_countbefore=[0.4,0.2,0.8,0.4,0,0,2,2];

errordata_local_x1=[0.3,0.3,0.7,0.4,0.2,0,1,0];

sampledata=[correctdata;errordata_reversepharse;errordata_countloss;errordata_x;errordata_lower;errordata_local_x;errordata_z;errordata_high;errordata_countbefore;errordata_local_x1];%訓練樣例

type1=1;%正確的波形的類別,即我們的第一組波形是正確的波形,類別號用 1 表示

type2=-ones(1,n-2);%不正確的波形的類別,即第2~10組波形都是有故障的波形,類別號用-1表示

groups=[type1 ,type2]';%訓練所需的類別號

j=1;

%由於沒有測試資料,因此我將錯誤的波形資料輪流從訓練樣例中取出作為測試樣例

fori=2:10

tempdata=sampledata;

tempdata(i,:)=;

svmstruct = svmtrain(tempdata,groups);

species(j) = svmclassify(svmstruct,sampledata(i,:));

j=j+1;

endspecies

輸出結果如下:

-1    -1    -1    -1    -1    -1    -1

1 -1

從結果可以看出:只有第九個被誤判,其它的都是正確的。

上面只是用於說明matlab中支援向量機中函式的用法,因為在訓練集中我只用了乙個正確的波形和九組有故障的波形作為訓練集,因此這種超平面的選取可能不好。但是,在我們的實際的專案中,我們是用到了許多的訓練集的。

上面是呼叫matlab中的函式實現多維屬性中的支援向量機對其進行分類。

下面是自己實現此功能,不呼叫matlab中的支援向量機的函式。**如下:

%主函式

clear all;

clc;

c = 10;

kertype = 'linear';

%訓練樣本

n = 50;

randn('state',6);%可以保證每次每次產生的隨機數一樣

x1 = randn(2,n); %2行n列矩陣

y1 = ones(1,n); %1*n個1

x2 = 5+randn(2,n); %2*n矩陣

y2 = -ones(1,n); %1*n個-1

figure;

plot(x1(1,:),x1(2,:),'bx',x2(1,:),x2(2,:),'k.');

axis([-3

8 -3

8]);

xlabel('x軸');

ylabel('y軸');

hold on;

x = [x1,x2]; %訓練樣本d*n矩陣,n為樣本個數,d為特徵向量個數,在這裡,x為乙個2*100的陣列

y = [y1,y2]; %訓練目標1*n矩陣,n為樣本個數,值為+1或-1,在這裡,y為乙個1*100的陣列

svm = svmtrain(x,y,kertype,c);

plot(svm.xsv(1,:),svm.xsv(2,:),'ro');

%測試[x1,x2] = meshgrid(-2:0.05:7,-2:0.05:7); %x1和x2都是181*181的矩陣

[rows,cols] = size(x1);

nt = rows*cols;

xt = [reshape(x1,1,nt);reshape(x2,1,nt)];

yt = ones(1,nt);

result = svmtest(svm, xt, yt, kertype);

yd = reshape(result.y,rows,cols);

contour(x1,x2,yd,'m');

訓練集函式如下:

function

svm = svmtrain

(x,y,kertype,c)

options = optimset; % options是用來控制演算法的選項引數的向量

options.largescale = 'off';%largescale指大規模搜尋,off表示在規模搜尋模式關閉

options.display = 'off';%這樣設定意味著沒有輸出

n = length(y);%陣列y的長度

h = (y'*y).*kernel(x,x,kertype);%呼叫kernel函式,

f = -ones(n,1); %f為1*n個-1,f相當於quadprog函式中的c

a = ;

b = ;

aeq = y; %相當於quadprog函式中的a1,b1

beq = 0;

lb = zeros(n,1); %相當於quadprog函式中的lb,ub

ub = c*ones(n,1);

a0 = zeros(n,1); % a0是解的初始近似值

[a,fval,exitflag,output,lambda] = quadprog(h,f,a,b,aeq,beq,lb,ub,a0,options);

epsilon = 1e-8;

sv_label = find(abs(a)>epsilon); %0svm.a = a(sv_label);

svm.xsv = x(:,sv_label);

svm.ysv = y(sv_label);

svm.svnum = length(sv_label);

%svm.label = sv_label;

核函式如下:

function

k = kernel

(x,y,type)

%x 維數*個數

switch type

case

'linear'

k = x'*y;

case

'rbf'

delta = 5;

delta = delta*delta;

xx = sum(x'.*x',2);%sum(a,2)**中引數2的意思是將a矩陣a中的按「行」為單位進行求和

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);

end

測試函式如下

function

result = svmtest

(svm, xt, yt, kertype)

temp = (svm.a'.*svm.ysv)*kernel(svm.xsv,svm.xsv,kertype);

total_b = svm.ysv-temp;

b = mean(total_b);

w = (svm.a'.*svm.ysv)*kernel

(svm.xsv,xt,kertype);

result.score = w + b;

y = sign(w+b);

result.y = y;

result.accuracy = size(find(y==yt))/size(yt);

參考資料:

支援向量機(SVM)演算法

支援向量機 support vector machine 是一種分類演算法,通過尋求結構化風險最小來提高學習機泛化能力,實現經驗風險和置信範圍的最小化,從而達到在統計樣本量較少的情況下,亦能獲得良好統計規律的目的。通俗來講,它是一種二類分類模型,其基本模型定義為特徵空間上的間隔最大的線性分類器,即支...

分類演算法SVM(支援向量機

支援向量機 support vector machine svm 的主要思想是 建立乙個最優決策超平面,使得該平面兩側距離該平面最近的兩類樣本之間的距離最大化,從而對分類問題提供良好的泛化能力。對於乙個多維的樣本集,系統隨機產生乙個超平面並不斷移動,對樣本進行分類,直到訓練樣本中屬於不同類別的樣本點...

SVM 支援向量機演算法概述

對不起,看到好東西忍不住搬過來了推薦大家去這看這裡 一 svm的背景簡介 支援向量機 support vector machine 是cortes和vapnik於1995年首先提出的,它在解決小樣本 非線性及高維模式識別中表現出許多特有的優勢,並能夠推廣應用到函式擬合等其他機器學習問題中 10 支援...