SVM線性分類MATLAB實現

2022-09-20 06:12:10 字數 1741 閱讀 4621

資料集需要自行處理,這裡針對的是cancer資料集

clear

ticload('c:\users\administrator\desktop\cancer.mat')

mu=cancer(1:444,:);zi=cancer(445:end,:); %整理資料,第一列(1,2)作為標籤

cycle_n=1; %進行cycle_n次交叉驗證

n=10; %n=10十折

c=100;

[n1,col]=size(mu);

[n2,col]=size(zi);

q1=floor(n1/n);q2=floor(n2/n);

%acc=zeros(1,10);mcc=zeros(1,10);f1=zeros(1,10);

for kk=1:cycle_n %進行nn次交叉訓練

for k=1:n %每次交叉訓練為n折

if k==1

pos_train=mu(q1+1:end,:);pos_test=mu(1:q1,:);

non_train=zi(q2+1:end,:);non_test=zi(1:q2,:);

elseif k==n

pos_train=mu(1:q1*(k-1),:);pos_test=mu(q1*(k-1)+1:end,:);

non_train=zi(1:q2*(k-1),:);non_test=zi(q2*(k-1)+1:end,:);

else

pos_train=[mu(1:q1*(k-1),:);mu(q1*k:end,:)];

non_train=[zi(1:q2*(k-1),:);zi(q2*k:end,:)];

pos_test=mu(q1*(k-1)+1:q1*k-1,:);

non_test=zi(q2*(k-1)+1:q2*k-1,:);

endpos_train_r=size(pos_train,1);non_train_r=size(non_train,1); %計算正類負類訓練集的行數

train=[pos_train;non_train]; %合併得到訓練集

train_num=pos_train_r+non_train_r; %訓練集的資料點數

y1=[ones(pos_train_r,1);-ones(non_train_r,1)];%訓練點的標籤

pos_test_r=size(pos_test,1);non_test_r=size(non_test,1);

test=[pos_test;non_test]; %合併得到測試集

test_num=pos_test_r+non_test_r; %測試集的資料點數

y2=[ones(pos_test_r,1);-ones(non_test_r,1)];%測試點的標籤

q=diag(y1)*train*train'*diag(y1);

f=-ones(train_num,1);

aeq=y1'; %給一系列輸入值賦值

beq=0;

vlb=zeros(train_num,1);vub=c*ones(train_num,1);

alpha=quadprog(q,f,,,aeq,beq,vlb,vub); %二次規劃求解結束

w=alpha'*diag(y1)*train; %把標籤寫成對角陣

temp_index=find(alpha>0 & alpha');

Matlab 線性分類器與SVM

利用最小二乘法求線性分類器係數 如下 function w,b leastsquares traindata,trainlabel 最小二乘法線性分類器 nums,demens size traindata traindata traindata,ones nums,1 r traindata tr...

SVM輸出分類概率的matlab實現

說明 1 資料的標籤在最後一列 2 tr 訓練資料,te 測試資料 3 svm的引數說明 s svm型別 svm設定型別 預設0 0 c svc 1 v svc 2 一類svm 3 e svr 4 v svr t 核函式型別 核函式設定型別 預設2 0 線性核函式 u v 1 多項式核函式 ru v...

線性svm簡單推導及其matlab實現(未完待續)

如圖1所示,有a b兩類資料,a類資料有 a 1,a 2,a 3 三個樣本點,它們的座標分別為 a a a a a a a 類資料的標籤為 t a 1 b類資料有 b 1,b 2,b 3 三個樣本點,它們的座標分別是 b b b b b b b 類資料的標籤為 t b 1 我們的目標是要找出一條直線...