【SVM】通过SVM对数据进行训练和分类测试,matlab仿真
生活随笔
收集整理的這篇文章主要介紹了
【SVM】通过SVM对数据进行训练和分类测试,matlab仿真
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
0.完整源碼獲得方式
方式1:微信或者QQ聯系博主
方式2:訂閱MATLAB/FPGA教程,免費獲得教程案例以及任意2份完整源碼
1.軟件版本
MATLAB2021a
2.本算法理論知識
3.核心代碼
clc; clear; close all; warning off;%第一步: %第一步: %第一步: %為了簡化計算,可對得到的圖像特征數據進行標準化 %將數據通過函數變換映射到[0.1,1] %二元化0表示“非火”,1表示“火” Data_nfire0 = xlsread('train\data1.xls','Sheet1','A2:CL983'); Data_fire0 = xlsread('train\data2.xls','Sheet1','A2:CL1257'); %火與非火的特征標簽名稱 [Data_nfire_tmp,Data_nfire_Name,alldata] = xlsread('train\data1.xls','Sheet1','A1:CL1'); [Data_fire_tmp,Data_fire_Name,alldata] = xlsread('train\data2.xls','Sheet1','A1:CL1'); %特征的名稱 Data_nfire_Name; Data_fire_Name;%由于數據量較大, 可以將特征序列適當的縮短 %進行標準化處理使其值域在0.1~1之間 %先進行歸一化 Data_nfire1 = (Data_nfire0-min(min(Data_nfire0)))/(max(max(Data_nfire0))-min(min(Data_nfire0))); Data_fire1 = (Data_fire0-min(min(Data_fire0)))/(max(max(Data_fire0))-min(min(Data_fire0))); %進行映射,最好采用線性映射 Data_nfire2 = (Data_nfire1 + 1)/2; Data_fire2 = (Data_fire1 + 1)/2; %分別對火和非火數據進行標記1和0 [m1,n1] = size(Data_nfire2); Data_nfire3 = [Data_nfire2,zeros(m1,1)]; [m2,n2] = size(Data_fire2); Data_fire3 = [Data_fire2,ones(m2,1)];%第二步: %第二步: %第二步: %圖像特征集合中信息特征的篩選:包括單因素方差分析和巴氏距離分析兩個并行子模塊。 %該步驟是數據進行初步篩選,剔除非信息特征,獲得各自相應的信息特征,為下一步研究做鋪墊。 %也就是說,假設某個特征對于火焰圖像樣本和干擾源圖像樣本的數據分析結果基本沒有區別, %那么則認為這個特征與火焰識別是無關的,將其歸類為非信息特征中。 Len = min(m1,m2); for i = 1:n1[p1,table1,stats1] = anova1([Data_nfire2(1:Len,i),Data_fire2(1:Len,i)]);[c1,m0,h1,gnames1] = multcompare(stats1); Stds(i) = c1(4);pp{i} = abs(Stds(i));close all; end Stds_abs = abs(Stds); level = mean(Stds_abs); indexs = find(Stds_abs < level); Data_nfire4 = [Data_nfire3(:,indexs),Data_nfire3(:,end)]; Data_fire4 = [Data_fire3(:,indexs),Data_fire3(:,end)];%將火每個特征的概率p保存到p.xls中 values = Data_fire0(:,indexs); headers = Data_fire_Name(indexs); xlswrite('p1.xls', headers,'sheet1','A1'); xlswrite('p1.xls', values,'sheet1','A2'); %將非火每個特征的概率p保存到p.xls中 values = Data_nfire0(:,indexs); headers = Data_fire_Name(indexs); xlswrite('p0.xls', headers,'sheet1','A1'); xlswrite('p0.xls', values,'sheet1','A2');%巴氏距離分析. for i = 1:n1bdistance(i) = func_bhattacharyya_distance(Data_nfire2(:,i),Data_fire2(:,i));pp2{i} = bdistance(i); end level2 = mean(bdistance); indexs2 = find(bdistance < level2); Data_nfire5 = [Data_nfire3(:,indexs2),Data_nfire3(:,end)]; Data_fire5 = [Data_fire3(:,indexs2),Data_fire3(:,end)];%將火每個特征的概率p保存到b.xls中 values = Data_fire0(:,indexs2); headers = Data_fire_Name(indexs2); xlswrite('b1.xls', headers,'sheet1','A1'); xlswrite('b1.xls', values,'sheet1','A2'); %將非火每個特征的概率p保存到b.xls中 values = Data_nfire0(:,indexs2); headers = Data_fire_Name(indexs2); xlswrite('b0.xls', headers,'sheet1','A1'); xlswrite('b0.xls', values,'sheet1','A2');%取他們的交集,從而獲得代表非火的特征序列 p = 0; for i = 1:length(indexs)for j = 1:length(indexs2)if indexs(i) == indexs2(j)p = p + 1;indexs0(p) = indexs(i);endend end Data_nfire6 = [Data_nfire3(:,indexs0),Data_nfire3(:,end)]; Data_fire6 = [Data_fire3(:,indexs0),Data_fire3(:,end)];%將火和非火的交集分別保存到pb1.xls中和pb0.xls中 headers_tmp = Data_fire_Name(indexs0); xlswrite('pb.xls',headers_tmp); %將標簽轉換為標號,同時寫入到xls文件中 headers_tmp1 = indexs0; values1 = Data_fire2(:,indexs0); xlswrite('pb1.xls',[headers_tmp1;values1]);headers_tmp0 = indexs0; values0 = Data_nfire2(:,indexs0); xlswrite('pb0.xls',[headers_tmp0;values0]); %第三步: %第三步: %第三步: %K均值聚類與有效特征子集的生成:包括K均值聚類子模型和主特征選擇子模型。 %該步驟對上一步驟的結果做進一步處理,產生多個有效特征子集。 Is_fire_0 = values0; Is_fire_1 = values1;Cluster_Num = 4; %對非火數據計算得到了四類不同特征的特征集合 Data = Is_fire_0(:,1:end-1); [row,col] = size(Data); Step = 100; %將特征數據分為4類,每類表示不同的特征值域 %聚類中心的初始化 Center = Data(:,1:Cluster_Num); %進行初始的迭代 [KindData,KindNum] = func_Kmeans_Cluster(Center,Data); NewCenter = func_NewCenter(KindData,KindNum,row); while (sum(sum(NewCenter ~= Center))) & StepCenter = NewCenter;[KindData,KindNum] = func_Kmeans_Cluster(Center,Data);NewCenter = func_NewCenter(KindData,KindNum,row);Step = Step-1; end%對非火數據計算得到了四類不同特征的特征集合 Is_fire_0_feature = KindData;%對火數據計算得到了四類不同特征的特征集合 Data = Is_fire_1(:,1:end-1); [row,col] = size(Data); Step = 100; %將特征數據分為4類,每類表示不同的特征值域 %聚類中心的初始化 Center = Data(:,1:Cluster_Num); %進行初始的迭代 [KindData,KindNum] = func_Kmeans_Cluster(Center,Data); NewCenter = func_NewCenter(KindData,KindNum,row); while (sum(sum(NewCenter ~= Center))) & StepCenter = NewCenter;[KindData,KindNum] = func_Kmeans_Cluster(Center,Data);NewCenter = func_NewCenter(KindData,KindNum,row);Step = Step-1; end%對非火數據計算得到了四類不同特征的特征集合 Is_fire_1_feature = KindData;%獲得特征數據中的非0值 for ii = 1:Cluster_Numtmp0 = Is_fire_0_feature(:,:,ii);tmp0s = tmp0(tmp0~=0); Feature_0{ii} = tmp0s;clear tmp0 tmp0s end for ii = 1:Cluster_Numtmp1 = Is_fire_1_feature(:,:,ii);tmp1s = tmp1(tmp1~=0); Feature_1{ii} = tmp1s;clear tmp1 tmp1s end%處理,獲得非0部分,即所需要的特征值 for j = 1:Cluster_NumIND0 = min(find(Is_fire_0_feature(1,:,j) == 0))-1;IND1 = min(find(Is_fire_1_feature(1,:,j) == 0))-1;Final_Fire0{j} = Is_fire_0_feature(:,1:IND0,j);Final_Fire1{j} = Is_fire_1_feature(:,1:IND1,j); end%將每個特征對應的名稱保存到K1.xls和K0.xls這兩個文件中 Name0 = func_find_name(Data_nfire2,n1,Cluster_Num,Final_Fire0); Name1 = func_find_name(Data_fire2 ,n2,Cluster_Num,Final_Fire1);%將分類后的類別保存到XLS文件中 headers_tmp = Data_fire_Name(Name0{1}); xlswrite('K01.xls',headers_tmp); headers_tmp = Data_fire_Name(Name0{2}); xlswrite('K02.xls',headers_tmp); headers_tmp = Data_fire_Name(Name0{3}); xlswrite('K03.xls',headers_tmp); headers_tmp = Data_fire_Name(Name0{4}); xlswrite('K04.xls',headers_tmp);headers_tmp = Data_fire_Name(Name1{1}); xlswrite('K11.xls',headers_tmp); headers_tmp = Data_fire_Name(Name1{2}); xlswrite('K12.xls',headers_tmp); headers_tmp = Data_fire_Name(Name1{3}); xlswrite('K13.xls',headers_tmp); headers_tmp = Data_fire_Name(Name1{4}); xlswrite('K14.xls',headers_tmp);%第四步: %第四步: %第四步: %使用支持向量機和神經網絡以及統計方法對上面的多個特征子集合進行識別仿真,得到效果最NB的特征子集 %將分組后的火特征數據以及非火特征數據組合成一個數據,然后再加入1和0的標志位進行訓 %由于Final_Fire0,Final_Fire1是MXN類型的數據,所以將其轉換為1XM的數據for k = 1:Cluster_Num[ms,ns] = size(Final_Fire0{k});Feature_0s{k} = (reshape(Final_Fire0{k},1,ms*ns))'; end for k = 1:Cluster_Num[ms,ns] = size(Final_Fire1{k});Feature_1s{k} = (reshape(Final_Fire1{k},1,ms*ns))'; end for k = 1:Cluster_Numdata{k} = [Feature_1s{k};Feature_0s{k}];%由于每一個子集的特征向量的行列均不同,因此將同一子集的數據合并為一個一維的數據%然后對每一列新的特征數據集合進行標志,進行下一步的計算Target{k} = [ones(length(Feature_1s{k}),1);-1*ones(length(Feature_0s{k}),1)]; end% SVM % %注意,采用支持向量機的方法,這里由于數據量較大,普通計算機無法處理,故直接采用神經網絡和統計的方法分析識別率 % C = 0.1719; % ker = struct('type','linear'); % svm = svmTrain('svc_c',data{k},Target{k},ker,C); %神經網絡 %首先使用設計網絡的方法對四個特征子集合進行訓練 for k = 1:Cluster_Numt1 = clock; %計時開始net = fitnet(33);net.trainParam.epochs = 5000; %設置訓練次數net.trainParam.goal = 0.05; %設置性能函數net.trainParam.show = 1; %每10顯示net.trainParam.Ir = 0.05; %設置學習速率net = train(net,(data{k})',(Target{k})'); %訓練BP網絡datat = etime(clock,t1);Nets{k} = net; endfor k = 1:Cluster_Numview(Nets{k}); end %進行測試 for k = 1:Cluster_Numnet = Nets{k};Result{k} = sim(net,(data{k})'); end figure; subplot(221);plot(Result{1}); subplot(222);plot(Result{2}); subplot(223);plot(Result{3}); subplot(224);plot(Result{4});%計算識別率 thershold = 0.5;%識別率誤差門限 tmp = 0; rates = zeros(Cluster_Num,1); for k = 1:Cluster_Numfor j = 1:length(Result{k})if abs(Result{k}(j) - Target{k}(j)) <= abs(thershold*Target{k}(j))tmp = tmp + 1;rates(k) = tmp;elsetmp = tmp;rates(k) = tmp; endendrates(k) = rates(k)/length(Result{k});tmp = 0; enddisp('識別率為:'); rates'[Max_value,Max_index] = max(rates);disp('最佳的特征子集合為:第'); Max_index disp('集合');headers_tmp0 = Name0{Max_index}; values0 = Data_nfire0(:,Name0{Max_index}); xlswrite('best0.xls',[headers_tmp0;values0]); headers_tmp1 = Name1{Max_index}; values1 = Data_fire0(:,Name1{Max_index}); xlswrite('best1.xls',[headers_tmp1;values1]); %顯示出具體的名稱 Best_Name0 = Data_nfire_Name(headers_tmp0); Best_Name1 = Data_fire_Name(headers_tmp1);%統計模型 thershold = 0.01;%識別率誤差門限 tmp = 0; rates = zeros(Cluster_Num,1); for k = 1:Cluster_Numfor j = 1:length(Result{k})if abs((data{k}(j)-mean(data{k})) * Target{k}(j)) <= abs(thershold*Target{k}(j))tmp = tmp + 1;rates(k) = tmp;elsetmp = tmp;rates(k) = tmp; endendrates(k) = rates(k)/length(Result{k});tmp = 0; enddisp('識別率為:'); rates'[Max_value,Max_index] = max(rates);disp('最佳的特征子集合為:第'); Max_index disp('集合');headers_tmp0 = Name0{Max_index}; values0 = Data_nfire0(:,Name0{Max_index}); xlswrite('best0.xls',[headers_tmp0;values0]); headers_tmp1 = Name1{Max_index}; values1 = Data_fire0(:,Name1{Max_index}); xlswrite('best1.xls',[headers_tmp1;values1]); %顯示出具體的名稱 Best_Name0 = Data_nfire_Name(headers_tmp0); Best_Name1 = Data_fire_Name(headers_tmp1);4.操作步驟與仿真結論
運行main.m
?
5.參考文獻
[1]王艷潔, 楊琳, 金樺. 基于改進SVM與輔助信息的數據分類研究[J]. 2022(2).
D199
總結
以上是生活随笔為你收集整理的【SVM】通过SVM对数据进行训练和分类测试,matlab仿真的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【Kmeans】基于Kmeans的聚类算
- 下一篇: 【MORE协议】基于MORE的改进协议设