資源簡介
借助(線性)孿生支持向量機對二分類問題的求解程序。
代碼片段和文件信息
%?支持向量機Matlab工具箱C-SVC?孿生線性核函數二類分類算法
%?使用平臺?-?Matlab7.12
close?all
clear
clc
load?N_p???%?正類點數據,特征信息存放在列里面
load?N_n???%?負類點數據,特征信息存放在列里面
?
%%?第一步:數據預處理
%?由原來的數據產生80%的訓練數據和20%的預測數據
n_p=size(N_p2);
n_n=size(N_n2);
n1=randperm(n_p);??????%?對1到n的n個正整數進行隨機不重復的排列,形成一個1行n列的矩陣
n1=n1‘;
n2=randperm(n_n);
n2=n2‘;
f_p=floor(4*n_p/5);????%?取80%的數據作為訓練集,其余20%作為預測集
f_n=floor(4*n_n/5);?
data_train_p=N_p(:n1(1:f_p));??????????????????%?正類訓練數據
data_train_n=N_n(:n2(1:f_n));??????????????????%?負類訓練數據
data_train=[data_train_pdata_train_n];?????????%?訓練數據集(含正負類)
Y_train=[ones(1f_p)-ones(1f_n)];?????????????%?訓練數據標簽集?
data_predict_p=N_p(:n1(f_p+1:end));????????????%?正類預測數據
data_predict_n=N_n(:n2(f_n+1:end));????????????%?負類預測數據
data_predict=[data_predict_pdata_predict_n];???%?預測數據集(含正負類)
Y_predict=[ones(1n_p-f_p)-ones(1n_n-f_n)];???%?預測數據標簽集?
%?相關參數初始化
bestAccuracy=0;
k=0;
c1min=-2;
c1max=2;
c2min=-2;
c2max=2;
aac=rand(101);
best_c1=0;best_c2=0;
data_train=data_train‘;
Y_train=Y_train‘;
%%?第二步:數據訓練尋找最優參數c1c2
%??將c1和c2劃分網格進行搜索
indices?=?crossvalind(‘Kfold‘Y_train10);????
tic;
for?c1=2^(c1min):1:2^(c1max)
????for?c2=2^(c2min):1:2^(c2max)
????????%采用K-CV方法將data大致平均分為K組
????????for?run=?1:10
????????????test=(indices?==?run);?train=~test;?
????????????
????????????train_data=data_train(train:);????????????%?訓練數據集(含正類負類點集)?數據信息全在行里面?????????
????????????train_data_label=Y_train(train:);?????????%?訓練集標簽(含正類負類點集)?數據信息全在行里面
????????????
????????????test_data=data_train(test:);??????????????%?預測數據集(含正類負類點集)?數據信息全在行里面
????????????test_data_label=Y_train(test:);???????????%?預測集標簽(含正類負類點集)?數據信息全在行里面
????????????
????????????groupA=ismember(train_data_label1);???????%?分出正類點的位置????????????數據信息全在行里面
????????????groupB=ismember(train_data_label-1);??????%?分出正類點的位置????????????數據信息全在行里面
???????%?關于ismember函數的具體用法,使用help?ismember可以進一步了解
???????
????????????A=train_data(groupA:);????????????????????%?正類訓練數據????????????????數據信息全在行里面
????????????B=train_data(groupB:);???
????????????%用模糊支持向量機訓練數據
????????????[v1v2]=twinsvm_lin_train(ABc1c2);??????
?????????????%下面用驗證集進行驗證并記錄此時的準確率
????????????row=size(test_data1);
????????????result=rand(row1);
????????????test_data1=[test_dataones(row1)];
????????????distance1=abs(test_data1*v1);
????????????distance2=abs(test_data1*v2);
????????????test_distance=min(distance1distance2);
????????????for?run1=1:row
????????????????if?test_distance(run1)==distance1(run1)
????????????????????result(run1)=1;
????????????????else
????????????????????result(run1)=-1;
????????????????end
????????????end
??????????for?run1=1:row
??????????????if?test_data_label(run1)==result(run1)
??????????????????k=k+1;
??????????????end
??????????end
??????????aac(run)=k/row;
??????????k=0;
????????end
????????cv=sum(aac)/10;
????????if?(cv>bestAccuracy)
????????????bestAccuracy=cv;
????????????best_c1=c1;
????????????best_c2=c2;
????????e
?屬性????????????大小?????日期????時間???名稱
-----------?---------??----------?-----??----
?????文件???????1780??2012-05-10?20:37??N_p.mat
?????文件???????1290??2012-07-23?14:28??twinsvm_lin_train.m
?????文件???????5550??2012-09-03?17:56??lin_main.m
?????文件???????1782??2012-05-10?20:36??N_n.mat
-----------?---------??----------?-----??----
????????????????10402????????????????????4
評論
共有 條評論