1. 程式人生 > 其它 >matlab.10折交叉驗證

matlab.10折交叉驗證

技術標籤:matlab

clc
clear all
% 匯入資料
data = load('F:\work_matlab\Matlab\wdbc.txt');
[data_r, data_c] = size(data);
%將資料樣本隨機分割為10部分
indices = crossvalind('Kfold', data_r, 10);
for i = 1 : 10
    % 獲取第i份測試資料的索引邏輯值
    test = (indices == i);
    % 取反,獲取第i份訓練資料的索引邏輯值
    train = ~test;
    %1份測試,9份訓練
    test_data = data(test, 1 : data_c - 1);
    test_label = data(test, data_c);
    
    train_data = data(train, 1 : data_c - 1);
    train_label = data(train, data_c);
    % 使用資料的程式碼
end

10折交叉驗證:

load fisheriris 
indices = crossvalind('Kfold',species,10); %10為交叉驗證折數
cp = classperf(species);
for i = 1:10   %實驗記進行10次(交叉驗證折數),求10次的平均值作為實驗結果,
    test = (indices == i); train = ~test;  %產生測試集合訓練集索引
    class = classify(meas(test,:),meas(train,:),species(train,:));
    classperf(cp,class,test)
end
cp.ErrorRate

留一交叉驗證:

load carbig
x = Displacement; y = Acceleration;
% x為轎車形狀的大小,y為轎車轎車速度從0到60公里所用時間
N = length(x);
% N為x長度=406
sse = 0;
for i = 1:100
    [train,test] = crossvalind('LeaveMOut',N,1);
    yhat = polyval(polyfit(x(train),y(train),2),x(test));
    sse = sse + sum((yhat - y(test)).^2);
end
CVerr = sse / 100

自定義函式

[M,N]=size(data);//資料集為一個M*N的矩陣,其中每一行代表一個樣本
    indices=crossvalind('Kfold',data(1:M,N),10);//進行隨機分包
    for k=1:10//交叉驗證k=10,10個包輪流作為測試集
        test = (indices == k); //獲得test集元素在資料集中對應的單元編號
        train = ~test;//train集元素的編號為非test元素的編號
        train_data=data(train,:);//從資料集中劃分出train樣本的資料
 train_target=target(:,train);//獲得樣本集的測試目標,在本例中是實際分類情況
        test_data=data(test,:);//test樣本集
 test_target=target(:,test);
 [HammingLoss(1,k),RankingLoss(1,k),OneError(1,k),Coverage(1,k),Average_Precision(1,k),Outputs,Pre_Labels.MLKNN]=MLKNN_algorithm(train_data,train_target,test_data,test_target);//要驗證的演算法
 end