1. 程式人生 > >SVM多分類(利用libsvm工具箱)

SVM多分類(利用libsvm工具箱)

%SVM 採用RBF函式 解決多分類問題。

%測試用的樣本特徵及標籤存在檔案'test.scale'中。

%針對新的多分類問題,只需要按'test.scale'中的格式替換成所需類別的特徵及標籤即可。
clc;clear;
%讀取資料
[iris_label, iris_data] = libsvmread('test.scale');   

numInst = size(iris_data, 1);   %資料集大小
numLabels = max(iris_label);    %資料種類
 
%將資料隨機分成訓練/測試資料集
idx = randperm(numInst);
numTrain = 4;  %訓練集的資料大小為100
numTest = numInst - numTrain;
trainData = iris_data(idx(1:numTrain),:);       %訓練資料集
testData = iris_data(idx(numTrain+1:end),:);    %測試資料集
trainLabel = iris_label(idx(1:numTrain));
testLabel = iris_label(idx(numTrain+1:end)); 
 
%尋找最佳c/g引數--交叉驗證方法
% [c,g] = meshgrid(-10:0.2:10, -10:0.2:10);
% [m, n] = size(c);
% cg = zeros(m, n);
% eps = 10^(-4);
% v = 5;     %設定為5折交叉驗證
% bestc = 1;
% bestg = 0.1;
% bestacc = 0;
% for i = 1:m
%     for j = 1:n
%         cmd = ['-v ', num2str(v), ' -c ', num2str(2^c(i,j)), ' -g ', num2str(2^g(i,j))];
%         cg(i,j) = svmtrain(trainLabel, trainData, cmd);
%         if cg(i,j) > bestacc
%             bestacc = cg(i,j);
%             bestc = 2^c(i,j);
%             bestg = 2^g(i,j);
%         end
%         if abs(cg(i,j)-bestacc) <= eps && bestc > 2^c(i,j)
%             bestacc = cg(i,j);
%             bestc = 2^c(i,j);
%             bestg = 2^g(i,j);
%         end
%     end
% end
 
% cmd = ['-c ', num2str(bestc), ' -g ', num2str(bestg), ' -b 1'];
cmd = ['-c ', num2str(0.8), ' -g ', num2str(0.6), ' -b 1'];

%使用libsvm建立/訓練 SVM模型
model = svmtrain(trainLabel, trainData, cmd);
 
%用測試資料集檢測訓練的模型
[predictLabel, accuracy, prob] = svmpredict(testLabel,testData, model, '-b 1');
result = [testLabel predictLabel];
 
% %%繪圖
% figure
% plot(1:length(testLabel), testLabel, 'r- *')
% hold on
% plot(1:length(testLabel), predictLabel, 'b:o')
% grid on
% legend('真實類別', '預測類別')
% xlabel('測試集樣本編號')
% ylabel('測試集樣本類別')
% string = strcat('測試集SVM預測結果對比 accuracy= ',num2str(accuracy(1)), '%');
% title(string)