前言
此教程專注於剛入門的小白, 且博客擁有時效性, 發布於2019年3月份, 可能后面的讀者會發現一些問題, 歡迎底下評論出現的問題,我將盡可能更新解決方案。
我開始也在如何安裝libsvm上出現了很多問題, 而網上的解決方案大都有一些問題,且發布時間比較早, 方案已經過時,於是我把經歷的坑總結起來,供大家學習
版本聲明
我的matlab版本為2016a, win10系統, 安裝的是最新版的libsvm, version3.2.3
一,配置libsvm
1.首先需要下載libsvm包:
http://www.csie.ntu.edu.tw/~cjlin/libsvm/
2.將libsvm3.2.3解壓到matlab/toolbox目錄下:
若不知道路徑在哪, 可以點擊設置路徑來找到
3. 在設置路徑里把剛才加入的libsvm3.2.3 加入到路徑
注意matlab和windows這兩個文件夾都要加入 否則將會出錯
4.將當前路徑設置到libsvm 3.2.3/matlab 后,在命令行窗口運行
mex -setup
若已經安裝c++編譯環境則會出現下面的情況, (我已經安裝過VS 2017了) 若提示沒有c++編譯環境則需要自己安裝環境了,
直接點擊用c++編譯
5. 源碼編譯
打開當前目錄下的make.m文件
將其中所的CFLAGS替換為COMPFLAGS(替換運用CTRL+F即可),替換后執行make則可以編譯成功。(這里我已經改完了, 一般沒改的話 都是CFLAGS) 這里也就是以前教程忽略的一點,沒有這一步將出現編譯失敗
編譯完之后可以得到多出的這四個后綴為mexw64文件, 這說明我們已經完成安裝了
二, 使用libsvm進行分類
首先給出實例地址 方便下載 https://github.com/wangjiwu/BreastTissue_classify_matlab
這里給出了101個數據, 每一個數據都有9個特征和一個分類標簽
用這些數據來生成測試集和訓練集, 得到模型並且測試,分類
代碼流程
I. 清空環境變量
clear all
clc
II. 導入數據
load BreastTissue_data.mat
- 隨機產生訓練集和測試集
n = randperm(size(matrix,1));
- 訓練集——80個樣本
train_matrix = matrix(n(1:80),:);
train_label = label(n(1:80),:);
- 測試集——26個樣本
test_matrix = matrix(n(81:end),:);
test_label = label(n(81:end),:);
III. 數據歸一化
%% III. 數據歸一化
[Train_matrix,PS] = mapminmax(train_matrix');
Train_matrix = Train_matrix';
Test_matrix = mapminmax('apply',test_matrix',PS);
Test_matrix = Test_matrix';
IV. SVM創建/訓練(RBF核函數)
這里使用的是交叉驗證的方法 選出等距的多種c和g訓練找到最合適的c和g,如果訓練時間較長可以直接輸入參數,跳過這一步
cmd = ' -t 2 -c 42.2243 -g 2.639'
若參數不知道具體的代表意思可參考此博客
https://blog.csdn.net/mrfortitude/article/details/59558037
[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
for j = 1:n
cmd = ['-v ',num2str(v),' -t 2',' -c ',num2str(2^c(i,j)),' -g ',num2str(2^g(i,j))];
cg(i,j) = svmtrain(train_label,Train_matrix,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 = [' -t 2',' -c ',num2str(bestc),' -g ',num2str(bestg)];
創建/訓練SVM模型
model = svmtrain(train_label,Train_matrix,cmd);
V. SVM仿真測試
注意一定要 傳入3個參數而不是兩個, 且 測試lable 是m1的矩陣, 測試矩陣是mn的矩陣 m為樣本個數, n為特征個數
[predict_label_1,accuracy_1,prob_estimates] = svmpredict(train_label,Train_matrix,model);
[predict_label_2,accuracy_2,prob_estimates2] = svmpredict(test_label,Test_matrix,model);
result_1 = [train_label predict_label_1];
result_2 = [test_label predict_label_2];
結果如下
VI. 繪圖
figure
plot(1:length(test_label),test_label,'r-*')
hold on
plot(1:length(test_label),predict_label_2,'b:o')
grid on
legend('真實類別','預測類別')
xlabel('測試集樣本編號')
ylabel('測試集樣本類別')
string = {'測試集SVM預測結果對比(RBF核函數)';
['accuracy = ' num2str(accuracy_2(1)) '%']};
title(string)