La mémoire de mathématiques

数学めも by Müde

Box-Muller法による正規分布列生成

大抵のプログラミング言語には、擬似乱数を生成するための関数が用意されています。そして、よくあるパターンとしては、その擬似乱数は0.0以上1.0以下の適当な値を返します。ヒストグラムを描くと分かりますが、大抵の場合はどの区間も同じ程度抽出されます(一様分布)。

さて、世の中には正規分布という分布が有ります。正規分布についての説明は端折りますが、正規分布に従う適当な値を出してくれるような便利な関数が常に用意されているとは限りません。一様分布から標準正規分布に変換する方法として、Box-Muller法というのが知られています。それを実際に実装してみましょう。

WikipediaのBox-Muller法を見れば分かりますが、方法としては(0,1)の一様分布から2つの確率変数(すなわち、乱数)を用意して、示されている式に従ってZ1もしくはZ2を求めれば良さそうです。

例えばZ1であれば、{Z_1 = \sqrt{-2 \log X} \cos 2 \pi Y}と書かれているので、これを素直にJavaのプログラムで表現して、z1 = Math.sqrt(-2.0 * Math.log(x)) * Math.cos(2.0 * Math.pi * y); とすれば良いですね。ということで、実際のJavaのコードは次の通りです。


BoxMuller.java … Box-Muller法によって正規分布列を生成するクラス

import java.util.Random;

public class BoxMuller {
 private Random random;
 private double mu;
 private double sigma;
 private boolean useCosine;
 
 /**
  * Constructor
  * @param mu
  * @param sigma
  * @param useCosine
  */
 public BoxMuller(double mu, double sigma, boolean useCosine){
  random = new Random(System.currentTimeMillis());
 
  this.mu = mu;
  this.sigma = sigma;
  this.useCosine = useCosine;
 }

 /**
  * get next value
  * @return
  */
 public double next(){
  double x = random.nextDouble();
  double y = random.nextDouble();
  double result = 0.0;
 
  if(useCosine){
   result = Math.sqrt(-2.0 * Math.log(x)) * Math.cos(2.0 * Math.PI * y);
  } else {
   result = Math.sqrt(-2.0 * Math.log(x)) * Math.sin(2.0 * Math.PI * y);
  }
  return result * sigma + mu;
 }
}

BoxMullerTest.java … Box-Mullerクラステスト用プログラム

public class BoxMullerTest {
 public static void main(String[] args) {
  BoxMuller boxMuller = new BoxMuller(0,1,true);
  for(int i=0;i<10000;++i){
   System.out.println(boxMuller.next());
  }
 }
}

10000回繰り返して値を取り出し、プロットしたグラフが次のとおりです。なんだか良さそうに見えますね。

f:id:mu-de:20140911104345p:plain

必要条件と十分条件

論理学の話で p \to q と書いてきましたが、この命題が真であるとするとき、p十分条件q を必要条件と言います。中学校で習うことなのですが、恥ずかしながら私は、どちらが十分条件でどちらが必要条件なのか、すぐにパッと出てこなかったりします…。

論理学をちゃんと理解しているのであれば、迷うことなくスッと言えるのでしょうけれど、頭の悪い私は「\to」の記号を方位磁針に見立てて、矢印の先がN(=北)だから、命題の場合は矢印の先はN、Necessary(必要)のNだ、とこじつけて覚えていました。

なお、「必要条件」は、英語では、necessary conditionやessential qualificationと表現するようです。

さて、必要条件や十分条件について詳しく知りたいときに参考になるリンクを以下に貼ることにします。私もいい加減、こじつけではなく、本質的に理解したいものなのですが…。

本質的に理解できていない一つの原因としては、普段日常で使う「必要」「十分」の意味と、命題における「必要」「十分」の意味が違っていることが考えられそうです。つまり、専門用語なのですね…。

8 妥当性

1から7までは私の考えていたことでしたが、私の考えには「妥当性」に関する視点が全くありませんでした。ここで、論理学における「妥当性」について触れたいと思います。

Wikipediaの「妥当性」をお手本にして考えたいと思います。まず、妥当性とは何か。

妥当性(英: Validity)は、演繹的論証が持つ論理的特性であるが、一般に任意の文に対して使われる(ここでいう文とは、真か偽かという真理値を持つものをいう)。ここでは、論証を文の集まりとし、そのうちの1つの文が結論で残りは前提であるとする。前提とは、結論が(おそらく)真であると示す根拠である。

妥当性を議論するにおいて、次の約束があるみたいです。

  • 「論証」とは「文の集まり」である
  • 文とは真か偽かという真理値を持つものをいう
  • 論証のうち1つの文が結論で、残りは前提である
  • 前提とは、結論が(おそらく)真であると示す根拠である

論証、つまり、文の集まりのうち、前提となる文をA1,A2,…,Anとし、結論をBとします。前提の集合をΓとすると、ΓからBが導ける時、その論証は妥当である、と言えそうですね。

数学的に書けば、Γ⊢Bとなると思います。論証の結論が真である場合、その意味は演繹的か帰納的か、別れることもありそうです。

論証の結論が「確かに」真であるとされている場合、その論証は演繹的である。結論が「おそらく」真であるとされている論証は帰納的であると言われる。ある論証が妥当であるとは、結論が正しく前提から導き出されることを意味する。すなわち、妥当な演繹的論証であれば、真の前提から偽の結論が導き出されることはあり得ない。(一方、前提に偽がある場合には、真・偽どちらの結論も導き出されうる。)

推論が「妥当であるか」どうかは、形式的に決まります。ですので、次の推論も妥当であると言えます。

ゴリラは消費税である。
消費税は富士山である。
よってゴリラは富士山である。

重要なことは、推論が妥当であるかは形式にのみによって決められる、ということです。ただし、妥当であっても、健全であるかはまた別問題です。健全性については、Wikipediaの「健全性」を確認するとよいでしょう。

ここまで書いて気づいたのですが、「推論が妥当である」ということと「命題が正しい」ということは(当たり前ですが)ぜんぜん違う概念なのですね。使っている言葉や記号は似ているのですが、大きな隔たりがそこにはあります。

命題論理においては、論理演算子「ならば(⇒)」が出てきて、ならばの前が前提、ならばの後が結論と言っています。命題論理においては、前提が偽である場合、基本的には結論が真か偽かは議論しません。その命題全体が真となるためです。これを反対から解釈すれば、命題が真であることと、結論が真であることは、関係がないことを示しています。

推論の妥当性という見方をすれば、確かに前提と結論という言葉はありますが、前提は文の集合であり、さらに偽を含んでいてもいいわけです。前提を色々組み合わせて結論を「導出できるか」が問題となります。従って、推論において、推論全体が真か偽かという話は出てこないのですね。「Γ⊢B」が真だとか偽だとかで評価するのではなく、妥当か妥当でないか、で判断します。そして、妥当の場合は結論が「導出できた」ということで、その結論は真となります。

ですので、前提と結論を結ぶ演算子も、命題においては⇒であり、推論においては⊢であり、別物なのですね。

数学文章作法 基礎編

http://www.amazon.co.jp/dp/448009525X

著者は数学ガールでもおなじみですね。

書名に「数学」と含まれていますが、文系の人でも役に立つと思います。数学は、議論の対象がクリアになっているので、良い文章を書くヒントが得られそうです。

数学は言葉

http://www.amazon.co.jp/dp/4489020538

論理式の展開が身についていればいるほど、一貫性のある文章を書けるのかもしれませんね。

この書籍について紹介しているブログも参考にしてください。

述語論理入門3

二階述語論理の例として、数学的帰納法があるみたいです。

http://bukubukubun.blog90.fc2.com/blog-entry-290.html

数学的帰納法は、述語Pがあったとき、 P(1)が成り立ち、P(n) ならば P(n+1) が成り立つとき、すべての n について P(n) が成り立つ、というものです。

数学的帰納法を使おうとするとき、述語 P はどんなものを持ってきてもいいのです。

これを踏まえて式で示すと、

\forall P(P(1) \land \forall x(P(x) \to P(x+1)) \to \forall x(P(x)))

確かに「すべての述語P」ということで、述語に対して量を表す記号がついてますね…。これが二階述語論理。

述語論理入門2

\forall x(P(x)) の否定を考えてみる。

これは、「すべての x について P(x) が成り立つ」、を否定するのだから、 「一部の x について P(x) が成り立たない」となる。「 P(x) が成り立たない x が一部存在する」とも言えます。

式にすると \lnot (\forall xP(x)) \Leftrightarrow \exists x(\lnot P(x))

なので、論理学を知っている人は論破と言わない、を否定するには、 論破という一部の論理学を知っている人を持ってこればいいんですね。

これは、真の命題を否定するときには1つ以上の成り立たない例を持ってこれば良いという事実と一致します。