0

次の戦略を使用してデータセットを分類しようとしていました。

  • 相互検証を 1 つ除外する
  • 「フォールド」ごとに分類する (エラーの数をカウントする) KNN
  • 最終誤差を計算する
  • k=[1,2,3,4,5,7,10,12,15,20] について繰り返す

fisheriris データセットのコードは次のとおりです。

load fisheriris
cur=meas;true_label=species;

for norm=0:2
    feats=normalizamos(cur,norm); %this is just a function I use in my dataset
                                  for normalization. norm=0 equals no normalization
                                  norm=1 and norm=2 are two different normalizations

    c=cvpartition(size(feats,1),'leaveout');

    for k=[1,2,3,4,5,7,10,12,15,20]

        clear n_erros
        for i=1:c.NumTestSets
            tr=c.training(i);te=c.test(i);

            train_set=feats(tr,:);
            test_set=feats(te,:);

            train_class=true_label(tr);
            test_class=true_label(te);

            pred=knnclassify(test_set,train_set,train_class,k);
            n_erros(i)=sum(~strcmp(pred,test_class));
        end

        err_rate=sum(n_erros)/sum(c.TestSize)
    end
end

(私のデータセットの) 結果が奇妙で一貫性のない値を示したので、次のように独自のバージョンの LOO を作成することにしました。

for i=1:size(cur,1)     

    test_set=feats(i,:);
    test_class=true_label(i);

    if i==1
        train_set=feats(i+1:end,:);
        train_class=true_label(i+1:end);
    else
        train_set=[feats(1:i-1,:);feats(i+1:end,:)];
        train_class=[true_label(1:i-1);true_label(i+1:end)];
    end

    pred=knnclassify(test_set,train_set,train_class,k);
    n_erros(i)=sum(~strcmp(pred,test_class));
end

私のバージョンのコードが適切に記述されていると仮定すると、同じか、少なくとも同様の結果が得られることを期待していました。両方の結果は次のとおりです。

結果

結果がこれほど異なる理由は何か分かりますか? どのバージョンを使用すればよいですか? 今、念のため、私が行った他のテスト (3 倍、5 倍など) を書き直すことを考えています。

皆さん、ありがとうございました

4

0 に答える 0