AIに欠かせない数学を、プログラミング言語Pythonを使って高校生の学習範囲から学び直す連載。今回は数学、AIがデータとの最適な対応関係を見つけるのに重要となる「確率」と「確率分布」についてPythonコードと図を交えて解説します。
この記事は会員限定です。会員登録(無料)すると全てご覧いただけます。
AIに欠かせない数学を、プログラミング言語Pythonを使って高校生の学習範囲から学び直す本連載『「AI」エンジニアになるための「基礎数学」再入門』。前々回で「関数」について解説し、前回の「微分・積分」では、微分・積分が単に関数の傾きや面積を求める数学的な手法であることを説明しました。その中でAIがデータ間の対応関係を見つけ出すとき、微分を用いて対応関係を見つけ出す計算を行っていることが分かったと思います。
今回のテーマは統計学において重要となる「確率と確率分布」です。AIにおいても当然、確率は重要であり、AIの計算結果を解釈するのに確率の理解は必須なので、その辺りも含めて解説します。これまでの連載と同じように数式をあまり用いることはせずに内容を理解できるように進めていきます。
まず確率とは物事の「起こりやすさ」を定量的に表す指標です。起こりやすさを定量的に表すことで、どのような利点があるのでしょうか。翌日の降水確率で考えてみましょう。翌日に雨が降るかどうかは「雨が降る」「雨が降らない」の2つの結果しか存在しませんが、この不確定な2つの結果しか分からない状態では翌日に傘を用意すればよいのかどうかを判断する基準がありません。そこで降水確率を用いて「どちらが起こりやすいか」を定量的に表すことで将来をある程度推測することができ、翌日の行動を決めることができます。このように未来をある程度推測できることが確率を用いることの大きな利点です。
確率については「数学の中でも抽象的で理解するのが難しい」「学生がつまずくポイント」といわれていますが、実は確率は難しい問題を簡単にするための方法として編み出されました。
まず確率を導入することの目的は不確定な現象に対して起こりやすさを定量的に表すことと説明しましたが、実は初期条件やその過程を物理的に計算すれば、予測することは不可能ではありません。
コイントスを例に取って説明します。サッカーでは試合開始時にコインを投げてその表(おもて)/裏でキックオフを行うチームを決めます。コインを投げて表が出る確率は、結果が出るまでどちらとなるかを知ることができないため、不平等な決め方にはならないと思いますが、実は使用するコインの重心の位置、投げるときの強さや高さ、投げるときの風の強さなどの情報が正確に分かっていれば、投げる前からコイントスの結果を計算から導くことができ、確率よりも正確な未来を知ることができます。従って、その計算を都度行えば確実に自分のチームがキックオフの権利を得ることが可能になります。
しかし、現実において逐一その情報(当然コインを投げるたびにこの情報は異なります)を知ることは困難であり、現実的ではありません。そこで、コイントス時のさまざまな情報から未来を推測するのはやめて、コイントスの結果のみに注目し、試行回数を重ねて得られる結果から未来を推測するための手段が確率です。
確率は、複雑な情報に注目する必要はなく、結果のみに注目すればよいため、「単純化した推測の手段」といえます。
先ほど起きている現象の結果のみに注目し、単純化したものが確率と説明しました。この時に重要となるのが、確率を求めるためのサンプルデータの数です。コイントス時の条件はさまざまなものがあり、その道のプロならともかく、普通は同じ人がやっても全く同じ条件となることはほとんどありません。表(おもて)/裏どちらが出やすいかを知るためには、何度もコイントスを試してデータを集める必要があります。例えば、コイントスの試行回数が4回のときに表(おもて)が4回出たとします。このとき表(おもて)が出る確率(起こりやすさ)は以下のように計算できます。
表(おもて)の出る確率 = 表(おもて)の出た回数 ÷ 試行回数 = 4 ÷ 4 = 1
確率が1(100%)なので、このコインでは常に表(おもて)が出ることになりましたが、本当にそうでしょうか?
もちろんその可能性もありますが、試行回数が少ないことでたまたま表(おもて)が連続して出た可能性もあり、この結果を素直に信頼することは難しいでしょう。この時、結果の信頼性を高めるためには、試行回数を増やすことであるのは直感的にも理解できると思います。たまたま表(おもて)が連続した場合であったとき、試行回数が増えれば、この“たまたま”は全体の結果から見て少なくなり、もっとも起こりやすいパターン(表《おもて》の出る確率)が表れてくることが考えられます。
このように試行回数が増えたときに真の確率に近づくことを「大数の法則」と呼びます。カジノなどのギャンブルでは、大数の法則によって得られる真の勝率が必ず50%未満となるように設定(そうでないと運営側がもうかりません)されており、試行回数が増える(同じゲームをやり続ける)と必ず損をすることになります。
大数の法則をPythonコードで実験してみましょう。「コイントスで表(おもて)が出る確率が50%であるとしたときに、試行回数ごとに求めた結果が正解の50%にどう近づくか」を以下のスクリプトを実行しその結果を確認してください。
# 乱数を計算するライブラリのインポート import random as ran # 表(おもて)の出る確率を設定 head_probability = 0.5 # 進行回数の数を与えたら、その回数での表(おもて)が出る確率を計算する関数 def coin_toss(N): head_num = 0 for i in range(N): if ran.random() < head_probability: head_num += 1 # 表の出た回数をカウント return head_num/N for n in [4,10,20,50,100,1000,10000,1000000]: print('試行回数 =',n,'表の出る確率 = ',coin_toss(n))
試行回数 = 4 表の出る確率 = 0.8 試行回数 = 10 表の出る確率 = 0.6 試行回数 = 20 表の出る確率 = 0.55 試行回数 = 50 表の出る確率 = 0.46 試行回数 = 100 表の出る確率 = 0.58 試行回数 = 1000 表の出る確率 = 0.514 試行回数 = 10000 表の出る確率 = 0.4996 試行回数 = 100000 表の出る確率 = 0.500177
結果から試行回数が増えれば、得られた確率が正解の確率に近づいていることが分かります。
Copyright © ITmedia, Inc. All Rights Reserved.