気体分子運動論(Joule, Kronigの理論)



スポンサーリンク

趣味で統計力学を勉強し始めました。アインシュタインのブラウン運動についての記事を読んでいるうちにもっと知りたいと思ったので。

 

今回は統計力学に入る前の気体分子運動論の取り扱いについて基本的な考えを知るため「Jouke,Kronigの理論」について書こうと思います。

 

参考文献は以下の記事で用いているものと同じです。

 

 


 

  1. 断面積S、高さhの容器(簡単のため立方体)を考えます。その中にN個の分子が入っているとします。そしてこれらの分子同士に相互作用はないものとします。

2. 分子はばらばらに動いていますが、平均をとるとばらつきはなく

  • N/3個はx軸方向に
  • N/3個はy軸方向に
  • N/3個はz軸方向に

動いているものとします。

3.  速さは皆\(v = \sqrt{v_{x}^{2}+v_{y}^{2}+v_{z}^{2}}\)であるとします。

4. 鉛直方向に速さvで移動している分子の数はこれまでの仮定からN/3個です。そのN/3個の分子は単位時間あたりに\(\frac{v}{2h}\)回、上下の壁に衝突します。

 

5. 単位時間あたりの一つの分子の運動量変化は\(2mv \times \frac{v}{2h} \)です

6. 壁が受ける力は単位時間あたりのN/3個の分子の運動量変化に等しいので、以下が成り立つはずです。なおpは圧力, Vは体積です。
\begin{eqnarray}
pS &=& \frac{N}{3} 2mv \times \frac{v}{2h} \\
\leftrightarrow p\frac{V}{h} &=& \frac{Nmv^2}{3h}\\
\leftrightarrow pV &=& \frac{Nmv}{3}
\end{eqnarray}

 


 

今回は一番簡易なモデルなため雑な計算方法ですが、異なる速度成分、異なる質量、異なる分子数として計算したステファンボルツマンのモデルを用いても厳密には意味が異なりますが
\begin{eqnarray}
pV =\frac{Nmv}{3}
\end{eqnarray}

 

の関係式は得られます。そしてステファンボルツマンの理論を用いることで「ボルツマン定数」を定義できたり、熱力学では得ることのできなかった関係式を得ることができます。

次回は「Jouke,Kronigの理論」を広げた「ステファンボルツマンの理論」について述べていきたいと思います。

 


スポンサーリンク

記事が役に立ったらシェア!

レビィ分布をグラフ描画して見た(python&gnuplot)



スポンサードリンク

今読んでいる本「ウォール街の物理学者 (ハヤカワ・ノンフィクション文庫)」という本にレヴィ分布という確率分布が出てきました。

初めて聞いたのでpython やらgnuplot使って描画して見るかと思いやったので書いときます。誰得なのか不明ですが笑

レヴィ分布とは?

wikipediaに『レヴィ分布は、安定な分布のなかでも解析表現可能な確率密度関数を有する数少ない分布のひとつである。』と紹介されています。

初めて聞いたけど、正規分布とかコーシー分布と並んで紹介されているということは結構使えそうな確率分布です。

以下の式で表現されます。
\begin{eqnarray}
f(x;\mu,c)=\sqrt{\frac{c}{2\pi}} \frac{e^\frac{-c}{2(x-\mu)}}{(x-\mu)^{3/2}}
\end{eqnarray}

ここでは[/latex]\mu = 0,  c = 0.5,1,2,4,6,8\(\)と変化させてグラフ描画しました。

pythonの場合

描画に用いたコード

グラフは以下になります。



スポンサードリンク

gnuplotの場合

描画に用いたコードは以下です。

gnuplotの場合はファイル名.gpで上記を保存し、gnuplot “ファイル名.gp”で実行すれば描けます。

ぱっとみ同じに見えますが、c=1とc=0.5のときの形が大分違います。gnuplotの関数指定のところを見ても特に違っている様子はないんですけどねー笑

 

比較してわかったこと

gnuplotで書くよりもpython で書いた方が綺麗に書けそうです。それにnp.arrayでxの刻み幅も指定できるので、粗いグラフから滑らかなグラフまで速攻で書けそうですし。

gnuplotはどうやって関数描いてるのか不明です。xの刻み幅の指定方法もよくわかりません。もしかしたら刻み幅を指定する方法があって、細かく指定してやればpythonのように滑らかで綺麗なグラフが書けるのかもしれません。

 


簡単な関数のグラフ書くならpythonの方が良さそうです。ライブラリも豊富ですしね。今回使ってませんが、listとか使って各グラフ(各c)の設定とかを保持しておいてそのlistの全要素に対して関数を描画するようにしたらもっとコードも短くできますね。

 

記事が役に立ったらシェア!

言語処理100本ノック(第3章前半)



スポンサードリンク

第2章後半の続きです。どうやらここからが本番のようです。正規表現という初めて触れるので他の方のサイトを参考にしながらゆっくりやっていきたいです。

参考にさせていただいたサイトはこちら

 

Wikipediaの記事を以下のフォーマットで書き出したファイルjawiki-country.json.gzがある.

  • 1行に1記事の情報がJSON形式で格納される
  • 各行には記事名が”title”キーに,記事本文が”text”キーの辞書オブジェクトに格納され,そのオブジェクトがJSON形式で書き出される
  • ファイル全体はgzipで圧縮される

以下の処理を行うプログラムを作成せよ.


20. JSONデータの読み込み

Wikipedia記事のJSONファイルを読み込み,「イギリス」に関する記事本文を表示せよ.問題21-29では,ここで抽出した記事本文に対して実行せよ.

ファイルを読み込み、一行ずつ処理するところはこれまでもやってきたので問題ないと思います。

ファイルがjson形式なので、json.loads()関数を用いてjson形式に変換しています。

問題はarticle_dict[“title”]==[“イギリス”]の部分です。

どうやらこれは記事内で利用されている、htmlタグを指定するときに利用するらしい。htmlファイルには

実際に

みたいな感じでいろいろなタグが使われている。

今回は要するにファイル内の

となっている部分について読むということであろう。

実行結果:

とこんな感じになっていればおっけー。

 

21. カテゴリ名を含む行を抽出

『記事中でカテゴリ名を宣言している行を抽出せよ.』

 

特に難しい処理はしていないが、自分的には11行目の”Category” in line:のところが気になった。

lineはlinesの時点で文字列として扱われているので”Category”としていきなりif文の中で宣言して構わないみたいだ。

if の条件文で””を使うことがなかったので、慣れないが自然言語処理なら普通のことなのだろう。

実行結果:

for文を使っているためlineがリスト型になってしまうのは否めない。

 



スポンサードリンク

22. カテゴリ名の抽出

『記事のカテゴリ名を(行単位ではなく名前で)抽出せよ.』

module化しなくてもいけるが、インデントが多くなるのでモジュール化しました。

正規表現を扱うためにreモジュールをインポートします。正規表現とは文字列の並びやパターンを特定するもの。

どんな使い方するのだろうかとかは、こちらの方のサイトを見ていただけるとわかると思います。

ちょっとこれは新しい情報が多すぎて混乱しそうです。そもそもなんでこんなめんどいことしなきゃいけないのか?など聞きたいことは山ほどあります。

compileというコマンドで正規表現パターンを定義してやるぞって意味。

findall()は上で指定した正規表現パターンを()内の引数から抽出するための関数。

正直なところ^とか. とか意味がわからない。おそらく今回のデータが文章構造になっていて一行ごとに読み込み、処理をするようになっているので行頭を指定してやる必要があるのだと思う。

.*で任意の文字0回以上と指定しています。どんな文字でも何回でもおっけーよってことだと思うが、それ指定する必要ねーじゃんって思ってしまう。

独学の限界を少々感じるが、理解できたらおいおい更新していきます。

 

23. セクション構造

『記事中に含まれるセクション名とそのレベル(例えば”== セクション名 ==”なら1)を表示せよ.』

セクションとは記事の見出しです。第1章とか通常の文章部分よりもでかい文字で書いたりする部分のことです。なのでセクション構造とはその文章の章構成とか目次みたいなもんです。

レベルというのはその章とか目次がどの階層にいるかというのを表したものです。一番上の階層が「1」ということです。

正規表現部分は慣れませんが、実際に自分でやった方が早いのでしょう。一発でなんか絶対うまく行かないと思いますが笑

の部分はセクション名が==セクション名==という形式で書かれているため、2個以上という意味で2が入ります。もう一個階層が下がると=== サブセクション名===という感じでしょうか。

これがないと、例えば

==セクション構造== ===サブセクション=== ====サブサブセクション====みたいな階層構造の場合、最後まで一気に読み込んでしまうということだろうか。?は直前の正規表現で指定したパターンの最小回数(1回)でのマッチングを意味するものなので、次に==が出てきた瞬間とこまでしかマッチングしない。

こちらのサイトを参考にすると理解できそうです。

後方参照というものらしく、終わりと開始が同じパターンならそれを利用して\numberで開始を指定してマッチングさせることができるものらしい。

== セクション名 ==みたいな感じで空白があるものがデータに含まれていたため以下のような空白除去が必要らしい

実行結果:

こんな感じ。

 

24. ファイル参照の抽出

『記事から参照されているメディアファイルをすべて抜き出せ.』

メディアファイルが何を意味しているのかわからなかったのですが、jpgとかsvgファイルのことらしいです。そしてそれらのファイルの前にファイルとかfileとか書かれているのでそれを指定する正規表現が上の一行です。

verboseは正規表現を便利に書きやすくするための関数です。公式ドキュメントにも

「パターンの論理的なセクションを視覚的に区切り、コメントも入れることができます。」と書かれています。

今回はこれまでのができていれば簡単にできる問題です。

実行結果:

とこんな感じです。

次は第3章後半です。


スポンサードリンク

 

 

記事が役に立ったらシェア!

Rで学ぶグラフ理論(第4回)



スポンサードリンク

前回の続きでグラフ構造の評価方法について述べていきます。

相互性

有向グラフにおいて、頂点間の関係のうち有向辺がお互いに向いているものの割合です。言い換えると両思いの割合です。

以下の図に示すように、頂点には4パターンの関係が考えられます。

そして上の図で言えば、相互性は次のように定義されます。

\begin{eqnarray}
\mathrm{reciprocity} = \frac{a}{a+c+d}
\end{eqnarray}

しかし上記の定義は一部である。上の定義式の分子にbを加えた場合の定義も存在する。

両者の区別は、分析の目的に応じて異なる。企業間の株式のネットワークにおいてはaとbは全く別の状態であるが、集団における贈与のネットワークにおいて、互酬性の規範がどの程度守られているかを知りたいときには、aとbは同等のものとして扱うべきである。

なぜなら、互酬性の規範に反するのは、贈与が一方向に行われている場合(図のcとd)であり、お互いに無関係(b)の場合は、規範に反していない。一応その場合の定義を以下に示す。
\begin{eqnarray}
\mathrm{reciprocity} = \frac{a+b}{a+b+c+d}
\end{eqnarray}

階層的構造

出-木構造の必要十分条件として以下の4つが定義されている。

連結性、階層性、効率性、最小上界性である。これらに違反している程度からある有向グラフが階層的構造を持っているかどうかを評価する。

連結性

辺の方向を無視した時グラフ全体で相互に到達可能な頂点の組みがどれくらいあるかによって連結性を定義できる。辺の方向を無視しても相互に到達不可能な頂点の組の数をVとすると、全ての頂点間の組みの数に対するその比率を1から引くことで求める。

\begin{eqnarray}
\mathrm{connectedness} &=& 1 – \frac{V}{\frac{n(n-1)}{2}}
&=& 1 – \frac{2V}{n(n-1)}
\end{eqnarray}

階層性

上の図のように、上から下へ一方向ではなく、相互に到達可能な関係があるとすれば、それは上下関係とは呼べず、階層性に違反していることになる。

よって、双方向に到達可能な頂点の組みの数V、少なくとも一方から他方へ到達可能な頂点の組数でをMaxVとすると以下の式で表現できる。

\begin{eqnarray}
\mathrm{hierarchy} &=& 1 – \frac{V}{\mathrm{Max}V}
&=& 1 – \frac{2V}{n(n-1)}
\end{eqnarray}

上の図の場合、双方向に到達可能な組みがないので、階層性は0になる。


スポンサードリンク

弱連結

上のグラフでいうと頂点1,2,3,のような関係。

離散数学的な定義

  • • 任意の頂点u, v間が、弧ではつながっている

図で示すと

みたいな感じである。

効率性

出-木構造は上位の頂点から下位の頂点へと必ず一つの経路を通って到達できるという意味で効率的である。しかしそのような経路が複数ある場合それは無駄であるため、そのような効率がどの程度実現しているかを表す指標が効率性である。

今、n個の頂点とm個の有向辺からなる弱連結の有向グラフを考える。もしこの有向グラフが出-木構造なら有向辺の数は、m = n -1 となる。

よって出-木構造でない実際の有向グラフに含まれる冗長な有向辺の数はm-(n-1)となる。

mの理論的な最大値はn(n-1)となるから、冗長な有向辺の数の理論的最大値はn(n-1)-(n-1)である。

これらを用いて、効率性は次のように定義できる。ただしVは冗長な有向辺の数、MaxVは冗長な有向辺の理論的最大値である。

\begin{eqnarray}
\mathrm efficiensy &=& 1 – \frac{V}{\mathrm{Max}V}\\
&=& 1 – \frac{m-(n-1)}{n(n-1)-(n-1)}\\
&=& 1 – \frac{m-(n-1)}{(n-1)^2}
\end{eqnarray}

弱連結でない場合(すいませんがここからよく理解できていません)

文章も砕けた感じになります。

私が参考にしている本では

「この場合は、いくつかの連結成分に分かれている場合がある。この場合、それぞれの連結成分が出- 木構造となっているのがもっとも効率的である。」と書いてあります。

????

まず言葉の定義から

連結成分

以下の図を考えます。

連結成分とは同値関係におけるグラフGの部分グラフである。

{1,2,3},{4},{5,6,7}は連結成分を誘導するという。

でこの連結成分が、上の{1,2,3}のように閉ループを構成するのではなく、

こんな感じになってれば、良いと言っています。

要は、全体で」見たと時に弱連結でなくとも、部分グラフ単体で見た時に、出-木構造になっている時に、もっとも効率が良いということだろう。

弱連結でない時の定義

直感的に十分理解できる。別れている部分グラフのごとに先ほどの定義式を使うだけである。そしてシグマを取れば良い。

有向グラフがN個の連結成分に別れている時、i番目の連結成分に含まれる頂点の数をniとすると、効率性は以下のように定義できる。
\begin{eqnarray}
\mathrm{efficiensy} &=& 1 – \frac{m-\sum^{N}_{i=1}(n_{i}-1)}{\sum^{N}_{i=1}n_{i}(n_{i}-1)-(n_{i}-1)}\\
&=& 1 – \frac{m-\sum_{i=1}^{N}(n_{i}-1)}{\sum_{i=1}^{N}(n_{i}-1)^2}
\end{eqnarray}

実際に計算してみる

階層構造の4つの指標について実際に計算してみることにする。

計算する有向グラフを以下に示す。

計算の簡便化のために以下のような表を作成する。条件に当てはまるものが1、当てはまらないものが0である。

頂点のペア 一方向に到達可能 双方向に到達可能 最小上界をもつ
1-2 0 0 0
1-3 1 0 1
1-4 1 0 1
1-5 0 0 0
2-3 0 0 0
2-4 1 0 1
2-5 1 1 1
3-4 1 0 1
3-5 0 0 0
4-5 1 0 1

連結性

この有向グラフは弱連結であるので、全ての頂点間で到達可能であるため連結性は1である。

階層性

有向辺を辿って少なくとも一方向に到達可能なペアに対する双方向に到達可能なペアの比率を1から引いて求めるられる。一方向に到達可能なペアは6つ、両方向に到達可能なペアは1つなので

\begin{eqnarray}
1-\frac{1}{6} = 0.833333
\end{eqnarray}

効率性

効率性は「階層性のうち冗長な経路の数の多さ」を評価しているので、上の表は関係ない。頂点の数と有向辺の数に依存するので、
\begin{eqnarray}
1-\frac{6-(5-1)}{(5-1)^2} = 0.875
\end{eqnarray}

最小上界性

上の表より最小上界を持たないペアの数は4ペア。最小上界性を求める式を用いて計算すると
\begin{eqnarray}
1-\frac{2 \times 4}{(5-1) \times (5-2)} = 0.33333
\end{eqnarray}

となる。


以上でネットワーク構造の評価法の相互性と階層構造について述べてきた。

次は、前回と前々回にやったColemanの高校生の友人ネットワークのデータを用いて、これまで述べてきた指標について計算し、その結果とそこから導かれる背景について論じていこうと思う。



スポンサードリンク

記事が役に立ったらシェア!

ゲーム理論とトルエル

 



スポンサードリンク

今回は「トルエル」という例を用いて「ゲーム理論」について述べていきます。

「ゲーム理論」とは?

もともとボードゲームを戦略的に戦うところから生まれたものです。この言葉の生みの親は、マンハッタン計画にも参画していた物理学者「ジョン・フォン・ノイマン」です。

ゲーム理論の研究者は、冷戦時代に戦略に関する助言を求められたこともあるそうです。ノイマンは実際に、戦略開発としてアメリカに雇われています

現在では、株式市場の研究に大きな意味を持っています。また最善の戦略を慎重に実行することは問題解決によく似ていることから、ゲーム理論は人工知能の研究者にとってもかなり興味深いテーマであると言えるでしょう。

トルエルへの応用

「トルエル」とは「3人で行う決闘のようなもの」です。

トルエルの手順を説明していきます。

1、A,B,Cの3人がいます、Aが拳銃を打ち、人に当たる確率は\(\frac{1}{3}\),Bが拳銃をうち、人に当たる確率は\(\frac{2}{3}\),Cが拳銃をうち人に当たる確率は100%=\(\frac{3}{3}\)です。

2、3人は三角形になるように立っていて、拳銃を打つ順番は、拳銃の下手な順です。すなわち、A→B→Cの順番です。

3、一発当たったら人は死ぬとします。このとき、最初に打つAは誰に向かって発砲すれば良いか?

文章だけではわかりづらいと思うので図を示します。

直感的には、Aは命中率100%のCの向かって打つのが良いと思われるかもしれませんが、答えは「どちらにも打たない(空に向かって打つ)」が正解です。

これがAが生き残る最善の策です。

空に向かって発砲したとしましょう。次に発砲するのはBです。Bは誰に向かって打つかというと間違いなくCです。なぜならCからすると脅威なのはAとBのうち、Bだからです(命中率の高い方)。

なので、Bは「次にCが銃口を向けてくるのは俺だ」となりますので、Bは一刻も早くCを消しにいきます笑

BがCに発砲し、外れる場合と当たる場合があります。順番に見ていきましょう。


スポンサードリンク

 

  • 外れる場合

次に打つのはCですので、CはBに向かって発砲し、Bは死にます。

そしてAは一番最初に死ぬのは免れるわけです。そして次はAです。Aは残ったCに向かって打つしかありません。

  • 当たる場合

Cは死にます。そしてこの場合もAは一番最初に死ぬことは免れるわけです。

そして次に打つのはAですので、AはBに向かって発砲すれば良いわけです。

 

どちらの場合も一番最初に死ぬのはAではなく、BかCです。そして実はAにとっては「3人でやる決闘の一番最初に打つ」のではなく、「2人でやる決闘の一番最初に打つ」という状態に持っていけるわけです。

一見、一番拳銃の下手なAが不利なように見えますが、戦略的に戦うと実はそうではないということがわかります。こういう風な考え方が「ゲーム理論」です。

「ゲーム理論」を応用した問題は他にもたくさんありますので、調べて見てください。もちろん、後々ここでも記事にしていきます。



スポンサードリンク

記事が役に立ったらシェア!

三平方の定理と余弦定理の関係



スポンサードリンク

先日、僕が教えてもらったことを書こうかなと。

今回は「余弦定理と三平方の定理」の関係です。三平方の定理は実はいらない?ということに気づかされました。

 

余弦定理とは?

軽く復習します。

以下のような三角形があったとします。

この時に
\begin{equation}
a^{2}=b^{2}+c^{2}-2bc\cos\theta
\end{equation}
が成り立ちます。要は三角形の6つの情報(辺三つ、角度三つ)のうち三つがわかれば他は全部計算で求まるということです。

これが余弦定理です。


スポンサードリンク

ピタゴラスの定理(三平方の定理)

次にピタゴラスの定理です。これについては以前に記事に書いたので詳細はそちらを参考にしてください。

>>>ピタゴラスの定理

ここでは以下の三角形の時の公式を書いておきます。

\begin{equation}
a^{2}=b^{2}+c^{2}
\end{equation}

 

余弦定理と三平方の定理の関係

本題に入ります。

二つの式を並べて確認して見ましょう。

\begin{eqnarray}
a^{2}&=&b^{2}+c^{2}-2bc\cos\theta\\
a^{2}&=&b^{2}+c^{2}
\end{eqnarray}

\(-2bc\cos\theta\)があるかどうかということが、みてわかると思います。

では、この\(-2bc\cos\theta\)が0になるときはどんな時でしょうか?

bとcは0になり得ないので、\(\cos\theta = 0\)の時であることがわかります。

要するに\(\theta = 90°\)の時です。

\(\theta = 90°\)はどんな三角形かというと、直角三角形ですね。

すなわち「三平方の定理」は「余弦定理」の一部、「三平方の定理」を全ての\(\theta\)に対して拡張したものが「余弦定理」であることがわかりますね。

授業で習うときは全く別々の公式のように習うかもしれませんが、実は余弦定理を知っていれば、ピタゴラスの定理を覚える必要はないのです。

式の向こうに見える関係に注目すると数学は楽しくなるので、こういう思考を大切にしていきましょう。


スポンサードリンク

記事が役に立ったらシェア!

地球のトンネル -反対側まで何分?-



スポンサードリンク

地球の重力

皆さん常日頃から感じている重力。この重力のおかげで、我々は大地の上に立つことができています。

また飛行機からスカイダイビングしたり、ジェットコースターで落ちるスリリングを楽しんでいるわけですね。

ではこの重力の向き、我々日本の反対側にいる人たちはどのように感じているのでしょうか。

答えは簡単、というよりも常識とでもいいましょうか。

地球の反対側にいる人だって普通に立っているのです。答えはやはり地面に向かって重力を感じている、です。

要するに、我々地球の上に住む生命は皆、地球の中心に向かって重力で引っ張られているのです。

地球の重力は地球中心に向かっている



スポンサードリンク

地球の中心を貫くトンネルを作ろう!

図1を見ればわかる通り、地球の反対側では重力の向きは反対ですね。

ということは、地球の中心までは重力で加速されてトンネルを落ちていき、中心を通り過ぎた後は重力で減速しながらトンネルを登っていく、そんなトンネルが作れるはずです。

作れるかどうかという現実問題はさておき、この夢のようなトンネルができれば、なんのエンジンも必要なくおよそ45分で反対側に到着できます。

必要なのは母なる大地、地球の重力エネルギーだけです。

図の上半分では、地球の重力 (青矢印) で加速され地球の中心へ向かう。 中心を通り過ぎた後は重力で減速されながら 反対側の地表に向かって上昇していく。

 

 

 

記事が役に立ったらシェア!

パーセプトロンのアルゴリズム(pythonその2)



スポンサードリンク

前回までで、パーセプトロンの理論的な背景と、そのデータセットの用意のところまではすでに説明し終えたので、その続きから説明していきます。

>>>全体のソースコードがみたい方は前回の記事をみてください。

>>>パーセプトロンの理論的な背景についての記事

パーセプトロンのアルゴリズム(確率的勾配降下法)

w0,w1,w2の初期値は全て0で始めていますね。

biasの部分は少し説明する必要があります。


スポンサードリンク

バイアス項とは何か?

バイアス項とはベクトル\(\phi_n\)の第一成分です。

ベクトル\(\phi_n\)の説明については以下の記事を読んでください

>>>パーセプロトンのアルゴリズム(線形分離)

求める直線の方程式を
\begin{eqnarray}
f(x,y) = w_{0}+w_{1}x+w_{2}y
\end{eqnarray}
とおきましたが、
\begin{eqnarray}
f(x,y) = cw_{0}+w_{1}x+w_{2}y
\end{eqnarray}
と仮定することもできます。この場合、ベクトル\(\phi_{n}\)のバイアス項は「c(任意定数)」になります。

ベクトルwの更新には\(t_{n}\phi_{n}\)が用いられますので、w0は±cだけ更新されることになります。

なので、このcを適切に選択すれば、アルゴリズムの収束速度を改善できるということになります。

上のコードではこのcの値(biasの部分)をデータに含まれる全てのxn,ynの平均値を使っています。

なぜ平均値をとるのか

データの値(xn,yn)がとてつもなく大きい数(1000とか10000)で、平均的に10000とかの場合、勾配降下法のアルゴリズムより、w1,w2も10000程度の大きさで一気に増減します。

もしバイアス項が”1″ならw0の値は更新されても±1でしか変化しないことになります。

w0の変化がw1,w2の変化に比べて小さすぎるので、正しいwが得られるのに時間がかかります。

そこでバイアス項もデータの平均的な値にすることで、w0の変化率もw1,w2と同等にしてやろうという意味です。

Iteration

Iterationはベクトルwの更新回数です。今回は30回です。

ここはそんなに説明する必要はないと思います。

前々回の記事で説明した理論的な計算をおこなっている部分です。要は「更新」作業の一番の根幹の部分です。

判定誤差の計算

分散が大きい場合と小さい場合での比較として、エラー率を計算しています。

前にも述べましたが、分散が小さい場合は綺麗に直線で二つのデータ群を分割できますが、分散が大きいと二つのデータ群に重なる領域が生まれますので、直線で分割することができなくなります。

30回更新し直しても、直線で分割したエリアとは違うエリアにデータが含まれている場合、それをエラー率として表示するようにしています。

結果の表示、2種類の分散での実行

ここはグラフを作るだけですので、特に問題ないと思います。

最後のfor文以降で、”2種類の分散”でこれまでの全ての計算を実行するようにしています。

忘れたかもしれませんがVariance(分散)は最初に配列で設定していますね。


スポンサードリンク

計算結果

上が計算結果です。

分散が小さい方(左上)は綺麗に直線で分割できます。その証拠にw0,w1,w2の更新も7回目くらいで収束しているのがわかります(左上)。

分散が大きい方(右上)は更新を30回やっても直線で綺麗に分割することはできず、エラー率6パーセントになっています。

実際、●のある領域に×のデータが入り混んでいます。エラーが出ているということは、30回更新してもw0,w1,w2は収束していないことが右下のグラフからわかります。

以上、パーセプトロンのアルゴリズムについて理論と実際にコードを用いてどのように計算されているのか述べてきました。

データセットの用意は乱数を用いているので、計算するたびに結果が異なります。更新回数や、データ数等変えて遊んでみてください。

 

 

記事が役に立ったらシェア!

パーセプトロンのアルゴリズム(python編)



スポンサードリンク

ここではパーセプトロンについて実際のプログラムを、pythonの数理統計関数の説明していきながら述べていきます。

計算に用いたプログラム

 

最初のパラメータのところは問題ないと思います。

Variancesdで2種類の分散を用意しているのは、分散が大きい時と小さい時で、分類結果を比較するためです。

分散が大きい時は、二つのデータ群が多かれ少なかれ、重なる領域が生じ、綺麗に二つのデータ群を直線で分割できなくなります。

前ページで言えば、総誤差ΣEは小さくすることはできるが、0にならないということになります。

分散が小さい時は二つのデータ群はそれぞれの中心座標からあまり離れることなく、データが分布するので、領域が明確になり、直線で二つのデータ群を分割できます。

前ページで言えば誤差関数=0の状態です。

データセットの用意に関して

  • varianceは標本から分散を推定する場合に用いるコマンドです。

「分散」とはデータの中心からのバラツキの度合いです。

ここでは、関数の変数として使われていますので、注意してください。

上記は二重にネストした配列を作成しています。


スポンサードリンク

  • multivariate_normal

このコマンドは

のように用いると多次元正規分布の乱数を生成してくれるみたいです。

よくわからないので、途中でreturnの前にprint df1を挟んで確認してみます。

Dateframeコマンドで、マトリクスを作成するみたいです。

columnsでインデックスの指定、さらにマトリクスに行とインデックスを追加する場合には別で

と書いていますね。

  • pd.concat

よくわからないのでprint

linuxのcatコマンドからきているのでしょう。df1とdf2を縦に連結しています。

もう一つ下のdfも不明なので、これまたprint.

df.reindex(np.random.permutationでランダムに並び替えています。

その次のreset_index(drop=True)で左端のインデックスのみ数字順に並び替えています。

以降ではパーセプトロンのアルゴリズムの部分と計算結果について述べていきます。

>>>続きはこちら。



スポンサードリンク

記事が役に立ったらシェア!

パーセプトロンのアルゴリズム(線形分離)



スポンサードリンク

パーセプトロンのアルゴリズム

データを分類する際の境界を決める手法です。

xy平面で言えば、あるデータ群があった場合、それをうまく二つに分類できるような、xy平面上の直線の方程式を探索することになります。

探索フロー(境界直線の決定)

ここでは簡便なため、データが(x,y)で与えられているとし、それらのデータを二つに分類するものとして話を進めていきます。

  1. 直線の方程式をf(x,y)=w0+w1x+w2y=0 と仮定
  2. f(x,y)>0の時t=1、 f(x,y)<0の時t=-1として二つに分類。与えられたデータ(xn,yn)を上の方程式に代入します。なお一番最初は(w0,w1,w2)はこちらで初期値として指定します。

なお分類が正しければ、f(xn,yn)×tn>0

間違っていれば、f(xn,yn)×tn<0 となります。

そして全ての(xn,yn)において、上が成り立つ直線(w0,w1,w2)を決定していきます(パーセプトロン)。

3.f(xn,yn)×tn<0の点(誤分類のデータ)がある場合、それを「誤差」としてカウントします

あるデータ(xn,yn)における誤差の大きさは次式で定義されます。これは幾何学的(点と直線の距離)にイメージできると思います(下の図を参照してください)。

\begin{eqnarray}
E_{n}=|f(x_{n},y_{n})|
\end{eqnarray}
全ての誤分類データにおける誤差の総量は
\begin{eqnarray}
\sum_{n}E_{n}&=&\sum_{n}|f(x_{n},y_{n})|\\
&=&-\sum_{n}f(x_{n},y_{n})\times t_{n}\\
&=&-\sum_{n}(w_{0}+w_{1}x_n+w_{2}y_{n})\times t_{n}\\
&=&-\sum_{n}t_{n}w^{T}\phi_{n}
\end{eqnarray}
ここで\(w^{T},\phi_{n}\)は次式で定義されるベクトルである。
\begin{eqnarray}
w = \left(
\begin{array}{c}
w_0 \\
w_1 \\
w_2 \\
\end{array}
\right)\\
\phi_{n} = \left(
\begin{array}{c}
1 \\
x_n \\
y_n \\
\end{array}
\right)\\
\end{eqnarray}

4. 総誤差ΣEを0(最小)にするように(w0,w1,w2)を探索していく

最も一般的なものが「確率的勾配降下法」です。


スポンサードリンク

確率的勾配降下法

これは「勾配ベクトル」の意味と「確率的」の意味を考える必要があります。

例えばh(x,y)=\(\frac{3}{4}(x^2+y^2)\)のグラフを考えます。

この場合勾配ベクトルは∇h(x,y)=(\(\frac{3}{2}x,\frac{3}{2}y\))となりますが、勾配ベクトルはその値(図で言うところのピンク)を最も増加させる方向を表しています。-∇hの方向に移動すれば、原点0に近づくことになります。

このことから、現在の居場所をxoldとして次の居場所xnewを求めるアルゴリズムが以下の式で表せられることになります。
\begin{eqnarray}
x_{new}=x_{old}-\nabla h
\end{eqnarray}
たとえ勾配ベクトルが大きく、xを更新した時に原点を通り過ぎても、問題ないことは以下の図でわかると思います。原点を行ったり来たりを繰り返し、最終的に原点にたどり着くと、勾配ベクトルは0になるので、そこで停止することになります。

話を戻します。今、勾配ベクトルは以下の式で計算できます。
\begin{eqnarray}
\nabla E(w) &=& \left(
\begin{array}{c}
\frac{\partial E}{\partial w_{0}} \\
\frac{\partial E}{\partial w_{1}} \\
\frac{\partial E}{\partial w_{2}} \\
\end{array}
\right)\\
&=&-\sum_{n}t_{n}\phi_{n}
\end{eqnarray}
そして誤差を0(最小)に近づけるには、上の例で見たように現在のw=(w0,w1,w2)から勾配ベクトルを引けば良いので、

\begin{eqnarray}
w_{new}=w_{old}+t{_n}\phi_{n}   (1)
\end{eqnarray}
となります。「勾配降下法」の「勾配降下」は勾配ベクトルの反対方向にパラメーターを修正して、誤差関数のグラフを下っていくところからきているのでしょう。

では「確率的」とは何を意味しているのでしょうか?

勾配ベクトルの計算方法について、もう少し深掘りしていきます。

\begin{eqnarray}
\nabla E(w) = -\sum_{n}t_{n}\phi_{n}
\end{eqnarray}
上の式から誤差関数の勾配ベクトルの計算は全ての誤分類されたデータの\(t_{n}\phi_{n}\)を合計することを意味しています。

データが大量にある場合、毎回正しい(w0,w1,w2)を更新していくために\(t_{n}\phi_{n}\)を計算するのは時間がかかるので、誤分類のデータを一つ選んで、とりあえずそのぶんだけパラメータを修正します。

そして修正された新しいwを用いて、また誤分類されたデータのうち一つを選んで同様に式(1)を用いて修正していきます。

このように誤分類データをランダムに選んでパラメータを修正するため「確率的」とついています。



スポンサードリンク


これからは、実際にコードを書いてどのように計算が行われているのか、上の説明を元に論じていきます。

>>>続きはこちら。

記事が役に立ったらシェア!