誰かがこの関数を Matlab の "sequentialfs" で使用する方法を説明できますか?
それは簡単に見えますが、関数ハンドラーをどのように設計できるかわかりません!
どんな手掛かり?!
ドキュメントにあるものよりも簡単な例を次に示します。
まず、非常に単純なデータセットを作成しましょう。いくつかのクラス ラベルがありy
ます。500 個は class0
から、500 個は class からのもの1
で、ランダムに並べられています。
>> y = [zeros(500,1); ones(500,1)];
>> y = y(randperm(1000));
x
そして、予測に使用したい100 個の変数がありますy
。そのうちの 99 は単なるランダム ノイズですが、そのうちの 1 つはクラス ラベルと高い相関があります。
>> x = rand(1000,99);
>> x(:,100) = y + rand(1000,1)*0.1;
ここで、線形判別分析を使用してポイントを分類したいとしましょう。特徴選択を適用せずにこれを直接行う場合は、まずデータをトレーニング セットとテスト セットに分割します。
>> xtrain = x(1:700, :); xtest = x(701:end, :);
>> ytrain = y(1:700); ytest = y(701:end);
次に、それらを分類します。
>> ypred = classify(xtest, xtrain, ytrain);
最後に、予測のエラー率を測定します。
>> sum(ytest ~= ypred)
ans =
0
この場合、完全な分類が得られます。
で使用する関数ハンドルを作成するにはsequentialfs
、これらのピースを組み合わせるだけです。
>> f = @(xtrain, ytrain, xtest, ytest) sum(ytest ~= classify(xtest, xtrain, ytrain));
そして、それらすべてをまとめてに渡しますsequentialfs
:
>> fs = sequentialfs(f,x,y)
fs =
Columns 1 through 16
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
Columns 17 through 32
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
Columns 33 through 48
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
Columns 49 through 64
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
Columns 65 through 80
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
Columns 81 through 96
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
Columns 97 through 100
0 0 0 1
出力の最後1
の部分は、予想どおり、変数 100 がy
の変数の中での最良の予測子であることを示していますx
。
のドキュメントの例はsequentialfs
もう少し複雑です。これは主に、予測されたクラス ラベルが上記の数値ではなく文字列であるため~strcmp
です~=
。さらに、上記のように直接評価するのではなく、クロス検証を使用してエラー率を推定します。