2023年5月4日木曜日

アブダクション

アブダクション~仮説と発見の論理(米盛裕二)を読んだので、内容を整理する。

  • アブダクションとは論理学者のチャールズ・パースが提唱しているもの。
  • 彼によると推論は①演繹、②帰納、③アブダクションの3種類に分類される。それぞれの推論の特色は以下のとおり。
    • 演繹
      • 推論の内容を考慮に入れずに推論の形式(前提と結論の間に成り立つ論理的形式)のみによって真なる前提から必然的に真なる結論が導かれる。
    • 帰納
      • 経験にもとづく蓋然的推論。限られた経験に基づいて一般的言明を行う推論。
    • アブダクション
      • 仮説的推論。仮説を導くための推論。
  • 分析的推論と拡張的推論という分類
    • 分析的推論
      • 演繹推論はこれにあたる。
      • 前提と結論の含意関係の分析のみに関わり、外的な経験的事実の世界には関わらない。そのため経験的事実による反証にさらされない
      • 前提の中に暗々裏に含まれている情報を解明し、それを結論に明確に述べるだけ。
    • 拡張的推論
      • 帰納推論やアブダクションはこれにあたる。
      • 結論は前提の内容以上のことを主張する。
      • 帰納推論の場合は「部分」を述べる前提から「全体」へ知識を拡張する。
      • アブダクションの場合は、前提(事実)からそれを説明するため仮説へ拡張する。
  • 帰納とアブダクションの関係
    • 仮説は帰納を積み重ねるだけでは仮説は生まれない。
    • 例えばリンゴが落ちるのを何回も観察して一般化しても「万有引力」という仮説は生まれない。
    • アブダクションにより仮説を生み、仮説を帰納で推論するという関係。
  • アブダクションの推論の形式は以下のように定式化される。
    1. 驚くべき事実Cがある。
    2. しかしHならば、Cである。
    3. よってHである。
  • アブダクションは、事実Cの観察からそれを説明しうると考えらえる仮説Hを推論するため「遡及推論(retroduction)」とも呼ばれる。



含意(AならばB)の真理値表

 論理学の勉強をしていると最初に躓くのが含意(AならばB, A->B))の真理値表。
教科書には以下のように書いている。


AがTrueの場合は分かるが、AがFalseの時はなぜA→BがTrueになるのだろう?

答えとしては、A→Bは「Aが成り立つ前提が満たされればBが成り立つ(Trueとなる)」ことを示しており、Aが成り立たたないケースのことは何も規定していないことが重要。

なので、前提が満たされない(つまりAがFalseの場合)は、A→BはBが何であろうが成立する。という考え方。

なお、A→B は !A || Bと等価であることがよく使われる。

※なぜ等価なのかは、!A || B の真理値表を自分で書いて確かめてみよう。

2023年3月26日日曜日

PythonでMecabを使う (Unidic辞書編)

日本語の自然言語処理には形態素解析が欠かせない。そこでよく使われるのがMecab。辞書として標準のipadicではなくUnidicを使おうとするといくつか落とし穴がある。
今回はそんな落とし穴に落ちずにインストールからmecabで品詞解析をするまでの手順を書いておく。
  • 落とし穴①:Unidicを指定してmecabを動かそうとすると、`no such file or directory: /usr/local/lib/python3.9/site-packages/unidic/dicdir/mecabrc`のエラーが発生。
  • 落とし穴②:`Mecab.Tagger("-Ochasen")`とするとエラーが発生。
まずpython3-mecabのインストールする。
# pip install mecab-python3
# pip install unidic
ただしUnidicはpipだけでは辞書本体がダウンロードされないため下記コマンドで辞書本体をダウンロードする。
# python -m unidic download

Mecab本家とは違いpython3-mecabはchasen出力のフォーマットがデフォルトでは用意されていないため、そのまま`Mecab.Tagger("-Ochasen")` を実行すると「chasenというようなフォーマットは無い」という趣旨のエラーが発生する。そこで、`/usr/local/lib/python3.9/site-packages/unidic/dicdir/dicrc`のファイル末尾にviなどで以下の`; ChaSen`以下の内容を追記する(参考)。

以上。

参考文献:https://www.teamxeppet.com/python-mecab-unidic-lite_mac/

2021年9月23日木曜日

仮説検定に関するメモ

統計学入門で、仮説検定について再学習したのでメモ。改めて勉強すると曖昧な部分が整理されて良い。

仮説検定とは母集団について仮定された命題を標本で検証すること。帰無仮説を立ててその仮説が正しいとした場合に得られた標本が実現する確率の大きさで帰無仮説を採択するか棄却するかを決める

例えばコイン投げを考える。20回コインを投げて14回表が出た時このコインに偏りがあるかを検討したい。
この時、帰無仮説として「コインに偏りは無い」という仮説を立てる。もし偏りがない場合、コイン投げの確率分布は二項分布Binary(20, p=0.5)に従うはずである。このとき表が14回以上出る確率を計算すると0.0577程度となる。これは有意水準10%で仮説が棄却される。つまり「コインに偏りは無いとは言えない」という結果となる。

ちなみに帰無仮説の「帰無」は特に意味がなく単なる仮説と言っても差し障りないとのこと。



2021年2月20日土曜日

ベイジアンネットワーク①

 ■ はじめに

確率的に起きる事象に関して、限られた情報から正しく意思決定するためにはベイジアンネットワークは非常に強力なツールになる。ここでは、ベイジアンネットワークとは何か?pythonで実装するにはどうすれば良いか?を解説したい。また実際のデータを用いてベイジアンネットワークの計算結果から意思決定を行う例も示す。

■ ベイジアンネットワークとは?

ベイジアンネットワークは確率モデルの一種で、複数の事象の関連性を有向非巡回グラフ(Diredted Acyclic Graph: DAG)を用いて表現しようとするモデルだ。ここでDAGとは、ノードとそれらを繋ぐ有向エッジから構成され、ループ構造が存在しないグラフ構造のことをいう。

下の図のようにベイジアンネットワークでは、DAGの各ノードを確率変数とし、ノード間が有向エッジで繋がれている場合は子の確率変数を親の確率変数の「条件付き確率」で表せると考える。


■ 同時確率と条件付き確率

ここで同時確率と条件付き確率について復習しておきたい。

複数の事象を考えるときに、それらが同時に起きる確率を「同時確率」という。2つの確率的に起きる事象を確率変数AとBとすると、AとBがそれぞれaとbの値となる場合の確率を\(P(A=a, B=b)\)というように表す。

一方で「条件付き確率」とは、「既にある事象が起きたと確定した条件下で」他の事象が起きる確率を示す。確率変数Aがaの値をとった「条件下」でBがbの値をとる確率を示し\(P(B=b|A=a)\)と表す。

また、確率の連鎖律(Chain Rule)より下式が成り立つ。
\[P(A=a, B=b)=P(B=b|A=a)P(A=a)\]

※以降、簡略化のため\(P(A=a)\)などは\(P(A)\)のように確率変数の実現値は省略して表記する。

■ベイジアンネットワークでの同時確率

上記の連鎖律を用いると上図のネットワークで確率変数\(X_1\)〜\(X_5\)の同時確率は
\[P(X_1, X_2, X_3, X_4, X_5)=P(X_5| X_3)P(X_4| X_3)P(X_3|X_1, X_2)P(X_1)P(X_2)\]
となる。
ここで、
  • \(P(X_3 | X_1, X_2)\)は、親である\(X_1\)と\(X_2\)がそれぞれ \(X_1=x_1\)、\(X_2=x_2\)と確定した時の\(X_3\)の条件付き確率。
  • \(P(X_1)\)、\(P(X_2)\)はそれぞれ、\(X_1=x_1\)、\(X_2=x_2\)の実現値をとる確率。
  • \(P(X_5 | X_3)\)や\(P(X_4 | X_3)\)は、親である\(X_3\)が(\(X_3=x_3\)と)確定した時の\(X_4\)、\(X_5\)の条件付き確率。
を示している。この式を注意深く見るとベイジアンネットワークの同時確率は一般的に各ノードの親ノードに関する条件付き確率の積、つまり
\[P(X_1, ..., X_n)=\prod_{i=1}^n P(X_i| Parents(X_i)) \tag{1}\]
の形に書けることが容易に想像がつく。ここで\(Parents(X_i)\)は確率変数\(X_i\)の親ノードを表している。

■ 具体例

簡単なベイジアンネットワークの具体例で同時確率を求めることをしていこう。
ここでは下図のような仮想的なシチュエーションの因果関係の例として考えていく。
ある家に警報システムが導入されており、家に異常(強盗 or 火事)が発生すると警報サイレンが鳴り、それを聞いた近所の人が警察もしくは消防に連絡することになるという因果関係を示している。

それぞれの事象の確率変数は事象が発生(1)するか否(0)かの2値をとる。幸い強盗や火事が発生する可能性は極めて低いが、若干火事の発生確率の方が大きい。また強盗や火事が発生すると高確率でサイレンが鳴るようになっているが、強盗や火事以外の異常でなる可能性もある。またサイレンが鳴るとそれを聞いた近所の人が警察もしくは消防に連絡をする確率が高まる。

この時、何も起きない、すなわち\(B=F=S=P=D=0\)となる確率はいくらだろうか?先ほどのベイジアンネットワークの同時確率である(1)式に当てはめ表から実際の数値をとると、
\[P(B=0, F=0, S=0, P=0,D=0)\\\\=P(P=0|S=0)(D=0|S=0)P(S=0|B=0, F=0)P(B=0)P(F=0) \\\\=0.99*0.96*0.9*0.99*0.98=0.83\]
と計算ができる。

ここまででベイジアンネットワークでの同時確率を求めることまでできた。ベイジアンネットワークの強力なところは、このモデルを用いると、ある事象が発生した場合に、その要因の分析が可能であることである。例えば上の例では警察に通報が行き(P=1)消防に通知が行かない(D=0)という事象が発生したときにその要因が火事である確率、もしくは強盗である確率を求めることができる(要因推定)。
次回は、要因推定について詳しく見ていきたい。