洋食の日記

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

Rubyのパイプラインを考えてみた

はじめに Rubyにパイプライン演算子が追加されるかも?というのが、少し前に話題になった。他方、R言語にはmagrittrというパイプラインを実現するパッケージがあり、これが便利だ。 # h(g(f(x))) x %>% f %>% g %>% h データ分析では、カテゴリ変数を整数値…

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…

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

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

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をRumaleに改名した

SVMKitをRumale (Ruby machine learning) に改名した。SVMKitにサポートベクターマシン以外のアルゴリズムを実装するようになってから、ずっと考えていたが、いい名前が思いつかず放置していた。Rumaleの命名には、 Red Data Tools の id:mrkn さんや kou さ…

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

はてなブログProを解約してしまった

筆不精なので「お金を払えば書くようになるかな?」と思ったら、そうでもなかったです。ちなみに、解約してスグに元に戻るのではなくて、払った分はProでいられます。良心的ですね。

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の二値分類器にOne-vs-the-restを内包した

はじめに SVMKitのSVMKit::LinearModel::SVCなどの二値分類器で、多値のラベルを与えれた場合に、自動的にOne-vs-the-rest法で多値分類器化するように修正を加えた。 svmkit | RubyGems.org | your community gem host これにより、SVMKit::Multiclass::OneV…

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

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