PythonモジュールをC++で作ってみたが(Windows)

カーネルトリックを使ってグラム行列を計算してみた。Pythonのforループ(2重)を使って書いたところ500秒くらいかかっていたが、べた書きのC++3重ループで110秒くらいだった。約5倍速くなった。VisualStudioの最適化オプションをいじってみたが、Releaseで特に指定しないのが一番速かった。。。ノルム計算のところを組み込み関数に置き換えてループひとつなくせばもっと速くなる気もするけどそんな関数あったか? バカ素直にサンプル数Nに対してNxN回の計算をしたけど、上三角行列分だけ計算したらもっと速いはず。それでも55秒+コピー分?

scipy.spatial.distanceのpdistとどっちが速いかだが・・・。

pairwise_dists = squareform(pdist(X, 'euclidean')) #pairwise distance計算(上三角)の結果を行列に
K = scip.exp(-pairwise_dists ** 2 / s ** 2)

RBFをカーネルとしたグラム行列の計算だとsklearn.metrics.pairwise.rbf_kernelがあったか・・・。rbf_kernelに乱数から生成したベクトルの集合を食わせて見たら思った以上に速かった。。。今日(10/6)実際のデータ、7800個の312次元ベクトル、で試してみたら1.4秒くらい?(ハハッ

ここ数日C++でモジュールを作ることを考えていたが、提供されているPythonモジュールの関数使って良さげなPython独自の書き方にした方が速い?(ここまで調べてそれか・・・)。Matlabの場合を思い出すが、結局うまいことPythonでの計算が速くなる書き方になんとか書き換えるしかないかも。

行列の要素同士の積(アダマール積)使えばかけそうね。はー