"一般に、一度に1つずつ作成するのではなく、線形制約のバッチを作成する方がパフォーマンスが向上します。私はちょうどそれが巨大な問題でも述べているのだろうと思っています。 " - 賢明なプログラマー。SVM with pythonとCPLEX、目的関数の二次部分をロードする
明らかに、(35k x 40)データセットがあり、SVMを実行したいと思います。
nn = 35000
XXt = np.random.rand(nn,nn) # the gramm matrix of the dataset
yy = np.random.rand(nn) # the label vector of the dataset
temp = ((yy*XXt).T)*yy
xg, yg = np.meshgrid(range(nn), range(nn))
indici = np.dstack([yg,xg])
quadraric_part = []
for ii in xrange(nn):
for indd in indici[ii][ii:]:
quadraric_part.append([indd[0],indd[1],temp[indd[0],indd[1]]])
「quadratic_partは」のリストである:私はこのデータセットのGRAMM行列を生成する必要があり、それは結構ですが、CPLEXは混乱であるに係数を渡すために、それはここで、私のコードを時間を要しform [i、j、c_ij]ここで、c_ijはtempに格納された係数です。 CPLEX Python APIの関数 'objective.set_quadratic_coefficients()'に渡されます。
これを行うには賢明な方法がありますか?
P.S.私はたぶんメモリの問題があるので、それはもっとうまくいって、代わりに 'quadratic_part'というリスト全体を保存し、関数 'objective.set_quadratic_coefficients()'を何度か呼びます。
カスタマイズされたソルバーが効率的になるときには、一般的なソルバーを使用するのはなぜですか([このアプローチを使用するなど](http://scikit-learn.org/stable/auto_examples/svm/plot_custom_kernel.html)) ? 1つの明らかなスピードアップは、事前に割り当てられたquadratic_part配列を使用することです。 – sascha
代わりにobjective.set_quadraticを使ってみましたか? – rkersh
CPLEXで実装されているいわゆるインジケータ制約を使ってSVMにリンクされたmipを解決する必要があるので、scikitは私の目的のためには機能しません。 「objective.set_quadratic」にはどのようなものが必要ですか?あなたは小さな例を書き留めてもいいですか? – Ufu