y_uti のブログ

統計、機械学習、自然言語処理などに興味を持つエンジニアの技術ブログです

続パタ 第 3 章「ベイズ決定則」の復習

前回の記事に続き、『続・わかりやすいパターン認識』の例題を実装しながら内容を確認します。今回は第 3 章「ベイズ決定則」です。第 3 章の例題は、前回の記事と同じ設定のコイン投げを題材にして、観測結果 (あるコインを n 回投げて、そのうち r 回が表…

続パタ 2.3 節「ベイズ更新の実験」を試す

『続・わかりやすいパターン認識』の 2.3 節「ベイズ更新の実験」を MATLAB で試してみました。読書会に参加しながら読み進めているのですが、前半部分は残念ながら参加できなかったので、復習の意味で読み直しています。教科書 2.3 節の実験はコイン投げを…

for ループのオペコードで PHP5 と PHP7 の違いを見る

先日の PHP カンファレンス 2015 で、蒋池東龍さんによる「PHP あるあるパフォーマンス対決」という発表がありました。私は当日は他のセッションに参加していたのですが、処理系内部のこのような話には興味があり、後から YouTube で楽しませてもらいました…

PHP Conference 2015 に参加

PHP Conference 2015 に参加してきました。今年は 2000 人を超える参加登録があり、会場の大田区産業プラザ PiO を貸し切っての開催だったようです。PHP の生みの親である Rasmus Lerdorf 氏をはじめ海外からの招待講演も多数あり、何を聴こうか直前まで悩ん…

paiza オンラインハッカソンでコードゴルフに挑戦

paiza オンラインハッカソン Vol. 6+ に挑戦しました。ウェブページはこちらです。 「え、妻が松江?」松江Ruby会議07協賛 回文作成プログラミングコンテスト|POH6+今回は、提出したコードのバイト数が表示されていたためか、どれだけ短いコードで問題を解…

任意の距離関数で k-means 法を実行する

任意の距離関数を用いて k-means 法によるクラスタリングを行うプログラムを作成しました。コードは以下のとおりです。MATLAB で実装しました。fminunc 関数を利用しているため、実行には MATLAB 本体のほかに Optimization Toolbox が必要です。 function […

LDA の逐次学習における活性化

Canini らの論文*1を読んでみました。LDA の逐次学習について述べた論文で、『トピックモデルによる統計的潜在意味解析』の 3.5.2 節は、この論文の方法を説明したものになっています。下記のウェブページで論文の PDF ファイルをダウンロードできます。 JML…

LDA の逐次学習アルゴリズム (勉強会発表資料)

第5回『トピックモデルによる統計的潜在意味解析』読書会で、教科書 3.5 節の「逐次ベイズ学習 - サンプリング近似法の場合 -」を担当しました。発表資料を公開します。 逐次ベイズ学習 - サンプリング近似法の場合 - from y-uti www.slideshare.netスライド…

Hartigan-Wong のアルゴリズムを確認する

R の stats パッケージで提供されている kmeans 関数は、既定では Hartigan-Wong のアルゴリズムを利用します。通常の k-means (Lloyd のアルゴリズム) では、各データ点を最も近いクラスタに割り当てる操作を繰り返しますが、Hartigan-Wong の方法はより直…

各言語の k-means 比較

第10回「続・わかりやすいパターン認識」読書会 に参加して、いくつかの言語での k-means の実装比較について発表しました。発表資料を公開します。 各言語の k-means 比較 from y-uti MATLAB, R, Python (scikit-learn, SciPy) の k-means をそれぞれ調査し…

混合正規分布のパラメータ推定

『続・わかりやすいパターン認識』第 9 章のアルゴリズムを実装して、混合正規分布のパラメータ推定実験を試してみます。今回も MATLAB で実装しました。 サンプルデータの生成 まず、教科書 9.5 節にしたがってパラメータを設定します。各クラスの事前確率…

初期値の違いによる Baum-Welch アルゴリズムの収束過程

Baum-Welch アルゴリズムは、初期値によって収束の過程が異なります。出力記号系列が複数の局所解を持つ場合には、初期値によっていずれか一つの解が求まります。また、収束に要する反復回数も初期値によって大きく異なることがあります。今回は、初期値を変…

MATLAB で Baum-Welch アルゴリズムを実装する

前回に続いて、『続・わかりやすいパターン認識』のアルゴリズムを実装します。今回は Baum-Welch アルゴリズムを実装して、隠れマルコフモデルのパラメータ推定を試してみます。 前向きアルゴリズム まず、前向きアルゴリズムを実装します。以下のように実…

MATLAB で Viterbi アルゴリズムを実装する

先日、第8回「続・わかりやすいパターン認識」読書会 に参加しました。第 8 章の隠れマルコフモデルについて解説していただきました。そこで今回は、教科書に載っている Viterbi アルゴリズムを実装して試してみます。MATLAB で実装してみました。遷移確率と…

paiza オンラインハッカソンに挑戦

この一ヶ月ほど、paiza オンラインハッカソンというイベントで、15 パズルを解くプログラムの作成に挑戦していました。与えられた盤面を解く手数の短さを競う形式です。イベントのウェブサイトは以下にあります。 Rena and Minami International Programming…

Dynamic Time Warping による時系列データの類似度計算

台風の経路情報を題材にして、Dynamic Time Warping (DTW) を用いた時系列データの類似度の計算を試してみます。DTW は二つの時系列データの類似度を測る方法の一つで、英語版の Wikipedia に簡単な説明と実装例があります。 Dynamic time warping - Wikiped…

15 パズルの問題を生成する

paiza オンラインハッカソンというイベントで、15 パズルを解くプログラムの作成に挑戦してみました。イベントの公式サイトはこちらです。 Rena and Minami International Programming Competition |Paiza Online Hackathon 5イベントでは、あらかじめ決めら…

NumPy のブロードキャスティングを PHP で模倣する

NumPy の配列には、ブロードキャスティングという仕組みがあります。これは、大きさの異なる多次元配列同士の算術演算に関する仕組みで、要素数が 1 の次元があった場合にそれを拡張し、二つの配列の要素数を揃えて演算結果を得るというものです。NumPy のマ…

PHP の GC の話 (勉強会発表資料)

昨日、第87回 PHP勉強会@東京 で PHP の GC について発表しました。発表資料を公開します。 PHP の GC の話 from y-uti PHP の処理系に実装されている、参照カウント方式の GC と循環参照によるごみの回収について、比較的平易に説明したつもりです。GC に…

コピュラを用いた確率密度の描画

統計学の分野に、コピュラという概念があるようです。年末年始に少し勉強してみました。どうやら、多次元の確率分布について、各次元の周辺分布をある性質を満たす関数 (コピュラ) で組み合わせると結合分布が得られるというお話のようです。利用するコピュ…

Hack でチャーチ数を使ってフィボナッチ数を計算する

Hack では ($x ==> $x + 1) という形でラムダ式を簡単に記述できます。そこで、Hack でチャーチ数を実装してフィボナッチ数を計算してみました*1。チャーチ数とは、ラムダ計算の枠組みで自然数を表現したものです。Wikipedia のラムダ計算のページに説明があ…

PHP で空のジェネレータを作成する

空のジェネレータ関数の作り方について、Stack Overflow で議論されている内容が面白かったので紹介します。 php - How to yield empty generator? - Stack Overflowジェネレータは PHP 5.5 で導入された構文です。yield 文を使ってイテレータを簡単に実装で…

HHVM での比較演算子の実装

HHVM の == の挙動が PHP と異なるという下記のブログ記事が興味深かったので、それぞれのソースコードを追ってみました。 HHVM 3.3.1とPHP 5.6.2の==の違いを調べてみた - hnwの日記指摘されている現象の一つは、浮動小数点数と 16 進数値文字列の比較で PH…

Proxygen を CentOS 7 でビルドする

Proxygen という C++ 向けの HTTP ライブラリが Facebook から公開されました。公式のブログ記事と GitHub のリポジトリは以下にあります。 Introducing Proxygen, Facebook's C++ HTTP framework facebook/proxygen · GitHub 現在のところ Ubuntu 14.04 で…

Git 入門 (社内勉強会の発表資料)

勤務先の社内勉強会で Git の初歩的なことがらについて発表するので、その資料を公開します。 Git 入門 from y-uti Git の基本的な操作に内容を絞って、実際に手元の Linux 環境でコマンドを実行しながら Git の動作を確認できる構成にしてみたつもりです。…

統計的機械翻訳システム Moses で遊ぶ

統計的機械翻訳システム Moses を使って、英語から日本語への自動翻訳を試してみます。Moses は、機械翻訳の分野で広く利用されているシステムです。対訳コーパス*1からモデルを学習し、そのモデルを用いて入力文の翻訳結果を出力します。Moses のウェブサイ…

phpenv から PHPNG を使う

anyenv + phpenv の環境では、~/.anyenv/envs/phpenv/versions のサブディレクトリにインストールされた PHP がバージョン切り替えの対象になります。php-build を用いずにソースコードから独自にビルドする場合でも、./configure の --prefix オプションを…

SELinux が有効な環境で phpenv を使う

phpenv はホームディレクトリの配下に PHP をインストールするため、SELinux が強制されている状態では、httpd が libphp5.so をロードできません。SELinux を有効にしたまま phpenv 管理下の PHP を利用するには、次のような設定が必要でした*1。なお、私は…

anyenv + phpenv + php-build で複数のバージョンの PHP を切り替える

phpenv を利用して、複数のバージョンの PHP を切り替えて使えるようにする手順を紹介します。phpenv についてはウェブに多くの情報が見つかりますが、ここでは、anyenv の配下に phpenv/phpenv をインストールして、そのプラグインとして CHH/php-build を…

PHP と HHVM のベンチマーク実行時間の比較 (2014 年 10 月版)

PHP カンファレンスでは、HHVM の話や PHPNG の話を聞くことができました。しばらく前に、それぞれ一度ベンチマークを取っていたのですが、あらためて計測してみました。結果は以下のとおりです。それぞれの実行環境で、5 回ずつ実行した平均の実行時間をプ…

PHP Conference 2014 を聞いてきました

PHP Conference 2014 というイベントに参加してきました。このような大規模なイベントに参加するのは初めてだったのですが、どのセッションもとても面白い話が聞けて、楽しく過ごさせてもらいました。私はどちらかというと、フレームワークやサービスの話よ…

「オープンデータ・ベリーとちぎ」のトラフィックカウンターデータで遊ぶ

先月から、栃木県が「オープンデータ・ベリーとちぎ」というウェブサイトを公開しています。さまざまなカテゴリのデータが公開されていますが、その中でもトラフィックカウンターのデータが面白そうだったので、Excel でグラフを作成して遊んでみました。 オ…

POH Lite の深さ優先探索アルゴリズムの計算時間

Paiza オンラインハッカソン Lite の開催が終了して、公式ブログに模範回答などが掲載されていました。掲載されているアルゴリズムは、(1) 最小金額を深さ優先探索で求めるもの、(2) 動的計画法を利用するもの、(3) 削減可能金額を最大化する問題に置き換え…

ワンライナーで Fizz Buzz

Fizz Buzz をワンライナーで書いてみます。ただし、ワンライナーといっても awk などを使ってしまえば普通のプログラミング言語で書くのと変わりませんので、そのような言語を使わず、また、シェルの for や while, if といった制御構造も使わないという制限…

データの違いによる POH Lite のプログラム実行時間の変化

先日、paiza オンラインハッカソン Lite の問題を解くプログラムを作成しました。作成したプログラムは、枝刈りによって解の候補を狭めながら処理を進めるもので、データの性質によって実行時間が大きく変わります。今回は、この様子を調べてみます。問題の…

paiza オンラインハッカソン Lite のプログラム実装

paiza オンラインハッカソン Lite のプログラムを実装しました。ソースコードは GitHub で公開しています。もともと、プログラムの動作確認用に n = 10,000 までのサンプルデータを作成したのですが、作成したデータの答えが現実的な時間で得られるよう*1、…

paiza オンラインハッカソン Lite を大きなデータで試す

以前にも参加した paiza オンラインハッカソンに新しい問題が出題されていたので、さっそくチャレンジしてみました。ウェブサイトはこちらです。 天才火消しエンジニア霧島「もしPMおじさんが丸投げを覚えたら」|paizaオンラインハッカソンLiteところが、今…

SVM による MNIST 手書き数字分類結果の詳細

LIBSVM の svm-train, svm-predict に -b 1 を指定すると、分類結果に加えて、データが各クラスに属する確率を出力してくれます*1。今回は、このオプションを指定して MNIST の手書き数字データを分類して、その結果を詳細に見てみたいと思います。実行方法…

サポートベクトルマシンで MNIST 手書き数字データを分類する

サポートベクトルマシン (SVM) を用いて、MNIST 手書き数字データの分類を試してみます。SVM の実装は広く使われているものがいくつかありますが*1、今回は LIBSVM を利用します。LIBSVM は以下のウェブサイトから入手できます。 LIBSVM -- A Library for Su…

MNIST 手書き数字データを画像ファイルに変換する

MNIST 手書き数字データは、0 から 9 までの手書きの数字 70,000 点を収録したデータセットです。機械学習やパターン認識の手法を確認するために利用できます。以下のウェブサイトからデータをダウンロードできます。 MNIST handwritten digit database, Yan…

CentOS 7 で HHVM をビルドする

CentOS 7 がリリースされたので、HHVM をビルドしてみました。CentOS 7 では、hop5 リポジトリのパッケージに頼らず、公式リポジトリと EPEL だけで HHVM をビルドできました。この手順を紹介します。なお、今回の記事は、HHVM をビルドしてコマンドラインか…

プログラマのための文書推薦入門 (社内勉強会の発表資料)

勤務先の社内勉強会で、機械学習を用いた文書推薦*1に関する基本的なことがらについて説明しました。その資料を公開します。 プログラマのための文書推薦入門 from y-uti 数学やコンピュータサイエンスを専門的に学んでいないエンジニアでも理解しやすいよう…

PHP の array と Traversable

PHP の foreach に配列ではない値を渡すと、警告が出力されます。次のような test.php というスクリプトを作成して確認します。 $v) { print "$k => $v\n"; } これを実行すると、次のような警告が出力されました。 $ php test.php PHP Warning: Invalid arg…

Unity でディリクレ分布のグラフを描く

Unity の ParticleSystem を使って、3 変量のディリクレ分布のグラフを作成してみました。ウェブブラウザ上で動かせます。 Unity Web Player | unity-dirichlet-distributionソースコードはこちらです。 y-uti/unity-dirichlet-distribution · GitHub三角形…

Unity で正規分布のグラフを描く

先日、第78回 PHP勉強会 というイベントに参加して、Unity の話を聞くことができました。私は Unity に触ったことはなかったのですが、それほど難しくもなさそうだと思えたので、簡単なプログラムを作成して遊んでみました。私はデータの可視化といった分野…

CentOS 6.5 で HHVM をビルドする

CentOS 6.5 で HHVM をソースコードからビルドしたので、ビルド手順を紹介します。CentOS 用のバイナリパッケージは hop5 という非公式のリポジトリで公開されています。これは、以下のウェブページの手順で導入できます。 Naresh: Installing HHVM 3.0.1 on…

PECL stats のバグ修正 (DCDFLIB, RANDLIB の差し替え)

前回の記事で紹介した PECL stats には、いくつか、正しく動作しない関数があります。利用しているライブラリ (DCDFLIB, RANDLIB) のバージョンが古いためです。報告されているバグの一つは、こちらです。カイ二乗分布の累積分布の逆関数を計算できない*1と…

PHP の統計関数を使う

PHP では、PECL stats 拡張モジュールを導入することで、さまざまな統計関数を利用できます。今回は、このモジュールを試してみます。公式の情報は以下にあります。 PECL :: Package :: stats PHP: 統計関数 - Manual なお、このモジュールは DCDFLIB, RANDL…

PHP new generation のベンチマーク実行時間の計測

PHP new generation というのがアナウンスされていたので、試してみました。 php.internals: phpng:_Refactored_PHP_Engine_with_Big_Performance_I mprovementビルド、実行手順等は以下のウェブページに記載されています。 https://wiki.php.net/phpngHHVM…

Hack/HHVM 入門 (社内勉強会の発表資料)

勤務先の社内勉強会で Hack について紹介したので、その発表資料を公開します。 Hack/HHVM 入門 from y-uti