MATLAB机器学习系列-7支持向量机原理及其代码实现
生活随笔
收集整理的這篇文章主要介紹了
MATLAB机器学习系列-7支持向量机原理及其代码实现
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
支持向量機原理
分類
如圖,在分類中,我們需要找到一個超平面(圖中包括間隔的平面)把圓圈和方框分開
原問題
間隔最小,同時保證真實輸出和模型輸出積大于1
對偶問題
原先的最小化問題變成了最大化問題,原先的不等式約束變成了等式約束。
引入間隔c之后
核函數
如果在低維空間找不到超平面,這時需要將數據轉換到高維空間。
就需要用到核函數。
回歸
原問題與對偶問題
多分類問題
LIBSVM工具箱介紹
libsvm需要C++編譯器,輸入命令查看
libsvm要求輸入和輸出行相同
如分類器可以設置為
預測
svmpredict(train_label,Train_matrix,model);我這里未安裝,請你們自行安裝
LIBSVM分類
I. 清空環境變量
II. 導入數據
III. 數據歸一化
IV. SVM創建/訓練(RBF核函數)
V. SVM仿真測試
VI. 繪圖
I. 清空環境變量
clear all clcII. 導入數據
load BreastTissue_data.matIII. 數據歸一化
[Train_matrix,PS] = mapminmax(train_matrix'); Train_matrix = Train_matrix'; Test_matrix = mapminmax('apply',test_matrix',PS); Test_matrix = Test_matrix';IV. SVM創建/訓練(RBF核函數)
V. SVM仿真測試
[predict_label_1,accuracy_1] = svmpredict(train_label,Train_matrix,model); [predict_label_2,accuracy_2] = svmpredict(test_label,Test_matrix,model); result_1 = [train_label predict_label_1]; result_2 = [test_label predict_label_2];Accuracy = 96.25% (77/80) (classification)
Accuracy = 57.6923% (15/26) (classification)
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)LIBSVM回歸
%% I. 清空環境變量 clear all clc%% II. 導入數據 load concrete_data.mat%% % 1. 隨機產生訓練集和測試集 n = randperm(size(attributes,2));%% % 2. 訓練集——80個樣本 p_train = attributes(:,n(1:80))'; t_train = strength(:,n(1:80))';%% % 3. 測試集——23個樣本 p_test = attributes(:,n(81:end))'; t_test = strength(:,n(81:end))';%% III. 數據歸一化 %% % 1. 訓練集 [pn_train,inputps] = mapminmax(p_train'); pn_train = pn_train'; pn_test = mapminmax('apply',p_test',inputps); pn_test = pn_test';%% % 2. 測試集 [tn_train,outputps] = mapminmax(t_train'); tn_train = tn_train'; tn_test = mapminmax('apply',t_test',outputps); tn_test = tn_test';%% IV. SVM模型創建/訓練 %% % 1. 尋找最佳c參數/g參數 [c,g] = meshgrid(-10:0.5:10,-10:0.5:10); [m,n] = size(c); cg = zeros(m,n); eps = 10^(-4); v = 5; bestc = 0; bestg = 0; error = Inf; for i = 1:mfor j = 1:ncmd = ['-v ',num2str(v),' -t 2',' -c ',num2str(2^c(i,j)),' -g ',num2str(2^g(i,j) ),' -s 3 -p 0.1'];cg(i,j) = svmtrain(tn_train,pn_train,cmd);if cg(i,j) < errorerror = cg(i,j);bestc = 2^c(i,j);bestg = 2^g(i,j);endif abs(cg(i,j) - error) <= eps && bestc > 2^c(i,j)error = cg(i,j);bestc = 2^c(i,j);bestg = 2^g(i,j);endend end%% % 2. 創建/訓練SVM cmd = [' -t 2',' -c ',num2str(bestc),' -g ',num2str(bestg),' -s 3 -p 0.01']; model = svmtrain(tn_train,pn_train,cmd);%% V. SVM仿真預測 [Predict_1,error_1] = svmpredict(tn_train,pn_train,model); [Predict_2,error_2] = svmpredict(tn_test,pn_test,model);%% % 1. 反歸一化 predict_1 = mapminmax('reverse',Predict_1,outputps); predict_2 = mapminmax('reverse',Predict_2,outputps);%% % 2. 結果對比 result_1 = [t_train predict_1]; result_2 = [t_test predict_2];%% VI. 繪圖 figure(1) plot(1:length(t_train),t_train,'r-*',1:length(t_train),predict_1,'b:o') grid on legend('真實值','預測值') xlabel('樣本編號') ylabel('耐壓強度') string_1 = {'訓練集預測結果對比';['mse = ' num2str(error_1(2)) ' R^2 = ' num2str(error_1(3))]}; title(string_1) figure(2) plot(1:length(t_test),t_test,'r-*',1:length(t_test),predict_2,'b:o') grid on legend('真實值','預測值') xlabel('樣本編號') ylabel('耐壓強度') string_2 = {'測試集預測結果對比';['mse = ' num2str(error_2(2)) ' R^2 = ' num2str(error_2(3))]}; title(string_2)代碼可以不用網格搜索尋找最優參數,直接指定參數‘
代碼和數據百度云
鏈接:https://pan.baidu.com/s/1w50keCHeEfx5djVaOZlsUg 提取碼:1l82 復制這段內容后打開百度網盤手機App,操作更方便哦作者:電氣工程的計算機萌新-余登武
總結
以上是生活随笔為你收集整理的MATLAB机器学习系列-7支持向量机原理及其代码实现的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 电动自行车仪表盘上像闪电一样的符号是什么
- 下一篇: 神经网络的梯度消失和过拟合产生原因及其解