資料集需要自行處理,這裡針對的是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 我們的目標是要找出一條直線...