2017-01-27 16 views
1

"一般に、一度に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()'を何度か呼びます。

+0

カスタマイズされたソルバーが効率的になるときには、一般的なソルバーを使用するのはなぜですか([このアプローチを使用するなど](http://scikit-learn.org/stable/auto_examples/svm/plot_custom_kernel.html)) ? 1つの明らかなスピードアップは、事前に割り当てられたquadratic_part配列を使用することです。 – sascha

+0

代わりにobjective.set_quadraticを使ってみましたか? – rkersh

+0

CPLEXで実装されているいわゆるインジケータ制約を使ってSVMにリンクされたmipを解決する必要があるので、scikitは私の目的のためには機能しません。 「objective.set_quadratic」にはどのようなものが必要ですか?あなたは小さな例を書き留めてもいいですか? – Ufu

答えて

0

objective.set_quadraticは、C呼び出し可能ライブラリでCPXXcopyquad関数を使用しています。一方、objective.set_quadratic_coefficientsCPXXcopyqpsepを使用します。あなたのQ行列はそれほどに応じて、完全に緻密で

import numpy as np 
import cplex 

nn = 5 # a small example size here 

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 

# create symetric matrix 
tempu = np.triu(temp)  # upper triangle 
iu1 = np.triu_indices(nn, 1) 
tempu.T[iu1] = tempu[iu1] # copy upper into lower 

ind = np.array([[x for x in range(nn)] for x in range(nn)]) 

qmat = [] 
for i in range(nn): 
    qmat.append([np.arange(nn), tempu[i]]) 

c = cplex.Cplex() 
c.variables.add(lb=[0]*nn) 
c.objective.set_quadratic(qmat) 
c.write("test2.lp") 

:;ここで

は、例えば、(それがその一部を行うには良い方法があります十分に可能だ、私はnumpyの専門家ではないよ心に留め)でありますあなたが持っているメモリの量は、この手法は規模が拡大しないかもしれません。しかし、可能であれば、objective.set_quadraticでQ行列を初期化するとパフォーマンスが向上するはずです。おそらく、set_quadraticset_quadratic_coefficientsの両方を使用するハイブリッド技術を使用する必要があります。

+0

Pythonと一緒にcplexを実行する非常に良い方法! set_quadraticは私が探していた機能でした – Ufu

+0

多分この質問のヒントがあります。http://stackoverflow.com/questions/41962488/decomposition-of-matrices-for-cplex-and-machine-learning-application?noredirect = 1#comment71104913_41962488 – Ufu

関連する問題