%SVM 采用RBF函数 解决多分类问题。
%测试用的样本特征及标签存在文件'test.scale'中。
%针对新的多分类问题,只需要按'test.scale'中的格式替换成所需类别的特征及标签即可。
clc;clear;
%读取数据
[iris_label, iris_data] = libsvmread('test.scale');
% test.scale下载地址:http://download.csdn.net/detail/liuyifang0810680/6216713
numInst = size(iris_data, 1);
numLabels = max(iris_label);
%将数据随机分成训练/测试数据集
idx = randperm(numInst);
numTrain = 4;
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;
% bestc = 1;
% bestg = 0.1;
% bestacc = 0;
% for i = 1:m
%
%
%
%
%
%
%
%
%
%
%
%
%
%
% 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)