洋食の日記

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

Ruby

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_…

Rumaleにt-SNEを実装した

はじめに Rumaleに高次元データの可視化として定番の一つになっている t-distributed Stochastic Neighbor Embedding(t-SNE)を実装した。「教師なし学習を増やさないとな〜少ないよな〜」と思っているところに、issueでリクエストを頂いたので実装してver.…

RumaleにGradient Tree Boostingによる分類と回帰を実装した

はじめに Rumaleでは決定木系のアルゴリズムの高速化と追加を進めている。ついに人気のGradient Tree Boosting(Gradient Boosting MachineやGradient Boosted Regression Treeなどとも呼ばれる)を実装して、ver. 0.9.2としてリリースした。 rumale | RubyG…

RumaleにExtra-Treesによる分類と回帰を追加した

はじめに 新しい時代になったので、Rumaleに新しいアルゴリズムを追加してバージョンを0.9.1に上げてみた。あわせて、バージョン0.9.0で導入した決定木のC拡張もリファクタリングして、少しだけ速くなっている。 rumale | RubyGems.org | your community gem…

Rumaleの決定木をRuby拡張を使って速くした

はじめに Rumaleの決定木で、どうしても普通にRubyを使っては高速化できない箇所があり、そこをExtensionで実装した。これをバージョン0.9.0としてリリースした。 rumale | RubyGems.org | your community gem host 決定木では、特徴軸ごとに、不純度にもと…

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

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

DaruとRumaleを使ってKaggleのTitanicコンペにRubyで挑戦する

はじめに Kaggleのチュートリアルコンペぐらいなら、Rubyでもイケるんじゃないかと思って、データ分析ライブラリのDaruと機械学習ライブラリのRumaleでTitanicコンペに挑戦してみた。 Titanic: Machine Learning from Disaster | Kaggle DaruはPythonでいう…

Rumaleに改名するときにやらかしたコト

はじめに Rumaleに改名する際に以下のページをまずみた。Googleで「gem rename」で上位に来たので。 stackoverflow.com ざっと読んで、旧名のGemのリポジトリとかREADMEとかに説明をつけて、新しいの出せば良いんだな〜と思った。FactoryBot(旧FactoryGirl…

SVMKitにGrid Seachを実装した

はじめに SVMKitに、ハイパーパラメータの探索手法として定番のGrid Searchを実装した。Scikit-learnのGrid Searchと同様に、交差検定をベースにした探索を行う。与えられたハイパーパラメータの値のすべての組み合わせで、交差検定を行い、テストでのスコア…

Rubyでキーワード引数の引数名と値の一覧をHashで得る

はじめに Ruby 1.9以前のHashでキーワード引数を再現してたような感じで、Ruby 2.0以降のキーワード引数でも、引数の名前とその値の一覧をHashで得たいときがある。 コード def foo(a: 'yes', b: 'no') keywd_args = method(__callee__).parameters.map { |_…

SVMKitにPipeline機能を追加した

はじめに SVMKitで、一通りベーシックな機械学習アルゴリズムの実装を終えたので、しばらく便利機能の追加を予定している。バージョン0.7.2ではPipelineを実装した。Pipelineを使うことで、正規化して主成分分析してSVMで分類といった連結処理を定義できる。…

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から、固有値分解で求める固有値・固有ベクトルの範囲を指定でき…

RubyでLIBSVM形式のファイルを扱うLibSVMLoaderをバージョンアップした

久しぶりにLibSVMLoaderをアップデートした。 $ gem install libsvmloader これまでNMatrixで特徴ベクトルとラベルを表現していたが、これをRubyのArrayに変えた。Arrayにすることで、NMatrixだけでなくNumo::NArrayでも使用できる。 require 'libsvmloader'…

SVMKitにクラスタリングと行列分解を実装した

svmkit | RubyGems.org | your community gem host クラスタリングはK-MeansとDBSCAN、行列分解は主成分分析(Principal Component Analysis, PCA)と非負値行列因子分解(Non-negative Matrix Factorization, NMF)を実装した。K-Meansは、K-Means++による…

SVMKitでの回帰の実装をだいたい終えました

svmkit | RubyGems.org | your community gem host SVMKitの0.3系では、回帰手法の実装を目標としていたが、代表的な手法を実装して、だいたい終えた(※カーネルSVMによる回帰の実装を見送った。SVMKitではStochastic Gradient Descent, SGDでの実装を基本と…

SVMKitで回帰の実装をはじめました

はじめに これまでSVMKitでは、分類とそれに関連する手法の実装を進めていたが、回帰の実装をはじめた。手始めに線形サポートベクター回帰とk-近傍法による回帰を実装した。 svmkit | RubyGems.org | your community gem host これにあわせて、交差検定を回…

Rubyで近似最近傍探索ライブラリを作った話

はじめに Rubyで動く近似最近傍探索(Approximate Nearest Neighbor search, ANN)ライブラリが欲しくなって作成した。 hanny | RubyGems.org | your community gem host FLANNのRubyバインディングがあり検討したが、FLANN自体の開発が止まっているので、勉…

SVMKitのSVM系分類器に事後確率を推定するメソッドを追加した

はじめに SVMKitのSupport Vector Machine(SVM)系の分類器であるSVCとKernelSVCに、ロジスティック回帰と同様に事後確率を推定するpredict_probaメソッドを追加した。 svmkit | RubyGems.org | your community gem host これにあわせて、Log-Lossを評価す…

SVMKitのLogistic Regressionの勾配計算に間違いがあったので修正した

はじめに SVMKitのSVMKit::LinearModel::LogisticRegressionの勾配計算に間違いがあったので修正して0.2.8としてリリースした。 svmkit | RubyGems.org | your community gem host 0.2.8では、与えられたパラメータのチェックなどの細かな部分を補うことを予…

SVMKitに決定木とランダム森の分類器を追加した

はじめに SVMKitに決定木(Decision Tree)とランダム森(Random Forest)による分類器を実装し、バージョンを0.2.6とした。 svmkit | RubyGems.org | your community gem host 決定木は、CARTをベースにした二分木によるものを実装した。Scikit-learnになら…

SVMKitに単純ベイズ分類器を追加した

はじめに Ruby 25周年の記念日に何かSVMKitをバージョンアップしたくて準備を進めていた。無事に単純ベイズ(Naive Bayes, NB)分類器を追加した状態でバージョンアップできた。Scikit-learnにならってGaussian、Multinomial、Bernoulliの各種分布のアルゴリ…

SVMKitにFactorization Machineによる分類器を追加した

はじめに SVMKitの開発は、何かしら毎月バージョンアップしようという思いで進めており、無事に2月も0.2.4をリリースすることができた。 svmkit | RubyGems.org | your community gem host SVMKitにFactorization Machine(FM)による分類器を追加した。FMは…

SVMKitにK分割交差検証を追加した

はじめに SVMKitで「LIBSVM相当のことができるように」と思い、K分割交差検証(K-fold cross validation)を追加した。一度、cross validationするためのデータを分割するクラスを追加した段階で「これでminimum viable productかな」と思って、0.2.2として…

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

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

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

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

vimのnativeなpackage管理でsyntasticをインストールした

はじめに rubocopするのを忘れがちで、vimで(自動で)できてくれると嬉しいので、syntasticを入れることにした。使ってるvimのバージョンは8.0.1200なので、nativeなpackage管理を使ってインストールすることにした。 インストール パッケージを入れるため…

機械学習ライブラリSVMKitにカーネルSVMを追加した

はじめに Pure Rubyな機械学習ライブラリSVMKitにカーネルSVMを追加しました。カーネルSVMは、Pure Rubyでは速度的にツラいものがあるかな?と思っていたが、機械学習ライブラリとしては実装されているべきものなので追加した。※それ以前にLogistic Regressi…