2016-09-20 69 views
0

我試圖做一個10倍交叉驗證,而不使用內置函數來訓練和識別0-9的數字我有500張圖片的樣本(每個數字需要50個訓練和測試) 我嘗試實現答案MATLAB: 10 fold cross Validation without using existing functions和其他網站,但它並沒有太大的幫助。主要是因爲我是MATLAB新手,所以我不太瞭解我應該怎麼做才能調整它。 這是我到目前爲止的代碼。如何在不使用MATLAB中的內置函數的情況下做10倍交叉驗證?

c=zeros(10,size(x,2),size(x,3)); 
    K=10; 
    k=10; 
    test= 1:50/K; 
    for fold =1:K 
     if(test(1)~=1) 
      train = x(1:test(1)-1,:,:); 
      if (test(5) ~=50) 
       train=[train ; x(test(end):50,:,:)]; 
      end 
     else 
      train = x(test(1):50,:,:); 

     end 
     test = test+ones(1,50/K)*50/K; 
     end 
    for i =0:9 

      test=test+50/K*ones(1,5); 
      c(i+1,:,:)=cal_likelihood(x(1+i*50:50+i*50,:,:),50/k*(k-1)); 
    end 

變量解釋

  • x爲500x28x28雙,保存着所有500位的畫面。
  • 測試是一個測試集。
  • 列車是一套訓練集。

爲了做到10倍交叉驗證我需要改變訓練集等

  1. 第一方面:1:5,用於測試,6:45,用於火車
  2. 第二折:6:10爲測試,1:5 11:50列車等

問題是我不知道如何將訓練集從一套移到另一套如6:45到1:5和11 :50。或者我能寫一個比這更好的循環嗎?

PSS。如果回答這個問題的人不介意500x28x28 double實際上意味着什麼。

+0

'500x28x28 double'意味着它是一個[多維數組](http://de.mathworks.com/help/matlab/math/multidimensional-arrays.html)(實際是3-D數組)尺寸'500'代表例子的數量(在你的情況下是數字圖片),'28x28'分別代表每張圖片的長度和寬度(每張圖片用28x28的矩陣表示)。 – uyaseen

+0

@uyaseen非常感謝。 – RHLS

回答

0

有幾種方法可以寫出這些,其中一些比其他人更容易理解。 Matlab是相當不錯的寫作,而表達式如1:3評估爲[1,2,3],表達式1:0評估爲空集。所以,不需要使用if語句就可以直接生成這些集合。

我開始循環爲:

samples_per_digit=50; 
block_sze=samples_per_digit/K; 
for fold =1:K 
    test_ind = 1+(fold-1)*block_sze:fold*block_sze; 
    train_ind = [1:(fold-1)*block_sze, (fold*block_sze+1):samples_per_digit]; 

    for i=0:9 
     train=x(train_ind+i*samples_per_digit,:,:); 
     test=x(test_ind+i*samples_per_digit,:,:); 
     % Perform training and validation in here for this fold of the digit i 

您可以驗證test_indtrain_ind對應的訓練和驗證塊的,你需要的子集。只有在最裏面的循環中,這些轉化爲對應於數字圖像的矩陣,使用值i來計算偏移量。當然,如果你願意,你可以交換循環的順序,計算一個數字的所有摺疊。這完全取決於你希望如何存儲你的結果。

+0

試試吧,它的工作非常好。這比我使用的代碼好很多。順便說一下,我的代碼是我的教師在課堂上給我的,但我認爲我更喜歡這個代碼,它非常簡短,很容易理解。 – RHLS

相關問題