洋食の日記

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

Ruby

Rubyな形態素解析器Suikaのトライをdarts-clone.rbにした

はじめに Rubyな形態素解析器Suikaの単語検索のためのトライを、先日リリースしたdarts-clone.rbに変更してバージョンを上げた。 suika | RubyGems.org | your community gem host 使い方 変更は内部的なものなので、Suikaの使い方自体は変わらない。 gem in…

ダブル配列ライブラリDarts-cloneのRuby bindingを作成した

はじめに Susumu Yataさんが作られたDarts-cloneは、Darts(Double-ARray Trie System)というライブリのクローンで、共通接頭辞検索を実現するデータ構造のダブル配列(Double Array)の実装である。Darts-cloneは、DartsとAPI互換性があり、検索の機能や速…

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

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

近似最近傍探索ライブラリAnnoyのRuby bindingを作成した

はじめに Annoy (Approximate Nearest Neighbors Oh Yeah) は、C++で書かれた近似最近傍探索ライブラリである。近似最近傍探索とは、その名のとおり、クエリに対して厳密ではなく近似的に近傍にあるものを探索する。高速に探索できるので、大規模データの画…

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…

Windows10でRubyな開発環境を得るためにやったこと

はじめに Windowsでの動作確認のため、その昔Windows 7をWindows 8にし、そしてWindows 10にした、古いラップトップをひっぱりだして、Rubyの環境構築を行った。Windowsでの開発に関して、知識がゼロだったので、10回はインストールとアンインストールを繰り…

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

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

Suikaの未知語処理のバグを修正した

はじめに Pure Rubyな形態素解析器Suikaを作成したが、未知語処理がバグだらけで、リリースして1週間で4回もバージョンアップしてしまった。現在 ver. 0.1.4 だが、もう安定して動くはず。 suika | RubyGems.org | your community gem host 未知語処理の勘違…

SuikaというPure Rubyな形態素解析器を作成した

はじめに Pure Rubyな形態素解析器Suikaを作成した。開発中でバッリバリにα版だが、思い切ってリリースすることにした。 suika | RubyGems.org | your community gem host 最も有名な形態素解析器であるMeCabもそうだが、形態素解析器は食べ物の名前がつくこ…

画像を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にカーネル判別分析を追加した

はじめに 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に多層パーセプトロンなニューラルネットワークを追加した

はじめに 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::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 …

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は、データ分布をいくつかの正規分布の重み付き線形和で表現しよ…