SVM多分类问题例子+matlab代码
生活随笔
收集整理的這篇文章主要介紹了
SVM多分类问题例子+matlab代码
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
【代碼在抽取訓練集和測試集部分出錯】
收獲:
1.0 得知libsvm對于多分類問題默認使用的就是1 vs 1; 2.0 得知分類標簽常用+1,-1,但是是任意選擇的,對于多分類問題,建議選擇1,2,3... 3.0 交叉驗證尋找最優的c和gamma效果不錯,但是用時過長。 4.0 libsvm的詳細用法和參數解析:上一頁。1.采用交叉驗證法獲得的最大識別率為98.75,與不適用交叉驗證的區別還是很大的。
2:1 vs rest 代碼待寫…
3.matlab訓練代碼如下:
% libsvm默認的多分類問題就是使用的 1v1; % 可以自己寫1 vs rest clc; clear all; f_id = fopen('iris.data'); if(f_id==2)disp('打開文件失敗');return; end % 讀取全部數據,并獲取全部分類。 % oneFloatFlag = 0; xapp = []; % 全部數據 tagSetData = []; % o tagVerData = []; % s tagVirData = []; % g vec = zeros(6,1); olabel = []; slabel = []; glabel = []; while ~feof(f_id)c = fscanf(f_id,'%f,%f,%f,%f,%s',[1,5]); % 處理一行vec = [c(1);c(2);c(3);c(4)];xapp = [xapp,vec];if (c(13)==111)tagSetData = [tagSetData,vec];olabel = [olabel,1];elseif (c(13)==115)tagVerData = [tagVerData,vec];slabel = [slabel,2];elseif (c(13)==103)tagVirData = [tagVirData,vec];glabel = [glabel,3];end end fclose(f_id); % 總數據 all_data = [tagSetData,tagVerData,tagVirData]; all_label = [olabel,slabel,glabel]; % 打亂數據,然后取80個訓練,70個測試: x_train = []; y_train = []; trainNumber = 80; [N,M] = size(all_data); p = randperm(M); for i = 1:trainNumberx_train = [x_train,all_data(:,p(i))]; % 數據y_train= [y_train,all_label(p(i))]; % 數據的標簽 end x_train = x_train'; y_train = y_train';% 獲取測試樣本 x_test = []; y_test = []; for i =trainNumber+1:Mx_test = [x_test,all_data(i:p(i))];y_test = [y_test,all_label(p(i))]; end x_test = x_test'; y_test = y_test'; % 歸一化數據; [Tn,Tm] = size(x_train); avgX = mean(x_train); stdX = std(x_train); for i = 1:Tn % 以行遍歷所有數據x_train(i,:) = (x_train(i,:)-avgX)./stdX; end [Tn,Tm] = size(x_test); avgX = mean(x_test); stdX = std(x_test); for i = 1:Tn % 以行遍歷所有數據x_test(i,:) = (x_test(i,:)-avgX)./stdX; end%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %SVM Gaussian kernel %Search for the optimal C and gamma, K(x1,x2) = exp{-||x1-x2||^2/gamma} to %make the recognition rate maximum. %Firstly, search C and gamma in a crude scale (as recommended in 'A practical Guide to Support Vector Classification')) CScale = [-5, -3, -1, 1, 3, 5,7,9,11,13,15]; gammaScale = [-15,-13,-11,-9,-7,-5,-3,-1,1,3]; C = 2.^CScale; gamma = 2.^gammaScale; maxRecognitionRate = 0; for i = 1:length(C) % 找到最佳的超參數 c 和 gama 的下標for j = 1:length(gamma) % svm訓練參數設置:cmd=['-t 2 -c ',num2str(C(i)),' -g ',num2str(gamma(j)),' -v 5'];recognitionRate = svmtrain(y_train,x_train,cmd); %訓練數據和參數if recognitionRate>maxRecognitionRatemaxRecognitionRate = recognitionRate;maxCIndex = i;maxGammaIndex = j;endend end % 在一個精確的尺度上搜索最優的C和gamma。(上述求得的尺度) % 尋找最佳c和gama的附近的值;由于CScale和gamaScale是遞增的,所以,小一點往后退,大一點向前走 % 等分長度: n = 10; minScale = 0.5*(CScale(max(1,maxCIndex-1)) + CScale(maxCIndex)); maxScale = 0.5*(CScale(min(length(CScale),maxCIndex+1)) +CScale(maxCIndex)); newCScale = [minScale:(maxScale-minScale)/n:maxScale]; minGammaScale = 0.5*(gammaScale(max(1,maxGammaIndex-1))+gammaScale(maxGammaIndex)); maxGammaScale = 0.5*(gammaScale(min(length(gammaScale),maxGammaIndex+1))+gammaScale(maxGammaIndex)); newGammaScale = [minGammaScale:(maxGammaScale-minGammaScale)/n:maxGammaScale]; newC = 2.^newCScale; newGamma = 2.^newGammaScale; maxRecognitionRate = 0; for i = 1:length(newC) % 找到最佳的超參數 c 和 gama 的下標for j = 1:length(newGamma) % svm訓練參數設置:cmd=['-t 2 -c ',num2str(newC(i)),' -g ',num2str(newGamma(j)),' -v 5'];recognitionRate = svmtrain(y_train,x_train,cmd); %訓練數據和參數if recognitionRate>maxRecognitionRatemaxRecognitionRate = recognitionRate;maxC = i;maxG = j;endend end % 使用上述求得得最好的C和gama訓練模型 cmd=['-t 2 -c ',num2str(maxC),' -g ',num2str(maxG)]; model = svmtrain(y_train,x_train,cmd); save model.mat model; save x_train.mat x_train; save y_train.mat y_train; save x_test.mat x_test; save y_test.mat y_test;總結
以上是生活随笔為你收集整理的SVM多分类问题例子+matlab代码的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: testng接口自动化测试_Java+M
- 下一篇: mysql的告警日志_运维日记|MySQ