高校数学の窓過去問検索

質問<3670>2008年1月14日from=小豆「コンピュータープログラム(十進BASIC)」

4次正方行列A,Bの積をと表すが
この定義をと変更したときの行列の積
を計算するプログラムを作成せよ。
行列の積を求めるMATは使えるようになりましたが、
積の定義を変更するには,どうすれば良いのですか?
教えて下さい。宜しくお願いします。

★希望★完全解答★




初めて見ると「ギョ」っとする問題ですね(笑)。




←初めてこの問題を見た時の亀田の心境(笑)


全く何のこっちゃ分からない(苦笑)。
しかも整合性が取れるようにも思えんし(笑)。
しかし、よくよく読んでみると、僕が言うのも何なんですが、「非常に良く出来た数学の問題」だと思います。はい。

ちょっと次の問題を考えてみましょう。

自動車は道路の左側を走ります。

これは確かに正しいですよね。逆を走れば警察に捕まります(笑)。何故なら、法律でそうしろ、と定義されているから、ですよね。
では何で車は左側を走らなきゃなんないのよ?と訊かれるとこれに答えるのは難しい。まあ、歴史的経緯とか色々あるんでしょうが、結局のトコ便宜上そう定義されているだけで、例えばこれは「神が決めた」と言ったような真実である、とか無い、とか言うのとは全然関係ない話なんです。
事実、

自動車は道路の右側を走ります。

と決めてる国もありますよね。例えばアメリカとか。ところ変われば品変わる、とは良く言ったモンです。

さて、数学に目を移すと、実は同じような構造を含んでいます。つまり、

計算が出来るのは計算方法が定義されているからだ

って事なんです。
んじゃあ、一体誰が定義したのか?と言うと「人間が」です。上の例と同じように実は数学ではその殆どが「自然発生的に」計算方法が確立したワケでは無くって、「人間が整合性があるように計算方法を定義した」ってのがホントのトコなんです。「人間が決めた約束事に従って」計算する。ここがポイントなんですね。
この問題の面白いトコは「では勝手に決めた規則だったらどうなるか?」って辺りなんですよ(笑)。
行列の計算なんてのはこの「恣意性」の最たるモノだと思います。確かに連立一次方程式の解法をどうする?と言う歴史的な課題があって成立した分野なのは事実なんですが、反面、単なる括弧に括られた要素の並び、と考えてみた時、あまりにも不自然な計算法を確立してますよね(笑)。僕も高校生くらいの時、行列は苦手で嫌いだったんで

「何じゃこりゃ?何でこんな計算せなアカンの?」

とぶーたれてました(笑)。
そう言う恨みがこの問題を作ったんでしょうか(笑)。発想が面白いです(笑)。

「勝手に定義するから勝手な方法で計算させてくれ!!!」

と言うのは、受験数学では許されませんが、実はかなりの部分で数学の本質的な部分じゃないかな、と思います。そして、そう言う「発想の切り替え」と言うのがこの問題のポイントなんです。
つまり、「勝手に作った規則に則って動くプログラムを書け」と言うのが、この問題の大意です。
なお、残念ながら亀田は全然BASICは書けないんで、要点だけ挙げておきます。親切な人がいたら「BASIC化」してくれるかもしれません(笑)。

注:もっと言っちゃうとBASICは難しくてメンド臭くてヤです(笑)。ハッキリ言うと「Fortranをそのうち学びたい」とでも思わない限り、BASICを習う必然性ってのはあんま無いと思っています。


  1. 4次正方行列A,Bの積をと表す

    今までの流れで見てきてもうお分かりでしょうが、実はこの一文は基本的には全く問題としては関係ありません。ただの前フリです(笑)。
    が、行列Aのどの要素と行列Bのどの要素が計算対象になるのか示唆してはいるんで、一応基本をおさえておきましょう。
    例えば次の行列A、行列B、行列Cがあるとします。







    そうすると、普通の数学上の数列の積の定義では、C=A×Bだとすれば、例えば行列Cの要素の一つ、は次のように書き表せます。





    同様に、は次のように書き表せます。





    この様に、aの添字の2つ目とbの添字の1つ目は必ず数値が一致します。
    従って、行列Cの要素を一般化して記述すると、





    となりますね。
    ここで重要なのは、上の「数学上の数列の積の定義」が大事なんじゃなくって、以降の「勝手に決めた数列の積の定義に於いて」数列Aのどの要素と数列Bのどの要素を計算に用いるのか。その示唆だけが重要なんです。


  2. この定義をと変更したときの行列の積

    ここから「勝手に決めた数列の積の定義」が登場します。
    ところで、argminと言うのは、ある複数の要素(計算結果)が出た場合、「その中から最小の値を選べ」と言う意味です。あまりポピュラーではない書き方なんですが、たまに見かけますね(笑)。
    ここでちょっと具体的に見てみましょう。
    例えば次のような行列Aと行列Bがあったとします。






    さて、ここで「勝手に作った行列の積」を利用して行列Cを計算してみます。
    定義





    に従うと、例えば行列Cの要素は次のように記述されます。





    4つの要素の中で一番小さい数は4です。従って、





    が答えとなります。
    つまり、配列を利用して最小値を探す関数(min)を用いて成分を返せ、と言ってるワケです。


  3. 行列の積を求めるMATは使えるようになりました

    と言うワケで、十進BASICで定義されている行列の積を求めるMATを使う必要はありません(と言うか使えないでしょう)。
    DEF文等を使って新しく関数を作る必要性があります。


  4. 積の定義を変更するには,どうすれば良いのですか?

    もう一度言いますが、元々十進BASICで定義されている積の定義を変更する必要性はありません。単に新しい関数なりサブ・ルーティンを設計すれば題意を満たします。
    調べてみた限り、十進BASICはGPL(General Public License)で配布されているようなんで、ソースコード自体を変更する事は可能です。
    そして、十進BASIC自体はPascalで記述されているそうで、別にPascalの知識があれば、ソースコードを改変してコンパイルしなおす事は出来るでしょう。
    ただし、それをこの問題でやれ、って言ってるワケじゃないんです(かつ、それをやっちゃったら後でまた直すのが大変な作業になります・笑)。
    大事なのは、


    1. 行列を配列として読み込み、

    2. 対応する配列の要素を読み込み、

    3. それらを計算規則に則って和を取り、新たな配列に入れ、

    4. その中から最小値を探しだし、

    5. それらをまた配列として4行4列の行列として返す。



    ような手続きなり関数を定義しろ、と言ってるワケです。



以上です。




参考までにSchemeで書いた「新しく定義した行列の積」を計算するプログラム、weird-mul(ヘンな掛け算、の意)を挙げておきます。

なお、本来だったら、Schemeで定義されているデータ型であるvector(C言語やBASICで言う配列)を使うべきかもしれませんが、メンド臭いんでリストを使います(笑)。本質的にはリストであろうとvectorであろうと変わらないんですが、若干vectorの方が含まれる要素へのアクセススピードが速いんで、このテの行列計算ではvectorの方が好まれるらしいです。
ちなみに、MaximaはSchemeの親戚であるCommon Lispで記述されていますが、アチラは多分vectorを用いて計算規則を記述しているでしょう。興味のある人はMaximaのソースコードでも読んでみてください。

註:ここで特にプログラミング言語Schemeを取り上げている理由の一つは、上にも書きましたが、Maximaと言うソフトウェアは基本的にSchemeの親戚であるCommon Lispと言う言語で書かれているから、です。また、Maximaは十進BASICと同様にGPLで配布されていて、その規定に依ると、誰でもソースコードを読もうと思えば読めるから、なんです。つまり、「仕組みを知りたい」と思えば仕組みを知る事が可能です。その辺がMicorosoft等が販売しているような商業用ソフトウェアと違う辺りです(オブジェクトコード=Windowsで言うトコの.exeファイルはリバースエンジニアリング、と言う技術を使わないとソースの復元性は無い、と言われていますし、また、それはライセンスで禁止されています)。
つまり、ある程度Schemeが分かればMaximaの仕組みが(完全じゃないにせよ)ある程度分かるようになるでしょう。プログラムを真剣に勉強しよう、と言う人にとってはこのテのオープンソースのソフトウェアと言うものは「参考書/実例集」として非常に優秀なのです。
もっとも、Common LispはSchemeに比べればかなり複雑なんですが、それでも概要を知ろうと思えば知る事が出来る、と言う辺りが魅力です。
(そして亀田はMaximaのソースは読んだことありません・笑。がプロを目指してるのなら読んでみてもイイだろう、って事です)


なお、最初に約束事を定義しておきます。
実際問題、行列をリスト、ないしは配列を用いて表現するのは(見た目)難しいのですが、原理的には次のようにして大体のトコ表現します。
例えば、本文中に現れるような行列A、





は大体のトコロ「入れ子」で表現します。つまり、Schemeだったら、



'((1 0 2 0) (0 1 0 2) (2 0 1 0) (0 2 0 1))



のように書きますね。つまり、「リストのリスト」にしちゃうんです。BASICだったら「配列の配列」ですか。出来るかどうかは知りませんが(そして、これが出来ないとなると「難しい」でしょうねえ・笑)。
同様に、行列B









'((16 3 2 3) (5 10 11 8) (9 6 7 12) (4 15 14 1))



のように表現します。
では、取りあえずチャッチャとSchemeで書いたソースコードを紹介します。
なお、恐らく「プログラミング」として考えた場合、当初の「数学の」発想はさておき、かなり難しい問題ではあるんですよね。
Schemeでも少々てこずったんで、BASICではなおさらなんじゃないか、とは思います。
(恐らくBASICではループ文を入れ子にしないと書けないでしょう。Schemeの再帰定義の簡潔さとBASICのループ文の複雑さとの差に付いては<質問3628>参照。)
また、Scheme等のLisp系言語族で書く時の心構えなんですが、「なるべく短くソースを」書くのを目標とする為に、少々複雑なテクニックを投入しています。ただし、形式的には「普通の再帰的定義」の範疇に納めるようにトライしてみました(と言うことは、同じ内容の事柄をBASICで再現するとなるとコード量はかなり増えるでしょう)。



(define (weird-mul matA matB) ;関数weird-mulを引数matA、matBとして定義する。
(let loop ((ls0 matA) ;ls0の初期値はmatA
(ls1 matB) ;ls1の初期値はmatB
(ls2 ()) ;ls2の初期値は空リスト
(ls3 ())) ;ls3の初期値も空リスト
(cond ((null? ls0) ;ls0が空になったら?
(reverse ls3)) ;ls3を反転させて返す
((null? (car ls1)) ;ls1の先頭が空だったら?
(loop (cdr ls0) ;先頭を除外したls0
matB ;matBを呼び出す
() ;空リスト
(cons (map (lambda (ls) (apply min ls)) (reverse ls2)) ls3)))
(else ;それ以外の場合は
(loop ls0 ;ls0のまま
(map cdr ls1) ;ls1にcdrを写像
(cons (map + (car ls0) (map car ls1)) ls2)
ls3))))) ;ls3のまま



基本的な構文は<質問3643>で扱ったような「名前付きlet」構文を用いた組み立てです。要するに、局所関数loopを定義して、それを「再帰的に呼び出す」枠組みで書いています(BASICで言うと、<質問3628>で扱われていたような、DO〜LOOP構文ですね。)
今回は配列(リスト)の計算過程が少々複雑で、分岐して行くので、通常は


(let <局所関数名> (<引数定義>
   (if <条件> <結果> <局所関数の再帰呼び出し>)))


と単純なリストでif〜then構文を使って表現するトコロなんですが、ifの代わりに<質問3590>で扱ったcond文を用いて



(let <局所関数名> (<引数定義>
   (cond (<条件1> <結果>)
(<条件2> <局所関数の再帰呼び出し1>)
(else <局所関数の再帰呼び出し2>))))



と処理を三股に分けています。再帰呼び出しが2つ並列に行われている、って事ですね。
まあ、大まかに言うとそこが注意点なんですが、細かいポイントは後回しにしておいて、まずは擬似コードを書いてみます。
一応ソースにはコメントは付けていますが、意味がまだハッキリしないでしょうし、対応関係を掴みながら読んでみてください。

註:そして「そのまま」BASICで書けるかどうかはさておき、基本的な「考え方」はBASICでも同じ、と言うより「全てのプログラミング言語で同じ」筈です。色々な細かいテクニックは別として、「考え方」をどうやってBASICに翻訳しようか、と集中して下さい。その為に「疑似コード」と言われる「手続き(プロシージャ)の概要」が存在するんです。




  1. 関数weird-mulを引数matA(行列A)、matB(行列B)として定義する。

  2. 名前付きlet構文で局所関数loopを定義する。それの引数の初期値は

    1. リスト番号0(ls0)はmatA

    2. リスト番号1(ls1)はmatB

    3. リスト番号2(ls2)は空リスト

    4. リスト番号3(ls3)は空リスト


    とする。なお、リスト番号2は計算途中で生じたリストを突っ込むスペース、最終的な計算結果はリスト番号3(ls3)とする。

  3. ls0(つまりmatA)が無くなったとき、ls3を反転させて結果を返す。

    註:と言うのもls3は逆順の計算結果を返すから。後の計算を参照。

  4. ls1(matB)の先頭要素(car)が空リストの時、局所関数loopをその引数を以下の条件で再帰呼び出しする。

    1. ls0:その時、行列A(matA)の1行目を用いた計算が終わった事を示すので、次の計算対象は行列Aの2行目以降にならなければいけない。
      そこで、ls0は(cdr ls0)に書き換えられる。

    2. ls1:その時、行列B(matB)は最終列まで計算が終わった事を示すので、行列Aがまだ残っていれば再び行列Bの1列目が計算対象とならなければならない。その為、ls1ではmatBを呼び戻す。

    3. ls2:行列A(matA)の1行目を用いた計算が終わった結果を突っ込むスペースがls2なので、計算が終わった以上ここは空リストへと戻す。それまでの計算結果はls3へと受け渡す。

    4. ls3:途中経過の計算結果、ls2の中から最小要素を抜きだし(map (lambda (ls) (apply min ls)) (reverse ls2))、それをls3の先頭に突っ込む(cons 計算結果 ls3)。


  5. それ以外の場合は局所関数loopをその引数を以下の条件として再帰呼び出しする。

    1. ls0:行列Aの1行目に関する計算結果が終わっていないので、ここはそのままls0とする。

    2. ls1:行列Bの1列目の処理は終わっているので、残りの列が計算対象とならなければならない。その為、写像関数(map)を用い、ls1に含まれる全ての要素であるリストの最初を削除して残りを返す(map cdr ls1)。

    3. ls2:計算途中をls2の先頭に突っ込む(cons 計算途中 ls2)。それは行列A(ls0)の一行目(car ls0)を行列Bの1列目に適用したモノである。そのロジックは基本的には(map + (行列Aの一行目) (行列Bの一列目))として可算(+)をそれぞれのリストの要素順に適用する。なお、ここでも行列Bを処理して全ての要素の1つ目を取り出す為に写像関数(map)を用いて(map car ls1)と書く。

    4. ls3:行列Aの1行目に関する計算は終わってないので、ここは弄らずにそのままls3となる。




ちょっと文章で説明するとややこしいんですが、お分かりでしょうか?上記の「擬似コード」を良く読んで、数学的な説明と対比し、そして繰り返し計算を吟味すると、キチンと問題が「解ける」事が分かると思います。まあ、ここを理解するのが踏ん張りどころでしょうね。
なお、新規に出てきた関数で、多用しているのが写像関数mapです。これは原理的には<質問3643>で出てきた高階関数の一種です。これは別の関数を引数に取り、それを別の引数であるリストの要素に適用する(まさしく写像)する為の関数です。
ちょっと例を挙げてみましょう。
例えば、関数carはリストを引数に取り、次のような計算結果を返します。


(car '(4 4 3 1))
=>4


何故ならcarはリストの先頭要素を返す関数だからですよね。
ところが、今回は、相手が行列、つまりリストのリストです。
例えば次のようなリスト、



'((16 3 2 3) (5 10 11 8) (9 6 7 12) (4 15 14 1))



があった場合、リストの要素がリストであって、その内側にあるそれぞれのリストの先頭要素を返したい場合どうするのか?こう言う時に使うのがmapと言う関数なのです。
例えば



(map car '((16 3 2 3) (5 10 11 8) (9 6 7 12) (4 15 14 1)))
=>(16 5 9 4)



と返してくれます。各要素のリストの先頭要素がキチンと返っているのがお分かりでしょうか?
これをヒントに「map絡み」は読みといてください。→mapに付いてはコチラ!!!
また、applyってのも似たような作用があります。今回はminと言う最小値を返す関数を用いて記述していますが、これも要素である各リストの最小値を探す為の書き方ですね。まあ、この辺は端折ります。この辺でも参考にして下さい。

なお、上のプログラムを本文の行列A、行列Bを対象にして実行すると、


(weird-mul '((1 0 2 0) (0 1 0 2) (2 0 1 0) (0 2 0 1))
'((16 3 2 3) (5 10 11 8) (9 6 7 12) (4 15 14 1)))
=>((4 4 3 1) (6 3 2 3) (4 5 4 1) (5 3 2 2))


と言う答えが返ってきます。
すなわち、



となるようです。
確かめてみてください。




追加です。
某所で全く同じ問題があって、BASICによる回答が提示されていました。


INPUT N
DIM X(n,n)
DIM Y(n,n)
DIM Z(n,n)
MAT INPUT X
MAT INPUT Y
FOR i = 1 TO n
FOR j = 1 TO n
LET Z(i,j) = X(i,1) + Y(1,j)
FOR k = 2 TO n
IF Z(i,j) > X(i,k) + Y(k,j) THEN LET Z(i,j) = X(i,k) + Y(k,j)
NEXT k
NEXT j
NEXT i
MAT PRINT Z
END


Schemeだと再帰で済む辺りがFOR文の入れ子で書かれています。
参考にして下さい。

質問<3671>2008年1月16日from=RS「BASICのプログラム」

nには必ず自然数が入ります。そのとき、つぎのプログラムはなにをするものでしょうか?



100 LET a=0
110 LET b=1
120 INPUT n
130 FOR k=0 TO n
140 PRINT k,a
150 LET c=a+b
160 LET a=b
170 LET b=c
180 NEXT k
190 END


私は、まったくのコンピュータの素人です。テキストを見ながら各行で何を指示しているのかはわかるのですが、出力されるnとaの関係がまったく分かりません。
アドバイスをお願いします。

★希望★完全解答★





私は、まったくのコンピュータの素人です。

極端な話、全然構いませんがね(笑)。
まあ、ハッキリ言っておきますが、これはRSさんのせいじゃなくって、「プログラムの問題」として考えた場合、あんまり「良くない」問題だとは思います。どっちかと言うと純粋な「数学の」問題なんです(数学的にはそんなにレベルは高くないんですが)。
つまり「テキストを見ながら各行で何を指示しているのかはわかる」んならそれで結構です。しかし、「それが何の計算か?」と問われたら、それに答えるのには数学の知識が必要でしょう。ナゾナゾじゃないんだから(笑)、一体何のつもりなんだか(笑)?

普通は逆なんですよ。数学とプログラミングの親和性を説明したいんだったら、

数学では××とは△△と言う定義である。これをプログラミングしなさい。

ってのなら分かるんですが、逆に

あるプログラムがある。これを数学では何と言うか?

なんて言われても「知るか!!!」って事です(笑)。ふざけるのもいい加減にしろ、とか思いますね(笑)。
何か投稿見てるとBASICとかPASCALってこう言う「悪問」多いですよね。どう言う質問の仕方なんだか、とか思っちゃう。

ええと、一応断っておくと、この「プログラム」は確かに、再帰的定義を説明するには良く使われる例なんです。従って、ある程度プログラムの勉強してきた人にとっては初見じゃないんで、

「ああ、こんなの過去組んだ事があるなあ。」

ってんで分かるだけ、です。
逆に言うと、初見で数学の知識が無い場合、

「このプログラムは何をやってんでしょう?」

とか言われても分かるワケありません(笑)。足して変数交換して繰り返し計算してるんじゃないの?…としか言いようがありません(笑)。当たり前です。
だから出題者が悪いんですよ。優しくない。悪問の典型ですね。
と言うワケでRSさんが申し訳なく思う必要性はありません。

ええと、結論から言うと、これはフィボナッチ数列と言われる数列を出力するプログラムです。
一般に、フィボナッチ数列とは次の数式で表されます。



例えば、なんで



ですね。同様に、なんで、



となりますね。
下に、フィボナッチ数をaとして、数列の添字k(0≦k≦50)の範囲の一覧表を挙げておきます。




実際、BASICのプログラムを手元で走らせてみて、数値が上の表と一致しているかどうか確かめてみてください。
プログラム内では取りあえず





と置かれていて、kの値が一つづつ増えるに従ってそれぞれの変数が




と書き換えられるだけ(ズレて行ってる)、です。そう言うロジックで動いています。
(この辺は、「テキストを見ながら各行で何を指示しているのかはわかる」のでしたら、既に自明でしょう)

以上です。




ちなみに、Schemeと言う言語で書くと、次のようになるでしょう。


(define (fib) ;関数fibを定義
(let ((n (read))) ;入力を促す
(let loop ((a 0) ;aの初期値は0
(b 1) ;bの初期値は1
(k 0) ;kの初期値は0
(ls '("k" " " "a" "\n"))) ;リストの初期値をラベルとする
(if (> k n) ;kがnを越えた時
(for-each display ls) ;リスト(結果)を表示する
(loop b ;aがbとなる
(+ a b) ;bがa+bになる
(+ k 1) ;kが1増える
(append ls (list k " " a "\n"))))))) ;リストを合成する



なお、\nと言うのは改行記号です。

質問<3664>2008/1/8 from=みのる 「内接する円を持つ四角形」

内接する円を持つ四角形ABCDがある。
AB=5,BC=9、CD=10の時DAの
長さを求めよ。
過去問かもしれませんが見つからないので
ご指導願います。

★希望★完全解答★




まあ、見つからないでしょうねえ。
なんせこれは中学校の数学ですから。

亀田自身はあんま幾何学って好きじゃないんですが、基本、中学校で習う図形の証明では

直角三角形の合同条件

ってのがあります。

斜辺と他の一辺が同じ長さの2つの直角三角形は合同である

とか言うアレですね。この問題もそれ一本槍でしょう。

もう図も描くのがメンド臭いので、文章で説明しますが、

  • 内接してる円の中心をOとする。

  • 辺ABと円が接している点をXとする。

  • 辺BCと円が接している点をYとする。

  • 辺CDと円が接している点をZとする。

  • 辺DAと円が接している点をWとする。


とします。適当に描いた図に上の条件を書き込んで下さい。
そしておさえておかなければならない点は、「円の接線と径の成す角度は直角である」と言う事。
そうすると、例えば、隣り合った三角形AOXと三角形AOWの二つを考えると、

  • 二つの三角形は斜辺AOは共通である。

  • 辺OXも辺OWも円の半径なので同じ長さである。


なので、この二つの三角形は合同です。
同様の論理で、三角形BOXと三角形BOY、三角形COYと三角形COZ、三角形DOZと三角形DOWはそれぞれ合同です。
さて、ここで適当に、とでも置いてみれば、





と芋づる式にそれぞれの辺の長さを定義出来ます。
ここでを考慮すると、



って事です。

ちょっと苦言を言いますが、みのるさんの問題の投稿みる限り「レベルがバラバラで」全く基礎が出来てないんじゃないか、と思います。しかも殆ど教科書読んでませんよね?
逆に言うと「背伸びした問題」ばっかやってるような・・・・・(だからこう言う「中学校の問題」を送ってくるようなハメになるのです)。
もうちょっとご自分の程度に見合った「地に足が付いた」レベルの問題やった方がイイですよ。中学校の数学の問題解けないのに他の高度な数学の問題に手を出す、ってのは常識的に考えると全くの「論外」です。従って、教科書に書かれてある筈の積分の基礎問題が全く解けない、とか言うのも当たり前、と言えば当たり前、です(ましてや、ここで解説されても分からないでしょう)。
勉強の仕方を間違えてませんか?

質問<3663>2008/1/7 from=かもめ 「背理法について」

背理法の定義について教えてください。
証明じゃないんですけど
 例えば、ある母集団が正規分布に従っているかどうかを調べるため
に、その母集団が正規分布に従っていないというような帰無仮説を立てて、
その帰無仮説が起こりそうな確率をだし、そんな帰無仮説は起こるはずが
ないことを調べることによって、母集団が正規分布に従っていることを
調べる方法がありますが

それって背理法ですか?




背理法の定義に付いてはコチラを参照して下さい。

以下の質問に関してはYesともNoとも言いかねます。
何故なら、質問そのものが間違っているから、です。
正確には、

ある母集団が正規分布に従っていない事を調べるために、その母集団が正規分布に従っているというような帰無仮説を立てて、その帰無仮説の下で入手したデータが起こる確率を調べ、そんな帰無仮説下では起こりづらい確率であることを調べることによって、母集団がある確率で正規分布に従っていないことを調べる方法

ならありますし、それならYesなんですが、逆に

正規分布に従ってることを調べる方法

なんてのは存在しません。だからYesともNoとも言いようが無いです。

もう一度教科書を良く読んだ方がいいですね。



お便り2008/1/9
from=かもめ

回答ありがとうございます。
いゃ〜、恥ずかしいです。
自分、いちおう統計学の単位は取ったんですけど、先輩の過去問の問題と解き方を覚えて試験に臨んだ、数学が苦手な生物屋なんで。

確かに教科書を見ると、
「母集団は正規分布に従うこと」を帰無仮説にしてありました。

どんなに母集団を集めても正確に正規分布になることはありえないため、
帰無仮説が棄却されないことにより
「母集団が正規分布と異なるとはいえない」
という結論しか出せないということなのでしょうか?




数学が苦手な生物屋なんで。


全然構わないと思いますよ(大体、僕自身が数学大っ嫌いです・笑)。
少なくとも、いつも言ってますが統計学は数学ではないのです。
多分、純粋数学屋から言わせると結局ハッキリしたモノは何も分からない凄く気持ち悪い分野だと思われている筈です。高校範囲や大学の初年度辺りでは「確率・統計」とごっちゃにされてますが、確率論は数学ですが、統計学は得体の知れないモノです。恐らく、あらゆる応用数学(これも数学ではないんですが)の範疇では「計算だけはややこしい癖に、結局何も分からない」サイテーのジャンルですね(笑)。私見ですが(笑)。
もうちょっと個人的な意見を言わせてもらうと、「21世紀は統計学の時代だ」とか言ってますが、単にアメリカの大学の学部予算を勝ち取る為のスローガンをそのまま日本に持ってきてる辺り、どうかと思っています(笑)。

どんなに母集団を集めても正確に正規分布になることはありえないため、
帰無仮説が棄却されないことにより
「母集団が正規分布と異なるとはいえない」
という結論しか出せないということなのでしょうか?


いや、そんなに難しく考える必要はありません。
生物専門だ、って事で分かりやすい例を挙げましょう。

一般に、背理法のポイントは次の二つです。

  1. 問題の範疇とされる分野(集合)を確定する。

  2. ブール代数的な範疇に問題を落とし込む。


この二つです。
ブール代数、ってのは概念的には真、と偽しか存在しない二元論を扱う数学の一分野ですね。もちろん亀田も良く分かってません(笑)。まあ、たまたまコンピュータ・プログラム勉強してる間に浅く知っただけ、です。
まあ、ブール代数、なんて言い方せんでも、単純に言うと背反する二つの命題をデッチ上げて「アチラを立てればコチラが立たず」と言うような状況に持ち込む事です。あるいは「両雄並び立たず」みたいな。

それはさておき、上の手順に従って次の事柄を考えてみます。

亀田は人類に所属している。

これが作業1番です。亀田が「どの集合に属してるのか?」まずはここで確定させます。多分人類の一員の筈です(笑)。
次に命題を考えてみます。

亀田は女性である。

さて、亀田が男性である事を証明するには「女性じゃない」事を証明すれば良い。これが綺麗な背理法で、数学の(少なくとも試験範囲では)良く出るパターンですね。
ここで上のような試験で良く出る典型的なケースを考えてみると、そもそも選択肢が2つしかない。ある集合(この場合は人類で)「女性でなければ」男性しかあり得ないワケです。
最近の生物学では雌雄の決定、と言うか定義は専門的にはかなり難しいらしいんですが、まあ、単純、かつ古典的な文脈で見てみます。以下のような疑問を持つ人もいるでしょうしね。


いや、待てよ?じゃあ、こう言う例↓



はどうなるんだ?


しかしながらそもそもIKKOは人類じゃない(謎)。最初に決めた「人類と言う集合」に属してないワケです。それどころか生物なのかも疑わしい。多分(謎)。

さて、もう一つ視点を大きくしてみます。今の対立構造、




命題A



命題B

IKKOは人類の一員である。

←→

IKKOは人類以外の何物かである。

を考えてみます(この場合、対象とする集合は「あらゆる生物」とします)。
命題A「IKKOは人類の一員である」が否定されたとして、命題Bは確かに正しい。が、一方、「だからと言って何かの種族である」と特定できるのか?と言うと出来ませんよね。言える事は「人類以外の何かだろう」って事です。IKKOが人類じゃなかったから、即結論として

IKKOは猛禽類である


↓猛禽類の例:





とか

IKKOは爬虫類である


↓爬虫類の例:





とかましてや

実はIKKOは地球外生命体でした



↓地球外生命体の例:






とは言えません。「人類以外の何か」と言うのはそれ以上の評価もそれ以下の評価も導き出すワケではないのです。
まあ、確かに上に挙げた写真だけを見て「IKKOは××に似ている」とか勝手な感想を漏らす事は可能ですが(笑)、いずれにせよ、「人類じゃない」=「何かとは特定出来ない」って事です。生物学的に言うと実際IKKOをひっ捕まえて解剖してみない事には何も言えません(謎)。

と、冗談でロジックを説明してみましたが(笑)、実は「統計的仮説検定」は背理法のロジックを借りていますが、本質的に同じ問題が背後に潜んでいます。
まず、元々の例を借りると、第1の作法に従って

  • 適合度検定の流儀では対象を「確率分布と言う集合」とする。


のは、オーケーです。ただし、この「確率分布と言う集合」に含まれる要素の数が多すぎる。

  • ベータ分布

  • コーシー分布

  • カイ自乗分布

  • 指数分布

  • F分布

  • ガンマ分布

  • 対数正規分布

  • ロジスティック分布

  • 正規分布

  • 多変量正規分布

  • t分布

  • 一様分布

  • ワイブル分布

  • 二項分布

  • 幾何分布

  • 超幾何分布

  • 多項分布

  • 負の二項分布

  • ポアソン分布


ザーっとそこらに転がってる統計の教科書から引っ張り出して来ましたが、鬼のような数ですね(笑)。
それどころか、最悪な事に、基本的には「確率分布の定義」と言うのは次のようなモノです。

を満たすような

この定義を見る限り、こんなモンは作る気になればいくらでも作れます。お好みでしたら、上の条件を満たす関数をでっち上げて「かもめ分布」ってのを新しく作っても誰にも文句は言われません。文句を言うヤツのアタマがおかしい(笑)。
要するに、上の条件を満たすような関数ってのはそれこそ無数に存在するのです。

注:ここが統計の初学者がピンと来ない部分なんです。お定まりの定義紹介に始まっていきなり「正規分布だけが統計学で唯一存在する」確率分布のような扱いになります。生物学でいきなり「人間だけが唯一存在する生物」的な導入になったら、生徒側は十中八九とまどう筈です。「犬とか猫はどこへ行ったんだ?」と。
しかし、この「どんな確率分布だろうと定義を満たす限り無数に存在するんだ」と認識を持つことで適合度検定に対しては多少は見通しが良くなるでしょう。

さて、背理法のロジックを使うと次の状態を設定できます。




命題A



命題B

ある分布Pは正規分布である。

←→

分布Pは



  • ベータ分布

  • コーシー分布

  • カイ自乗分布

  • 指数分布

  • F分布

  • ガンマ分布

  • 対数正規分布

  • ロジスティック分布

  • 多変量正規分布

  • t分布

  • 一様分布

  • ワイブル分布

  • 二項分布

  • 幾何分布

  • 超幾何分布

  • 多項分布

  • 負の二項分布

  • ポアソン分布

  • それ以外の確率分布


のうちのどれか

この状態では「正規分布でない」事を証明する事は(どんな形であれ)可能です。
では、命題Aを否定して、結論として反対のカテゴリー(命題B)が正しい場合はどうか?と言うと特定の分布を「正しい」と指すことは不可能です。ましてや「正規分布でない」事の証明(命題Aの否定)に失敗した場合では結局「確率分布と言う集合」が残るだけで、やっぱり何も言えない事に気づくでしょう。

注:先ほどの例から言うと、「IKKOは人類ではない」(命題Aの否定)と言う証明に失敗したとすれば、では「IKKOは人類か?」と言われるとそれも分からなくなるのです(命題Bが否定されたワケではない事に注意・笑!)。「ウソ!!!」って思うかもしれませんが、そうです(笑)。結局集合は「何らかの生物」に還元されてしまうので、背理法的ロジックの効力は無に帰します。意外に思われるかもしれませんが、背理法のロジックでは「かもめさんは人間ではない」事を証明する方が「かもめさんが人間である」事を証明するより簡単なんです。
ご自分が人間であるかどうか確証出来ますか(笑)?僕はとても不安です(笑)。しかしながら、かもめさんや僕が「人間である」のを証明するのは、実は数学の範疇ではなく「生物学上の定義」なんです。数学外の事柄なんです。
ちなみに、よくよく考えてみると「犬の定義」はある種「猫との差異(猫でない事)」によって定義されているのかもしれません。つまり、全ては「別のモノと違う事(別のモノではない事)」によって定義されてる、と考える事が出来るんです。「同種をまとめる分類」と言うのは「差異がないと」成り立たない。例えば、人間が人間である事を説明する為には「猿との差異(猿ではない事)」を考える、とか。なかなか「それ自体でそれを説明する(再帰的定義)」と言うのは実際は難しいです。
この辺の「万物の差異による説明の体系(システム)」に付いて言及した昔流行った哲学の一分野が構造主義と言われるモノです。

さて、もう大体お分かりだとは思いますが、「正規分布である事を証明するには」例えば上の順序で言うと、まずは「ベータ分布ではない」事から証明しないといけません。





命題A



命題B

ある分布Pはベータ分布である。

←→

分布Pは



  • コーシー分布

  • カイ自乗分布

  • 指数分布

  • F分布

  • ガンマ分布

  • 対数正規分布

  • ロジスティック分布

  • 正規分布

  • 多変量正規分布

  • t分布

  • 一様分布

  • ワイブル分布

  • 二項分布

  • 幾何分布

  • 超幾何分布

  • 多項分布

  • 負の二項分布

  • ポアソン分布

  • それ以外の確率分布


のうちのどれか



命題Aを否定する事に成功すると、次はこうなりますよね。




命題A'



命題B

ある分布Pはベータ分布コーシー分布である。

←→

分布Pは



  • カイ自乗分布

  • 指数分布

  • F分布

  • ガンマ分布

  • 対数正規分布

  • ロジスティック分布

  • 正規分布

  • 多変量正規分布

  • t分布

  • 一様分布

  • ワイブル分布

  • 二項分布

  • 幾何分布

  • 超幾何分布

  • 多項分布

  • 負の二項分布

  • ポアソン分布

  • それ以外の確率分布


のうちのどれか



こうやって、しらみつぶしに順次否定していけば何とかなりそうですが、しかし、命題Bに含まれる確率分布は「無数にある」ワケです。従って、どこまでやって行っても「正規分布である」確証は永久に求まらないのです。

お分かりでしょうか?何故「ある特定の確率分布だ」と統計的仮説検定では明言できないのか、が。
実は教科書等で「正規分布で無いとは言えない(けどあるとも言えない)」と言った後、別検定に進むのは、「積極的な動機付け」じゃなくって「かなり消極的な動機付け」なんです。「結局何も分からないんだからやってみればあ?」と言う「クレヨンしんちゃん」的な行動なのです。決して「正規分布である確証が得られた」ワケではありません(ここを勘違いしている人が結構多いです)。

また、統計学でもこのテの「統計的仮説検定」の枠組みの弱さ、ってのは結構長い間指摘されています(単純に言うと、現代統計学の父、フィッシャー等の理論に関する批判です)。従って、実用面では、「考えられるだけの分布を取りあえず提案してみて」「その中でどれが一番マシと言えるのか?」に変わって来ていますね。現代はその過渡期にあたっているようです。→参考

以上です。

ど・ん・だ・け〜〜〜〜!!!!

質問<3655>2007/12/23 from=ソマリ 「関数」






の最大値と最小値を求めなさい。
定義域:
 
よろしくお願いします。詳しく解説していただけると嬉しいです。

★希望★完全解答★







1より大きいaの値を半角数字で入力して[OK]ボタンを押して下さい。


a =



  • でのの最小値 :

  • でのの最大値 :


aの値を色々変えてみると、いくつか違う結果が得られる筈です。


どうして上のような計算結果になるのか、図を描いて考えてみましょう。