5

私はPythonでmnistデータ用のSVMを実装しています。今のところ、QPを解決してアルファを取り戻すためにcvxoptを使用しています。

しかし、私の問題はKグラム行列を**効率的に**計算することです。最初は2つのクラス(数字の6と0)だけで、トレーニング例の数は最初の1kから次の10Kまで少なくなりました。

1k x 1k行列全体をより高速に計算するために、私はProcessを使用しており、計算にさまざまなrawを与えています。しかし、それでも2分ほどかかります-そのrbf-ガウス。(10kのものはまだ実行中です!)

誰かがそれに取り組んだり、Python愛好家がここで私を助けてくれるなら、それは素晴らしいことです!

PS:誰かがグラム行列の計算を知らない場合、ここに詳細があります:その単純な:

for i in range(1k):
    for j in range(1k):
         for K[i,j] = some_fun(x[i], x[j])

ここで、some_fun-はドット積またはファンシーガウスです。

私はpython2.7、numpyとMac Air 4G RAM、128Gソリッドステートを使用しています。

[編集]誰かがここに来たら!はい、SVMは時間がかかります...そして、複数の分類を行う場合は、k-グラム行列を再度計算する必要があります..時間がかかるので、アルゴリズムを実装して2回チェックし、一晩実行することをお勧めします!しかし、あなたは確かに翌日良い結果を見るでしょう!:)

4

1 に答える 1

6

あなたはnumpyを使っていますよね?遅い Python ループを実行して各ペアワイズ評価を見つけるのではなく、numpy の行列演算を使用して完全な行列を一度に計算することで、大幅な高速化が得られるはずです。たとえばx、行インスタンス データ マトリックス (データ ポイントごとに 1 行、次元ごとに 1 列) であると仮定すると、次のようになります。

# get a matrix where the (i, j)th element is |x[i] - x[j]|^2
# using the identity (x - y)^T (x - y) = x^T x + y^T y - 2 x^T y
pt_sq_norms = (x ** 2).sum(axis=1)
dists_sq = np.dot(x, x.T)
dists_sq *= -2
dists_sq += pt_sq_norms.reshape(-1, 1)
dists_sq += pt_sq_norms

# turn into an RBF gram matrix
km = dists_sq; del dists_sq
km /= -2 * sigma**2
np.exp(km, km)  # exponentiates in-place

でデータを生成するnp.random.normal(size=(1000, 784))と、クアッドコア i5 iMac で 70 ミリ秒かかります。10k データ ポイントまで上げると、7 秒弱かかります。

sklearn.metrics.pairwise.rbf_kernelも同様に機能しますが、追加の入力チェックとスパース行列などのサポートがあります。

xrange(1000)Python 2 では、 ではなくをループする必要があることにも注意してくださいrange(1000)rangeループするリストオブジェクトを実際に作成しますが、これには時間がかかり、さらに重要なことにメモリが必要になる場合があります。10,000 の場合はおそらく問題ありませんが、ループが大きくなりすぎると深刻な問題が発生する可能性があります。

于 2013-04-01T17:06:27.007 に答える