5

誰かがこの関数を Matlab の "sequentialfs" で使用する方法を説明できますか?

それは簡単に見えますが、関数ハンドラーをどのように設計できるかわかりません!

どんな手掛かり?!

4

1 に答える 1

19

ドキュメントにあるものよりも簡単な例を次に示します。

まず、非常に単純なデータセットを作成しましょう。いくつかのクラス ラベルがあり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です~=。さらに、上記のように直接評価するのではなく、クロス検証を使用してエラー率を推定します。

于 2011-11-28T09:55:11.977 に答える