洋食の日記

「だ・である」調ではなく「です・ます」調で書きはじめれば良かったなと後悔してる人のブログです

NArray

Numo::LinalgのサブセットのNumo::TinyLinalgを作った

はじめに Numo::NArrayで逆行列計算や固有値分解などの線形代数計算を担うNumo::LinalgのサブセットであるNumo::TinyLinalgを少しずつ作っていた。どのようなサブセットかというと、機械学習で使う(Rumaleで使う)メソッドだけを実装したものになる。 githu…

確率分布に従う乱数によるNumo::NArrayを生成するNumo::Randomを作った

はじめに 正規分布や二項分布などの確率分布に従う(疑似)乱数によるNumo::NArrayを生成するNumo::Randomを作った。アイディア自体はずっと前に考えていたが、腱鞘炎と忙しさで、形にできていなかった。 github.com 動機 Numo::NArray自体にも、一様乱数を…

インストール時にBLISをビルドしてNumo::Linalgのバックグラウンドライブラリに使用するGemを作成した

はじめに Numo::OpenBLASのBLIS版を作成した。Numo::OpenBLASを作ったのが、だいたい1年前だった。 インストール時にOpenBLASをビルドしてNumo::Linalgのバックグラウンドライブラリに使用するGemを作成した - 洋食の日記 BLISは、最適化BLASの一種で、線形…

Rumaleと同様のインターフェースでtorch.rbが使えるRumale::Torchを作った

はじめに Rubyには深層学習をあつかうgemがいくつかある。そのなかでtorch.rbは、riceを利用してLibTorchをbinding libraryしたものである。LibTorchは、PyTorchのC++ APIといえるもので、version 1.5からstableなAPIとして提供されており、今後の発展と開発…

Rumaleに回帰分析のための計量学習手法MLKRを追加した

はじめに Rubyの機械学習ライブラリであるRumaleに、回帰分析のための計量学習手法である Metric Leaning for Kernel Regression (MLKR) を追加し、ver. 0.22.1 としてリリースした。 rumale | RubyGems.org | your community gem host 使い方 Rumaleはgemコ…

Rumaleのロジスティック回帰の最適化手法にL-BFGSを追加した

はじめに Rumaleのロジスティック回帰のsolverにL-BFGSを追加し、これをデフォルトとして、ver. 0.22.0 としてリリースした。Rumaleのロジスティック回帰では、最適化に確率的勾配降下法(Stochastic Gradient Descent, SGD)を用いていた。データによって、…

非線形最適化手法L-BFGS-BのGemを作成した

はじめに 非線形最適化手法の一つであるL-BFGS-Bは、scipy.optimize.minimizeのデフォルト手法として採用されているなど、最適化手法ではde facto standardの様な存在である。Rではoptim関数がサポートしていたり、Juliaではbindingライブラリがあったりする…

Numo::OpenBLASでOpenBLASのダウンロードとビルドのタイミングを変えた

はじめに Numo::OpenBLASで、インストール時のOpenBLASのダウンロードとビルドを、native extensionの作成時に行うようにして、version 0.2.0 としてリリースした。 numo-openblas | RubyGems.org | your community gem host 使い方 使い方に変更はない。Gem…

インストール時にOpenBLASをビルドしてNumo::Linalgのバックグラウンドライブラリに使用するGemを作成した

はじめに Numo::OpenBLASという、タイトルのとおりのものを作成した。 numo-openblas | RubyGems.org | your community gem host 使い方 Gemコマンドでインストールできる。このとき、OpenBLASをダウンロードしてビルドする。 $ gem install numo-openblas …

画像をNumo::NArrayで扱えるMagroにフィルタを追加した

はじめに Rubyの画像処理ライブラリMagroに、フィルタをかけるメソッドを追加し、version 0.3.0としてリリースした。 magro | RubyGems.org | your community gem host 使い方 Magroは画像ファイルの読み書きにlibpngとlibjpegを必要とする。Magroをインスト…

画像をNumo::NArrayで扱えるMagroに画像のサイズ変更を追加した

はじめに Magroという画像をNumo::NArrayで扱える(読み書きできる)Gemを作っていたが、いろいろと時間がとれず更新が滞っていた。 yoshoku.hatenablog.com せっかくの連休なので、Bilinear補完によるサイズ変更を追加した。基本的なとこから実装するならば…

Rumaleの主成分分析でNumo::Linalgの固有値分解を利用できるようにした

はじめに 機械学習アルゴリズムでは、固有値分解が逆行列計算といった、線形代数のテクニックを利用する場合がある。これらをRubyで使用するには、Numo::Linalgが適している。一方で、Numo::Linalgは、Numo::NArrayと異なり、BLAS/LAPACK系の外部ライブラリ…

Numo::Pocketfftにフーリエ変換による畳み込み演算するメソッドを追加した

はじめに 畳み込み演算は、そのまま実装すると、データが大きくなると重くなる。一方、フーリエ変換により、畳み込み演算は単純な掛け算に変換される。これを応用して、畳み込み演算したい二つの配列をフーリエ変換し、乗算を行った後に、フーリエ逆変換する…

Numo::NArrayをpocketfftでフーリエ変換するGemを作成した

はじめに NumPyが、ver. 1.17から、フーリエ変換にFFTPACKではなくpocketfftを使う様になった。pocketfftはFFTPACKを修正したもので、速度と精度が改善されている。 「NumPy 1.17」リリース | OSDN Magazine ENH: Add pocketfft sources to numpy for testin…

画像をNumo::NArrayで表現するRubyの画像処理ライブラリを作り始めた

はじめに PythonではOpenCVとScikit-imageという画像処理ライブラリがある。これらライブラリでは、画像データをNumPyのndarrayで表す。 >>> from skimage import io >>> img = io.imread('lena.png') >>> type(img) <class 'numpy.ndarray'> 同じような感じで、画像データをNumo::N</class>…

Numo::NArrayでLIBLINEARを使うGemを作成した

はじめに Numo::Libsvmと同様に、特徴ベクトルやラベルをNumo::NArray形式で扱えるLIBLINEARのbinding gemを作成した。LIBLINEARは、SVMやロジスティック回帰による線形の分類器や回帰が実装されている。 numo-liblinear | RubyGems.org | your community ge…

データセットをNumo::NArrayであつかうLIBSVMのGemを作成した

はじめに 特徴ベクトルやラベルをNumo::NArray形式で扱えるLIBSVMのbinding gemが欲しかったので、Ruby拡張ライブラリの勉強もかねて作成した。開発に際しては、Numo::FFTWをとても参考にさせて頂いた。gem名は、勝手ながらnumo-libsvmとした。 numo-libsvm …

Rumaleに多次元尺度構成法を追加した

はじめに Rumaleに多次元尺度構成法(Multidimensional Scaling: MDS)による次元削減を実装した。MDSには様々なアルゴリズムがあるが、Rなどでも実装されている Scaling by MAjorizing a COmplicated Function(SMACOF)による方法を採用した。 rumale | Ru…

Ruby拡張でNumo::NArrayのデータをポインタで取得する

はじめに Ruby拡張で、Numo::NArrayのデータをC言語の配列のように扱えないかな〜と思っていたら、na_get_pointer_for_read(for_writeもある)という関数が用意されていて簡単にできた。 準備 もろもろ自動で用意されて便利なので、Ruby拡張を含むgemを作る…

Numo::NArrayを扱ったRubyの拡張ライブラリの作りかた

はじめに 簡単なNumo::NArrayを利用した拡張ライブラリを作った。拡張ライブリの作成については、公式のドキュメントが充実しているので、挑戦してみた。 Gems with Extensions - RubyGems Guides ruby/extension.ja.rdoc at trunk · ruby/ruby · GitHub num…

Red DatasetsとSVMKitを使ってIrisデータセットでの線形SVMの分類精度を確認する

はじめに Red Datasetsは、IrisやMNISTといった公開されているデータセットを、Rubyで簡単に扱えるようにするプロジェクトである(Pythonでいえば、scikit-learnのsklearn.datasetsや、Kerasのkeras.datasetsに近い)。本記事では、Red DatasetsでIrisデータ…

Numo::Linalgで特異値の数を指定できる特異値分解を実装する

はじめに Numo::Linalgは、Rubyで行列のノルムの計算や固有値分解などの線形代数計算を行うライブラリである。Pythonのnumpy.linalgやscipy.linalgに相当する。Numo::Linalgのバージョン0.1.3から、固有値分解で求める固有値・固有ベクトルの範囲を指定でき…

Numo::Linalgのバックエンドライブラリを良い感じに読み込むライブラリを作った

はじめに Numo::Linalgは、numpy.linalgに相当するもので、QR分解や特異値分解を行うメソッドを提供する。これら線形代数の機能は、いわゆるBLAS/LAPACK系のバックエンドライブラリの関数を呼び出すことで実現している。このバックエンドライブラリは、まだ…

SVMKitで使用する線形代数ライブラリをNumo::NArrayに移行した

SVMKitでは、線形代数ライブラリにNMatrixを使用していたが、パフォーマンスと将来性からNumo::NArrayに移行した。Numo::NArrayのメソッド等は、NMatrixともNumpyとも違うが、specを用意しておいて淡々と作業した。思い切った移行だけど、ユーザーも少ないの…