3

SVM を使用して学習しようとしている一連のデータがあります。コンテキストとして、データの次元は 35 で、約 30,000 のデータポイントが含まれています。

以前、このデータセットを使用して Matlab で決定木をトレーニングしましたが、約 20 秒かかりました。エラー率に完全に満足できなかったので、SVM を試すことにしました。

私は最初に試しsvmtrain(X,Y)ました。約 5 秒後、次のメッセージが表示されます。

??? Error using ==> svmtrain at 453 カーネル関数の計算エラー: メモリ不足です。オプションに HELP MEMORY と入力します。

このエラーを調べたところ、SMOメソッドを使用するよう提案されました: svmtrain(X, Y, 'method', 'SMO');. 約 1 分後、次のようになります。

??? 236 で ==> seqminopt>seqminoptImpl を使用するとエラーが発生する 最大数 (15000) のメイン ループ パス内で収束が達成されない

==> 100 での seqminopt のエラー [アルファ オフセット] = seqminoptImpl(data, targetLabels, ...

==> 437 での svmtrain のエラー [アルファ バイアス] = seqminopt(training, groupIndex, ...

他の方法 (LS および QP) を使用してみましたが、最初の動作が再び発生します: 5 秒の遅延、その後

??? Error using ==> svmtrain at 453 カーネル関数の計算エラー: メモリ不足です。オプションに HELP MEMORY と入力します。

決定木は非常に簡単に使用できたので、何か間違ったことをしていると思い始めています。ここでは、非常に単純な操作のように見えるものに行き詰まっています。

よろしくお願いいたします。

4

1 に答える 1

4

アルゴリズムのメモリ使用量に関する最後の方のコメントを読みましたか?

メソッドを に設定して、マシンで使用可能なメモリに適した値をSMO使用してみてください。kernelcachelimit

学習中、アルゴリズムはサイズ の double 行列を作成しますkernelcachelimit-by-kernelcachelimit。デフォルト値は 5000 です

それ以外の場合は、インスタンスをサブサンプリングし、クロス検証などの手法を使用して分類子のパフォーマンスを測定します。

関連するセクションは次のとおりです。

メモリ使用量とメモリ不足エラー

'Method' を 'QP' に設定すると、関数 svmtrain は N 個の要素を含むデータセットで動作し、(N+1) 行 (N+1) 列の行列を作成して分離超平面を見つけます。この行列には、少なくとも 8*(n+1)^2 バイトの連続したメモリが必要です。このサイズの連続メモリが使用できない場合、ソフトウェアは「メモリ不足」エラー メッセージを表示します。

'Method' を 'SMO' (既定) に設定すると、メモリ消費は kernelcachelimit オプションによって制御されます。SMO アルゴリズムは、カーネル マトリックスのサブマトリックスのみを格納し、kernelcachelimit オプションで指定されたサイズに制限されます。ただし、データ ポイントの数が kernelcachelimit オプションで指定されたサイズを超えると、カーネル マトリックス要素を再計算する必要があるため、SMO アルゴリズムの速度が低下します。

大規模なデータ セットで svmtrain を使用していて、メモリが不足している場合、または最適化ステップに非常に時間がかかる場合は、次のいずれかを試してください。

  • 使用するサンプル数を減らし、交差検証を使用して分類器のパフォーマンスをテストします。

  • 「メソッド」を「SMO」に設定し、kernelcachelimit オプションをシステムが許す限り大きく設定します。

于 2013-04-14T00:18:14.000 に答える