0.1x)になります。xがある数だった場合、yはこの値を平均に持つポアソン分布で分布するということです。2.718...です。b2が正なのでxが大きくなるほどリンク関数の指数の肩は大きな数になります。大きなxではyは大きな平均を持つポアソン分布をします。図を見ると、確かにxが大きくなるにしたがってyの分布は大きな値を取るようになっています。このように、ポアソン回帰で得られるのはxの変化によってyの分布がどのように変化するかという傾向です。変化すると言うだけでなく、どれくらいの分布を伴って変化するかも分かります。DigitsChainクラスとして定義した。今回は、このDigitsChainクラスよりモデルを作り、読み込んでいたデータを使って、学習とテストをやってみる。実際のプログラムは以下のようになる。正解率これって、Irisのときと同一に見えるはずだ。モデルの生成つまり、粗い手書き文字用に作ったDigitsChainクラスのオブジェクトを作って、前と同じ変数modelに与えている。今回の変更は1行、それ以前の変更も数行であり、全体で10行も変更していない。いうか、変更する必要がありそうなところが見つからない。動かしてから考えよう。テスト結果は91.15%の正解率で、ちゃんと動いているようだ。IrisからDigitsへの変更は、同じクラス分けタイプのデータを使ってクラス分けしたので、僅かな変更で済んだ。4種のデータからなるIrisと、8x8の画像データからなるDigitsが、ほぼ同じプログラムで動いてしまうのだ。この適応性の高さは恐ろしいほどだ。著、岩波書店)という、とても分かりやすい統計モデリングの入門書を、さらに分かりやすくするために読書メモをまとめたものです。今回は第2章、確率分布と統計モデルの最尤推定についてまとめます。この章では主にポアソン分布と、ポアソン分布のパラメータの最尤推定について解説されています。ポアソン分布とは、下図のような分布です。ポアソン分布はパラメータを一つ持っていて、それが決まると分布が決まります。最尤推定とは、あるデータが得られている時、そのデータが生成される確率が最大になるように、分布のパラメータを選ぶ推定方法です。データは何でもいいですが、現実の世界で測定された数値です。その数値をモデルを使って説明しようというのですから、実際に得られているデータに最もよく適合するモデルが欲しいと思うのは当然です。適合するというのは、確率の言葉で言えば最大の確率を与えるということなので、このようにパラメータを推定するのが合理的ですね。問題が単純な場合には、解析的に確率を最大化するパラメータを求めることができるのですが、複雑な問題では普通は数値計算で求めます。その様子を見やすくするデモを用意しました。コードはRで書きました。"\n")このコードが何をやっているか詳しく解説します。最尤推定に使うデータを用意しています。持つポアソン分布から得られる確率を計算しています。確率を計算しているのは以下のコードです。計算し対数を取って和を計算しています。確率の積をそのまま計算すると値が小さくなりすぎて計算できないので対数を取って和を計算しました。ちなみにこの確率には尤度という名前がついています。後は結果をコンソールに出力しています。実行結果は次のようになります。時に最大になっています。何度か実行してみると、データを生成するのに使ったポアソン分布の平均に近い時に尤度が一番大きくなっていることが分かると思います。データの本当の分布は最初に引いた乱数を平均のポアソン分布なのだから、その乱数に近い推定を行った時に、最も当てはまりがよくなるのは順当な結果です。このように最尤推定を行えば、統計処理したいデータに対し、順当な統計分布を見つけることができるのですね。Tweet手書きデータ読み込み方法の説明は前々回に行い、画像データをmatplotpyで表示してみせた。今回は、読み込んで、Irisのときと同様に、画像のデータをX、教師データをYに読み込む。前回は、出力が3つだったが、今回は数字の0〜9までで10個に変わるのを考えて、以下のように書き換えた。1.0このデータを学習データとテストデータに分割する訳だが、データ数が150から1797に増加したので、2/3を学習データに、1/3をテストデータにしてみた。0]]次に、一番肝心なモデルについて変更する。中間層が6ノードである。digitsのとき、入力ノードは8x8の画像なので、64になる。出力ノードは、0〜9の各値に対してノードがあるので、10になる。中間層のノードであるが、64と10から適当な値を考えるべきである。ここではとりあえず、64の半分の32を与えてみる。中間層のノード数が変わっても、プログラム中で変更するのは、たった2個所である。中間層のノード数に名前を付けてしまえば、一箇所にすることも可能だ。h2これでほぼ準備は出来たはずなので、走らせるのは次回にしよう。し、学習結果をテストするようになっていた。このとき、次のような図をイメージするのだ。Scratchからのものだ。あ、これはPythonではなく、RでNNをやる説明のようだ。いいか、言語なんて大差ない。図にはデータの流れが示されていないが、データは左から入り、右に向いて流れていく。この図を、次の『Chainerによる実践深層学習』のIrisのプログラムのうち、上の図に対応した部分だけを示す。h2このうち、今注目すべきは、以下の部分だけである。上の図ときちんと対応しているのが分かるだろう。入力層の4は、データが4種の値から構成されているからである。中間層の6は、まあ適当に決めて良いのだが、詳しい説明は面倒なので省略する。出力層の3は、Irisでは3種類の種の分類(クラス分け)をしたいので、3になっている。ここまで理解したら、前回説明した8x8のめちゃくちゃ粗い手書き数字データの分類に挑戦してみよう。いうことで、次回につづく。TweetDLの最初に使われるデータ例が、ほとんどの場合、iris(アヤメ)のデータだ。3種類のアヤメについて、花びらの長さと幅、がくの長さと幅のデータが、それぞれのアヤメの種類に対して50組ずつデータがあり、全体で150組のデータがある。これから学習データとテストデータに分けて、学習後、テストデータによりアヤメの種類を正しく分類できるかようになっているか調べるのであった。これには飽きたので、他のデータで試したい。そのためには、まず、アヤメのデータがどこに存在し、どのように利用されているかを調べないとダメだ。1.0この中で肝心なのは最初に1行で、datasetsをインポートし、その中からirisのデータを読み込んでいることが分かる。scikit-learnのサイトにたどりついた。この中のドキュメントに、それらしい情報があった。tasks.この中のload_irisが呼び出されていたのだ。これを他のものに変えて、元のプログラムをちょっとだけ変更して、動くかどうか確かめよう。上の表のloadメソッドをクリックすると、それぞれの説明が現れる。classificationのためのデータらしいので、とりあえず同じタイプのdigitsを使うことにしよう。plt.show()データが1797個あり、1つのデータは64個のデータからなる。matplotlibで最初のデータを表示している。1つのデータは64個の値からなるのだが、実際は8x8の画像データであることが分かる。実際に最初のデータの内容を以下のようにして数値で見ると、画像との対応がよく分かる。dtype=float32)>これから、digitsのデータは1797個の画像データであることが分かる。データの取得が出来たので、今回はここまで。検索このアーカイブについてこのページには、2017年2月に書かれたブログ記事が新しい順に公開されています。前のアーカイブは2017年1月です。次のアーカイブは2017年3月です。最近のコンテンツはインデックスページで見られます。過去に書かれたものはアーカイブのページで見られます。