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)