1. 程式人生 > >容易理解的視覺詞袋模型的matlab程式設計實現

容易理解的視覺詞袋模型的matlab程式設計實現

clear all;
close all;
clc;
load D:\碩士學習資料3\碩士畢設資料\區域生長等分割演算法程式\遺傳分割\MYGAseg\特徵選擇\traindata.mat
load D:\碩士學習資料3\碩士畢設資料\區域生長等分割演算法程式\遺傳分割\MYGAseg\特徵選擇\testdata.mat
load D:\碩士學習資料3\碩士畢設資料\區域生長等分割演算法程式\遺傳分割\MYGAseg\特徵選擇\trainlabel.mat
load D:\碩士學習資料3\碩士畢設資料\區域生長等分割演算法程式\遺傳分割\MYGAseg\特徵選擇\testlabel.mat
%注意這裡我的traindata和testdata儲存的時候都是一張圖片變成了19維的特徵向量,traindata是166*19的,也就是有
%166張圖片,所以我這裡要做一下預處理,一張圖片是1*19,因為聚類時是一行代表一箇中心的維數,所以要變成19*1,最後的聚類中心應該是8個,也就是一張圖片
%1*8,變成8*1%注意這裡要聚類的是將19個特徵變成8個聚類中心
traindata1=traindata';%reshape函式是按照列優先進行重組的
traindata1=reshape(traindata1,1,size(traindata1,1)*size(traindata1,2));
traindata1=traindata1';%這樣就把所有的訓練樣本變成了每一張圖片的特徵都按照列進行排列了
    
[trainL,trainC]= kmeanspp(traindata1,8);%這個函式使用的是Kmeans++,返回的C是對應的資料聚類中心,返回的L是對應的資料點所歸屬的
%標號,注意標號與返回的資料聚類中心是相對應的,之所以選擇8是因為特徵選擇的結果是8
%trainC也就是聚類中心的座標就是它所代表的標號
%上面的聚類只是為了找聚類中心
% A=hist(trainL);%統計直方圖
% dictionary=A(find(A~=0));%將那些是0的去掉,hist的結果裡有一些是0,統計的是中心點的頻數
% dictionary=dictionary./mtrain;%歸一化變成詞頻
[m1,n1]=size(trainC);
[m,n]=size(traindata);
mindis1=zeros(m,m1);%這個只是為了記錄中間結果
dictionarytrain=zeros(m,m1);%統計詞頻
for i=1:m
    for j=1:n
        for k=1:m1
       mindis1(i,k)=abs(traindata(i,j)-trainC(k,:));%求距離哪個中心點最小
        end
       [y,mink] =min(mindis1(i,:));
       dictionarytrain(i,mink)=dictionarytrain(i,mink)+1;%訓練樣本的詞頻數,可以不用歸一化
    end
end
%詞頻歸一化
for i=1:m
   dictionarytrain(i,:)= dictionarytrain(i,:)./size(traindata,2);
end
    
[m2,n2]=size(testdata);
dictionarytest=zeros(m2,m1);
mindis2=zeros(m2,m1);
for i=1:m2
    for j=1:n2
        for k=1:m1
       mindis2(i,k)=abs(testdata(i,j)-trainC(k,:));%求距離哪個中心點最小
        end
       [y,mink] =min(mindis2(i,:));
       dictionarytest(i,mink)=dictionarytest(i,mink)+1;%測試樣本的詞頻數
    end
end
%詞頻歸一化
for i=1:m2
   dictionarytest(i,:)= dictionarytest(i,:)./size(testdata,2);
end
%%%%%%%%%%%進行分類訓練
[bestacc2,bestc2,bestg2] = SVMcgForClass(trainlabel,dictionarytrain);%加1來標識不是svc的
n=15;%保留15位有效數字
cmd = [ '-s ',num2str(0),' -t ',num2str(2),' -c ',num2str(bestc2),' -g ',num2str(bestg2)];%-s,-t,使用的都是預設引數
model2=svmtrain(trainlabel,dictionarytrain,cmd);%預設引數-s=0,-t=2,但是一定要注意-g等引數前面及後面的空格,否則會導致引數連在一起,改變訓練模型
[predict_label2,accuracy2,decisionvalue2] = svmpredict(testlabel,dictionarytest,model2);%這裡的決策值是84*3的矩陣,代表什麼意思???
type = 2;%輸入的是測試集資料
CR2=ClassResult(testlabel, dictionarytest, model2, type);