matlab使用libsvm入門教程——使用matlab安裝配置libsvm以及一個svm分類實例


前言

此教程專注於剛入門的小白, 且博客擁有時效性, 發布於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
  1. 隨機產生訓練集和測試集
n = randperm(size(matrix,1));
  1. 訓練集——80個樣本
train_matrix = matrix(n(1:80),:);
train_label = label(n(1:80),:);
  1. 測試集——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)

在這里插入圖片描述


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM