洋食の日記

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

機械学習

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

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

Rumaleのリッジ・線形回帰のソルバーでL-BFGS法が自動的に選択されるようにした

はじめに Rubyの機械学習ライブラリであるRumaleで、RidgeとLinearRegressionで、solver: 'auto' とした場合に、Numo::Linalgがロードされていない場合は、L-BFGS法をソルバーとするようにした。Numo::Linalgがロードされている場合は、従来どおり特異値分解…

Rumaleのカーネル法まわりを便利にした

はじめに Rubyの機械学習ライブラリであるRumaleに、前処理としてカーネル行列を計算するクラス、カーネルリッジ回帰による分類器を追加した。また、Nystroemカーネル近似では、サポートするカーネル関数がRBFカーネルだけであったが、多項式カーネルやシグ…

Rumaleに投票によるアンサンブル法を追加した

はじめに Rubyの機械学習ライブラリであるRumaleに、投票(voting)によるアンサンブル法を利用した分類器・回帰分析を追加して、ver. 0.22.4としてリリースした。 https://rubygems.org/gems/rumale/versions/0.22.4 使い方 Rumaleはgemコマンドでインスト…

Rumaleに非負最小二乗法による回帰を追加した

はじめに Rubyの機械学習ライブラリであるRumaleに、非負最小二乗法(Non-nagtive Least Squares, NNLS)による線形回帰を追加して、ver. 0.22.3としてリリースした。 https://rubygems.org/gems/rumale/versions/0.22.3 使い方 Rumaleはgemコマンドでインス…

Rumaleにスタッキングによる分類器と回帰分析を追加した

はじめに Rubyの機械学習ライブラリであるRumaleに、スタッキング(stacking / stacked generalization)を用いた分類器と回帰分析を追加して、ver. 0.22.2としてリリースした。 rumale | RubyGems.org | your community gem host 使い方 Rumaleはgemコマン…

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ライブラリがあったりする…

Rumale::SVMに線形One-Class SVMを追加した

はじめに LIBLINEARがバージョンアップして、線形One-Class SVM(Linear one-class support vector machine, LOCSVM)が追加された。これに合わせて、Numo::LiblinearとRumale::SVMをアップデートして、LOCSVMに対応した。LOCSVMは、データの分布を推定する…

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

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

Rumaleからdeprecatedにしてた分類器などを削除した

はじめに RumaleからFactorization MachineやNadamなど、deprecatedにしていたものを削除して version 0.20.0 としてリリースした。本 version で分類器などの追加はない。シンプルに削除だけでバージョンを切った。 rumale | RubyGems.org | your community…

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

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

Rumaleにカーネル判別分析を追加した

はじめに Rumaleにカーネル判別分析を追加して、これを version 0.18.4 としてリリースした。カーネル判別分析は、version 0.18.0 で追加したフィッシャー判別分析 (Fisher Discriminant Analysis, FDA) を、カーネル法により非線形化したものである。 rumal…

RumaleにNeighbourhood Component Analysisを追加した

はじめに Rumaleに計量学習のNeighbourhood Component Analysis (NCA) とフィッシャー判別分析 (Fisher Discriminant Analysis, FDA) を追加した。これを version 0.18.0 としてリリースした。 rumale | RubyGems.org | your community gem host 使い方 Ruma…

Rumaleの線形モデルの実装を修正した

はじめに 気がつくと全然ブログを書いていなかった。ver. 0.14で多層パーセプトロンを追加して細かい修正とかを重ねて、今はver. 0.17.0になった。ver. 0.17.0での大きな変更は、Rumale::LinearModel以下を刷新したことにある。 rumale | RubyGems.org | you…

Rumaleに多層パーセプトロンなニューラルネットワークを追加した

はじめに Rumaleに多層パーセプトロンによる分類・回帰を追加した。活性化関数にはReLUを、正則化にはDropout、最適化にはAdamというスタンダードな構成にした。あわせて、入力のバリデーションをNumo::NArrayだけでなくRuby Arrayも受け付けるように修正し…

LIBSVMとLIBLINEARをRumaleなインターフェースで使えるRumale::SVMを作った

はじめに LIBSVMとLIBLINEARに実装されているサポートベクターマシン(Support Vector Machine, SVM)のアルゴリズムを、Rumaleのインターフェースで利用するためのGem、Rumale::SVMを作成した。 rumale-svm | RubyGems.org | your community gem host Rumal…

RumaleにFastICAによる独立成分分析を追加した

はじめに RumaleにFastICAによる独立成分分析(Independent Component Analysis, ICA)を追加した。ICAは、与えられたデータを、統計的に独立な元データが混合されてできたものと考え、元データを再構成したもの(独立な成分)を求める手法である。信号処理…

Rumaleのガウス混合モデルで共分散の種類を選べるようにした

はじめに Rumaleのガウス混合モデル(Gaussian Mixture Model, GMM)によるクラスタリングでは、各クラスタの共分散行列には、対角要素のみの対角行列を使用していた。 yoshoku.hatenablog.com これは、逆行列や行列式の計算に特別なアルゴリズムを使用しな…

Rumaleにカーネルリッジ回帰を追加した

はじめに Rumaleのversion 0.13系では、固有値分解や逆行列計算といった、Numo::Linalgにある線形代数のテクニックを利用する機械学習アルゴリズムの実装を進めている。version 0.13.3では、カーネルリッジ回帰とカーネル主成分分析を追加した。 rumale | Ru…

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

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

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…

RumaleにPower Iterationによる非線形クラスタリングを追加した

はじめに Rumaleに、Power Iteration Clustering(PIC)を追加した。PICは、データ間の類似度をもとにクラスタリングする。類似度に、例えばRBFカーネルを選択すると、非線形なデータ分布構造を捉えたクラスタリングができる。 rumale | RubyGems.org | your…

Rumaleにガウス混合モデルによるクラスタリングを追加した

はじめに Rumaleにガウス混合モデル(Gaussain Mixture Model, GMM)によるクラスタリングを追加して、ver. 0.12.2としてリリースした。 rumale | RubyGems.org | your community gem host GMMは、データ分布をいくつかの正規分布の重み付き線形和で表現しよ…

Rumaleの乱数生成を無難なものにした

はじめに 機械学習アルゴリズムでは、乱数でベクトルを初期化したり、ランダムサンプリングしたりなど、乱数生成をアルゴリズム中に含むものが多い。Rumaleの多くもそんな感じで、クラスのインスタンス変数にRandomクラスによる乱数生成器を持っている。これ…

RumaleでParallelを導入して高速化した

はじめに Rumaleには、実行速度が遅いという問題があった。これに対して、version 0.11.0 では、one-vs-the-restやbaggingで並列化できる部分を、Parallelにより並列化してみた。 rumale | RubyGems.org | your community gem host scikit-learnと同様に、n_…