Skip to content

Instantly share code, notes, and snippets.

@mohzeki222
Created May 11, 2021 05:59
Show Gist options
  • Save mohzeki222/6e7acf364f9d39b9d2e56b1a1f9cceb0 to your computer and use it in GitHub Desktop.
Save mohzeki222/6e7acf364f9d39b9d2e56b1a1f9cceb0 to your computer and use it in GitHub Desktop.
chapter0.ipynb
Display the source blob
Display the rendered blob
Raw
{
"nbformat": 4,
"nbformat_minor": 0,
"metadata": {
"colab": {
"name": "chapter0.ipynb",
"provenance": [],
"collapsed_sections": [],
"include_colab_link": true
},
"kernelspec": {
"name": "python3",
"display_name": "Python 3"
},
"language_info": {
"name": "python"
}
},
"cells": [
{
"cell_type": "markdown",
"metadata": {
"id": "view-in-github",
"colab_type": "text"
},
"source": [
"<a href=\"https://colab.research.google.com/gist/mohzeki222/6e7acf364f9d39b9d2e56b1a1f9cceb0/chapter0.ipynb\" target=\"_parent\"><img src=\"https://colab.research.google.com/assets/colab-badge.svg\" alt=\"Open In Colab\"/></a>"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "ikb6qx0CsYev"
},
"source": [
"## **プログラミング事始め**\n",
"\n",
"---\n",
"\n",
"初めての人はリラックスして始めましょう。\n",
"以下の説明はプログラミング初心者の方も想定してのものです。\n",
"プログラミングにある程度慣れている人は不要かもしれません。\n",
"まずは左上にある「ファイル」から**「ドライブにコピーを保存」**をしてください。\n",
"ご自身のgoogle driveにこちらのノートブックが保存されて以下のプログラム等を編集しながら実行できます。\n",
"\n",
"基本的にプログラムの書かれる「コード」と、ここのようにテキストが書かれる「テキスト」部分によりコードの説明がなされます。「コード」部分では、左側に[ ]マークがあります。実行されたものには番号がつき、どんな順番で実行されていったのか経過を見ることができます。実行するためには、コード部分に触れて、**Shitf+Enter**を押してください。\n",
"試しに下のコード部分を実行してみましょう。"
]
},
{
"cell_type": "code",
"metadata": {
"id": "qUXNds33vgUR",
"colab": {
"base_uri": "https://localhost:8080/"
},
"outputId": "5592a60b-e021-4f66-d4da-5acd236e1d06"
},
"source": [
"print(\"Hello!\")"
],
"execution_count": 1,
"outputs": [
{
"output_type": "stream",
"text": [
"Hello!\n"
],
"name": "stdout"
}
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "EE_0-80fvp74"
},
"source": [
"無事に実行できた場合には、Hello!と言う表示が下に出ます。\n",
"ここで試したのはprint文というもので、結果の表示に利用します。\n",
"プログラムといえば、何かしらの計算を行う際にコンピュータに代わりにやってもらうためのものですから、\n",
"次のような四則演算も可能です。"
]
},
{
"cell_type": "code",
"metadata": {
"id": "mOOHyhJz1wSK",
"colab": {
"base_uri": "https://localhost:8080/"
},
"outputId": "f5c9e4a3-efb4-4e46-b4e4-e7568e9d78ee"
},
"source": [
"3 + 5"
],
"execution_count": 2,
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/plain": [
"8"
]
},
"metadata": {
"tags": []
},
"execution_count": 2
}
]
},
{
"cell_type": "code",
"metadata": {
"id": "JgYjGT9GzzgD",
"colab": {
"base_uri": "https://localhost:8080/"
},
"outputId": "f2b6a914-6a2a-423a-c346-6b0654bd6f7f"
},
"source": [
"4 * 2"
],
"execution_count": 3,
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/plain": [
"8"
]
},
"metadata": {
"tags": []
},
"execution_count": 3
}
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "6J2WBPu6z1qn"
},
"source": [
"+はそのままで足し算です。*は掛け算をするための記号です。"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "ZwcGq5Fb18ef"
},
"source": [
"今のはただの数値同士の計算でしたが、プログラムの際には、計算結果を記録して、それを後から呼び出すこともできます。人間だと記憶し続けなければならないのですが、コンピュータはメモリという記憶を保持する場所を持ち、私たちの代わりに記録していてくれます。やり方は簡単です。好きな文字を「左」に、計算式を「右」にします。"
]
},
{
"cell_type": "code",
"metadata": {
"id": "YLU8SNm62Ur1"
},
"source": [
"h = 3 + 5"
],
"execution_count": 4,
"outputs": []
},
{
"cell_type": "markdown",
"metadata": {
"id": "9CFtvfpA3nKw"
},
"source": [
"今度は計算結果である8が表示されませんでした。それはhという文字に格納されたからです。\n",
"そういう時はprint(h)としてみましょう。"
]
},
{
"cell_type": "code",
"metadata": {
"id": "5sspOce_3zq_",
"colab": {
"base_uri": "https://localhost:8080/"
},
"outputId": "2590a55c-568c-46e2-c89b-7114163cdf8b"
},
"source": [
"print(h)"
],
"execution_count": 5,
"outputs": [
{
"output_type": "stream",
"text": [
"8\n"
],
"name": "stdout"
}
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "OCzGdEUs3y0m"
},
"source": [
"結果の数字がちゃんと表示されましたね。\n",
"次に覚えておくと便利なのがfor文です。同じ計算を繰り返す場合に利用します。\n",
"コンピュータはそうした単純作業の繰り返しが得意です。先程の計算結果を格納しておくということを利用すると、次のようなプログラムが面白い結果を生み出します。"
]
},
{
"cell_type": "code",
"metadata": {
"id": "_zeYyH9_5SpH"
},
"source": [
"h = 0\n",
"for k in range(0,10):\n",
" h = h + 1"
],
"execution_count": 6,
"outputs": []
},
{
"cell_type": "markdown",
"metadata": {
"id": "u1I7qglQ8ty7"
},
"source": [
"最初のh=0はもうわかりますね?\n",
"hに0という数字を格納します。\n",
"これを実行すると、range(0,10)というところで指定されたように、\n",
"for文で指定された文字kが0から10の手前まで変化しながら、for文のなかに含まれる計算を続けます。\n",
"つまり、kは0,1,2,3,4,5,6,7,8,9と変化しながら\n",
"h = h + 1という計算を続けます。\n",
"hに1を足して、その結果をhに入れ直すということです。\n",
"これを合計10回繰り返しますから、その結果はh=10となるはずです。\n",
"みてみましょう。"
]
},
{
"cell_type": "code",
"metadata": {
"id": "gtXHIflg9-KG",
"colab": {
"base_uri": "https://localhost:8080/"
},
"outputId": "5a1b8643-96b6-472d-ddd7-d96a428d4ac2"
},
"source": [
"print(h)"
],
"execution_count": 7,
"outputs": [
{
"output_type": "stream",
"text": [
"10\n"
],
"name": "stdout"
}
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "EYA2u2e5BR4w"
},
"source": [
"これは高校で学ぶ数列のうち、等差数列に相当しますね。+1というのが差で、だんだんと数字が大きくなっていきます。もちろん等差数列の一般項を学んだ記憶がある人も多いかと思いますが、そうした計算も上記のようなプログラミングで一瞬にして計算してくれます。"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "dwhy8Nf4-ByA"
},
"source": [
"これがプログラミングの威力の最初ですね。range(0,10)をいじってみると結果が変わって面白いと思いますよ。\n",
"0が始まりの数値で、10の手前が終わりの数値です。\n",
"for文を書く際には**コロン : を忘れない**ようにしてください。\n",
"そしてfor文の中身は**tabキーで空白を挿入する**ことも忘れないでください。\n",
"これはここで利用しているpython言語の特徴です。"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "amEGRowX_Z9t"
},
"source": [
"さてせっかくkの値が変化しているのですから、同じものを足し算するのではなく、計算を進めるたびに違うものを足しても良いでしょう。\n",
"次のようなプログラムを考えてみましょう。"
]
},
{
"cell_type": "code",
"metadata": {
"id": "bDtZEsR9_kHn"
},
"source": [
"h = 0\n",
"for k in range(0,10):\n",
" h = h + k"
],
"execution_count": 8,
"outputs": []
},
{
"cell_type": "markdown",
"metadata": {
"id": "DGRmjass_nj5"
},
"source": [
"このプログラムではfor文の中にh+kという計算式がありますね。kは最初は0ですから、\n",
"最初は h = 0 + 0という計算になります。つまり h = 0 です。\n",
"次はkが1に変わりますので h = 0 + 1という計算で、h = 1となります。\n",
"さらにkが2に変わりますから h = 1 + 2という計算が次に行われて、h = 3となります。\n",
"これを繰り返していくと、、、いやまずは自分で手計算をして、プログラミング結果と一致するか確認すると良いですよ。とは言っても次に行きたいでしょうから、その結果は45になるはずです。"
]
},
{
"cell_type": "code",
"metadata": {
"id": "iyphBdbeCpd9",
"colab": {
"base_uri": "https://localhost:8080/"
},
"outputId": "8f8e889b-0af5-4cd7-e869-fede5adcd1f7"
},
"source": [
"print(h)"
],
"execution_count": 9,
"outputs": [
{
"output_type": "stream",
"text": [
"45\n"
],
"name": "stdout"
}
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "2bE-_xpzCrw4"
},
"source": [
"ね?なっているでしょう?こうした繰り返しごとに変わる計算もすぐに実行することができます。\n",
"そのため、ちょっと難しい計算を実際に手を動かしてやらないでコンピュータに任せることができるわけです。\n",
"それでは高校や大学で、なぜ私たちはその難しい計算を学ぶ必要があるのでしょうか。\n",
"それはコンピュータに任せた結果が正しいものかどうかを確認することができなければ、\n",
"そのプログラムが正しく動作しているかどうか全く判別がつかず、最終的に恐ろしい不具合を招く可能性があるからです。\n",
"途中の計算、些細なところからでも、一つ一つ動作を確認して、思い通りの計算が進められているか、しっかりと確認する癖をつけましょう。"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "WU8ndsY3tEuo"
},
"source": [
"## **練習問題**\n",
"\n",
"---\n",
"\n",
"同じものを足し算し続けるプログラムは上記の例の通りです。\n",
"それでは同じものを掛け算し続けるプログラムを書いてみましょう。 \n",
"\n",
"ヒント) 掛け算は「*」で表します。\n",
"\n",
"\n",
"**問:最初の数字は1として、何度も2を12回掛け算するプログラムを作成してみましょう。**\n",
"\n",
"**答: 4096**"
]
},
{
"cell_type": "code",
"metadata": {
"id": "cCOcWHM7h3IE"
},
"source": [
""
],
"execution_count": 9,
"outputs": []
},
{
"cell_type": "markdown",
"metadata": {
"id": "CfbyFEL5h4Lj"
},
"source": [
"プログラムをする「コード」部分を追加したい場合は、画面左上にある**+コードをクリックしましょう**。"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "uOOq5N_B-PKd"
},
"source": [
"## **高校生はプログラミングが得意!?**\n",
"先ほどもちょっと登場しましたが、高校数学では数列という単元があります。\n",
"数字の列が並んでいて、それを足し算したり、そのルールを解明したりする分野です。\n",
"例えば次のようなものがその例として挙げられます。\n",
"\\begin{equation}\n",
"1, 2, 3, 4, \\ldots, 100\n",
"\\end{equation}\n",
"このように$1$ずつ足し算される、同じ数字が足し算されるものを**等差数列**と呼びます。\n",
"その等差数列の和を計算する場合には次のような計算をすることになります。\n",
"\\begin{equation}\n",
"1+2+3+4+\\ldots+100\n",
"\\end{equation}\n",
"これを手で計算するのは面倒ですね。\n",
"その昔ガウスは効率の良い計算公式を見出したことは有名ですが、そういうものが思いつかない場合には愚直な計算をするほかありません。\n",
"そうしたときにコンピュータに代わりにやってもらうということになります。"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "AXO2r56vBJOo"
},
"source": [
"コンピュータにいきなりやってもらう前に、高校ではどのようなことを教わっていたのかを思い出してみましょう。\n",
"例えば1+2+3+4+...+100と続く計算は、\n",
"\\begin{equation}\n",
"1+2+3+4+\\ldots+100 = \\sum_{k=1}^{100} k\n",
"\\end{equation}\n",
"と書くということを教わります。\n",
"右側に出てきたものはシグマ記号($\\Sigma$)というものです。\n",
"シグマ記号($\\Sigma$)が登場して驚く読者もいると思います。高校生だけでなく大学生すらも怯えるのがシグマ記号です。社会人の皆さんにはあまり良い記憶はないかもしれません。\n",
"\n",
"ただシグマ記号を始め、数学の記号は読むことのできるものであり、その読み方さえ倣えば怖いものではありません。\n",
"シグマ記号は\n",
"**「下についた文字の始まりから上に書いてある終わりまで、その数値を変えながら、どんどん足していくぞ」**\n",
"という宣言をするものです。だから**たくさん足し算するぞ**と言っているだけです。\n",
"\n",
"実際にこの例では、シグマ記号の下には\n",
"最初は$k=1$から、つまりfromの情報があり、\n",
"上には$100$とありますが、toの情報があるというわけです。\n",
"こうした記号が用意される理由は、左のような数式の書き方をすると長くなるから、短く書くための工夫です。\n",
"そうであればわかりにくいな、と思ったらわざわざ長く書いても差し支えありません。\n",
"自分でわかるように書いた方が良いですよね。"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "5qagrq0W-PNH"
},
"source": [
"さてこのシグマ記号を用いた記法でもうひとつ嫌な部分があります。\n",
"\n",
"先ほどまでは具体的な数字だった$1,2,3,\\ldots,100$がなくなり、$k$という文字に替わりました。\n",
"この$k$という文字は、\n",
"\n",
"**シグマ記号の中では$1$から$100$までその数値を変えます。**\n",
"\n",
"ここでなぜ高校数学でシグマ記号を教わるのかがわかったかと思います。\n",
"\n",
"先ほど紹介したプログラミングの基礎のひとつfor文を思い出してみてください。\n",
"\n",
"for文の中では同じように指定した文字が、\n",
"\n",
"**決められた始まりの数値から終わりの手前の数値まで、その値を変えながら繰り返して同じ計算をする**\n",
"\n",
"ことができました。\n",
"\n",
"シグマ記号はfor文と同じことを言っていることに気づきます。\n",
"そうです。\n",
"\n",
"高校数学でシグマ記号を学ぶのは、単なる略記法を教えたいというわけではなく、\n",
"**コンピュータプログラムとの対話方法を伝授するため**だったのです。\n"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "--AMe0XvD0dW"
},
"source": [
"それでは再びプログラミングしてみましょう。$1$から$100$までの数字を足し算するようなfor文によるプログラムを書いてみましょう。\n"
]
},
{
"cell_type": "code",
"metadata": {
"id": "Cag4IxzFD9jK",
"colab": {
"base_uri": "https://localhost:8080/"
},
"outputId": "e140fa4c-5a2f-464b-ba3a-ac0ee4bf9c61"
},
"source": [
"h = 0\n",
"for k in range(1,101):\n",
" h = h + k\n",
"print(h)"
],
"execution_count": 10,
"outputs": [
{
"output_type": "stream",
"text": [
"5050\n"
],
"name": "stdout"
}
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "oYz65oD_EIYO"
},
"source": [
"ここでシグマ記号の中にある$k$と同じものがプログラムの中に登場していることに気づきますね。\n",
"\n",
"始まりはrange(1,101)で指定するように$k=1$から$k=100$まで(**rangeでは101と書き、その手前の$100$までを足し算します**)\n",
"その値を変えながら、hという途中結果が格納されたところに足し算されていきます。\n",
"最後の結果を取り出すためには、\n",
"\n",
"print(h)\n",
"\n",
"をすることは忘れないように(**ここでtabによる空白は使わないことに注意してください**)"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "s_olFnlaFJ5Z"
},
"source": [
"## **練習問題**\n",
"\n",
"---\n",
"\n",
"**問:次の数列の和を計算するプログラムを作って計算してみよう。**\n",
"\\begin{equation}\n",
"1,3,5,7,\\ldots,101\n",
"\\end{equation}\n",
"\n",
"ヒント) まずはシグマ記号で書いてみよう。\n",
"\n",
"**答: 2500**"
]
},
{
"cell_type": "code",
"metadata": {
"id": "z9giItsAEixW"
},
"source": [
""
],
"execution_count": 10,
"outputs": []
},
{
"cell_type": "markdown",
"metadata": {
"id": "KzOTZfgW-PP5"
},
"source": [
"こうした数列の扱いは、とりわけpython上では容易に扱うことができます。\n",
"そうした数列の扱いを得意としたプログラムを多く持つライブラリとして、numpyというものがあります。\n",
"これを早速利用しましょう。\n",
"そうした便利なライブラリがたくさんあるのがpythonの特徴です。"
]
},
{
"cell_type": "code",
"metadata": {
"id": "ZtQbnQUcGux1"
},
"source": [
"import numpy as np"
],
"execution_count": 11,
"outputs": []
},
{
"cell_type": "markdown",
"metadata": {
"id": "JbyxiwmiGyAK"
},
"source": [
"ここでimportとありますが、「輸入する」という英単語ですが、\n",
"その名の通り、私たちのプログラミング環境に輸入する、ということです。\n",
"\n",
"**numpyの機能を取り入れる**ということになります。\n",
"\n",
"そしてas npというのは、**numpyの機能を呼び出すときには、省略してnpと呼ぶ、という宣言**になります。\n",
"\n",
"このnumpyを利用して、数学の計算をうまく実行することができるようになります。\n",
"まずは簡単に数列を作る方法です。"
]
},
{
"cell_type": "code",
"metadata": {
"id": "Do9SUZ6zGCek",
"colab": {
"base_uri": "https://localhost:8080/"
},
"outputId": "fe28004e-48bd-48c8-ff82-de816965a948"
},
"source": [
"np.array(range(0,10))"
],
"execution_count": 12,
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/plain": [
"array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])"
]
},
"metadata": {
"tags": []
},
"execution_count": 12
}
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "dVEiRyq1GH1N"
},
"source": [
"range(0,10)は今までにも使ってきましたのでわかりますね。$0$から初めて$10$の手前まで数値を変えるためにfor文に使われていたものでした。\n",
"その際に出てくる数値を全て羅列させたものを数列にしましょう。\n",
"そのためにnp.array()という関数を利用します。\n",
"これを利用すると全ての数値が一気に出力されます。\n",
"うまくいったら数値が並び、array()という括弧がついているはずです。\n"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "TulBZHdTS6E-"
},
"source": [
"これはひとつの文字に格納することができます。複数の数字がひとつの文字に格納されるというのは、まるで**ベクトル**のようですね。"
]
},
{
"cell_type": "code",
"metadata": {
"id": "jiaqVX2bTKq1"
},
"source": [
"h = np.array(range(0,10))"
],
"execution_count": 13,
"outputs": []
},
{
"cell_type": "markdown",
"metadata": {
"id": "8gBh2LEmTUuO"
},
"source": [
"このhには$0,1,2,\\ldots,9$という複数の数字が含まれています。\n",
"numpyのarrayで扱われている場合は、それぞれの数字に計算が一気に実行されるという特別な機能を持ちます。\n",
"どういうことかということがピンとこないかもしれないので、試しに計算をしてみましょう。\n",
"それぞれの数字に$3$を足すということをしてみましょう。"
]
},
{
"cell_type": "code",
"metadata": {
"id": "stWPXqkYTyov",
"colab": {
"base_uri": "https://localhost:8080/"
},
"outputId": "86ebb63a-d4b4-4d69-8818-8ced452ac75a"
},
"source": [
"h+3"
],
"execution_count": 14,
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/plain": [
"array([ 3, 4, 5, 6, 7, 8, 9, 10, 11, 12])"
]
},
"metadata": {
"tags": []
},
"execution_count": 14
}
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "AfXVasGmT0xC"
},
"source": [
"一見するとhという文字に3を足すだけですからただの足し算のように見えるかもしれません。\n",
"しかし、その意味はhに含まれる数値全てに同じように$3$を足します。\n",
"これは非常に便利な機能ですよね?\n",
"なんだか色々な計算をしてみたくなりますよね。\n",
"例えば全ての要素を$2$倍をするとか"
]
},
{
"cell_type": "code",
"metadata": {
"id": "n3fb9UF9UR-u",
"colab": {
"base_uri": "https://localhost:8080/"
},
"outputId": "7f16f568-d9df-4c67-ee0a-a8a27b33fb3d"
},
"source": [
"2*h"
],
"execution_count": 15,
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/plain": [
"array([ 0, 2, 4, 6, 8, 10, 12, 14, 16, 18])"
]
},
"metadata": {
"tags": []
},
"execution_count": 15
}
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "_C10zCCzUTnb"
},
"source": [
"簡単に掛け算をすることができました。これは公差$2$の等差数列ですね。\n",
"これの和はどうなるでしょうか。またfor文を使って計算しましょうか?\n",
"実はこうした数列の合計を求めるには、次のような関数が用意されています。"
]
},
{
"cell_type": "code",
"metadata": {
"id": "We7NjIpVUeIj",
"colab": {
"base_uri": "https://localhost:8080/"
},
"outputId": "45a29417-3203-44c1-b8c7-8232298844ae"
},
"source": [
"np.sum(h)"
],
"execution_count": 16,
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/plain": [
"45"
]
},
"metadata": {
"tags": []
},
"execution_count": 16
}
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "duYBp_QJUxfX"
},
"source": [
"sum、そうsummation、和を取るという英単語から来ている関数です。\n",
"こうした数列の総和を取ることができます。"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "RM-DFmag-mEw"
},
"source": [
"## **データサイエンスとプログラミング**\n",
"\n",
"近年こうしたプログラミングへの興味関心が高まってきました。\n",
"その背景にはデータサイエンスという学術分野が研究開発の世界で重要視されるようになり、その必須スキルとしてプログラミングが挙げられているという背景もあります。\n",
"データというのは、様々な現象や事実の記録からなります。\n",
"そうしたデータをコンピュータ上に数値化して記録しておけば、様々な計算や処理をプログラミングを通して実行することができます。\n",
"要するに楽をするためにコンピュータの力を借りようというわけです。\n",
"都合が良いですね。\n"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "rVYOVjbFZhFn"
},
"source": [
"### 乱数ででたらめデータを作ろう\n",
"\n",
"何かしらのデータを引っ張ってくる前に、まずは人工データというやつです。適当に作ったデータに対して、せっかく利用し始めたnumpyのことを知っていきましょう。\n",
"「適当に作る」というのはでたらめな数字で作るという意味です。\n",
"でたらめな数字を数学では乱数と言ったりします。乱れた数字です。\n",
"numpyにはそうした乱れた数字からなる列を作り出す関数が用意されています。"
]
},
{
"cell_type": "code",
"metadata": {
"id": "3tngY62eZAc6",
"colab": {
"base_uri": "https://localhost:8080/"
},
"outputId": "db03d4bc-f0c7-4381-8cca-41738f86f7cf"
},
"source": [
"np.random.rand(10)"
],
"execution_count": 17,
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/plain": [
"array([0.76606729, 0.74460746, 0.97604607, 0.2930796 , 0.24849545,\n",
" 0.98489161, 0.29362166, 0.19793559, 0.17779202, 0.96649273])"
]
},
"metadata": {
"tags": []
},
"execution_count": 17
}
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "VLif8OkAaTmh"
},
"source": [
"np.random.randというのは、$0$から$1$の間ででたらめな数字を作るという関数です。(10)として、そういうでたらめな数字を10個作ってくださいという指示をしています。"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "hiUwgh_KakAB"
},
"source": [
"### データを可視化しよう\n",
"\n",
"こうしたたくさんの訳のわからない数字からなるデータ、から傾向をつかもうという訳です。\n",
"まずはこうしたデータはどんな傾向があるのか、わかりやすく知りたいですよね。\n",
"そうしたときに必要なことが**データの可視化**です。見える化です。\n",
"そこで見える化のためのライブラリを呼び出します。"
]
},
{
"cell_type": "code",
"metadata": {
"id": "NLXxaGnfa0tB"
},
"source": [
"import matplotlib.pyplot as plt"
],
"execution_count": 18,
"outputs": []
},
{
"cell_type": "markdown",
"metadata": {
"id": "C1kfC2Eda_rj"
},
"source": [
"matplotlibの中にあるpyplotというライブラリを呼び出しました。それをpltとして省略して呼ぶことにします。"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "Jds1vCr1bHCB"
},
"source": [
"このライブラリを用いるとデータの可視化が簡単に行えます。先ほど用意したでたらめな数値列を並べて表示してみましょう。\n",
"まずそのためには乱数を何かの文字に格納しておきましょう。"
]
},
{
"cell_type": "code",
"metadata": {
"id": "UkOvcE4NbR7Y"
},
"source": [
"y = np.random.rand(10)"
],
"execution_count": 19,
"outputs": []
},
{
"cell_type": "markdown",
"metadata": {
"id": "O6gwDCFbbfGx"
},
"source": [
"ここでは$y$という文字に格納しました。でたらめな数字は作り出すたびに結果が変わりますので、先ほどのものとは異なる数列になっています。\n",
"さてこのyを可視化してみましょう。"
]
},
{
"cell_type": "code",
"metadata": {
"id": "mgbwsT5KbPI5",
"colab": {
"base_uri": "https://localhost:8080/",
"height": 265
},
"outputId": "42fc849d-efe8-4e64-c965-e1bedb5d1e8c"
},
"source": [
"plt.plot(y)\n",
"plt.show()"
],
"execution_count": 20,
"outputs": [
{
"output_type": "display_data",
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
},
"metadata": {
"tags": [],
"needs_background": "light"
}
}
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "xySdtcDEb6Xw"
},
"source": [
"このような2行のプログラムを打ちます。\n",
"\n",
"最初の1行目はyという数列をplot(点を打つ)するというものです。\n",
"\n",
"2行目はその結果を表示せよ、という意味です。この簡単2行だけで結果を可視化することができます。\n",
"これが基本です。本当に正しく結果が表示されているのかが心配なときは、print文で見てみましょう。"
]
},
{
"cell_type": "code",
"metadata": {
"id": "j4LX5vsMcmdG",
"colab": {
"base_uri": "https://localhost:8080/"
},
"outputId": "a3719d94-dffc-41d4-b758-1c988125aa72"
},
"source": [
"print(y)"
],
"execution_count": 21,
"outputs": [
{
"output_type": "stream",
"text": [
"[0.63602181 0.56217935 0.73708926 0.99179993 0.80434831 0.13894619\n",
" 0.66666864 0.30310342 0.33260347 0.66255446]\n"
],
"name": "stdout"
}
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "gN2LemhGsXEk"
},
"source": [
"このyの一つ一つの要素を取り出したいときは、次のようにy[k]という表記をします。"
]
},
{
"cell_type": "code",
"metadata": {
"id": "E1X-QG6Osesx",
"colab": {
"base_uri": "https://localhost:8080/"
},
"outputId": "883929e1-1e6f-4a33-d7e7-7b00ad93b081"
},
"source": [
"print(y[3])"
],
"execution_count": 22,
"outputs": [
{
"output_type": "stream",
"text": [
"0.99179993400726\n"
],
"name": "stdout"
}
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "DWuOOflHsglv"
},
"source": [
"ここではy[3]で4番目の要素を取り出しています。少々ややこしいのがy[0]が1つ目の要素。y[1]は2つ目の要素を取り出すということで、[]内の数字と一個ズレるのに注意してください。"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "L4VGrrte-d7o"
},
"source": [
"### 平均でデータの傾向を知る\n",
"\n",
"こうしたたくさんの数字が並んでいる場合に傾向を探るための量として、平均があります。\n",
"合計したものを、その数字がいくつあるのかを示す数で割ったものです。\n",
"つまり数列を$x_1,x_2,x_3,\\ldots,x_n$としたとき、\n",
"\\begin{equation}\n",
"x_{\\rm mean} = \\frac{1}{n}\\left( x_1+x_2+\\ldots+x_n \\right)\n",
"\\end{equation}\n",
"これもシグマ記号を使って書いて小洒落ても良いですね。\n",
"\\begin{equation}\n",
"x_{\\rm mean} = \\frac{1}{n}\\sum_{k=1}^n x_k\n",
"\\end{equation}\n",
"今の場合は10個の数字が並んでいますからnp.sum()を使って合計から10を割りましょう。\n",
"割り算は簡単にスラッシュ(/)でできます。"
]
},
{
"cell_type": "code",
"metadata": {
"id": "ksZBP8E6dZ3T",
"colab": {
"base_uri": "https://localhost:8080/"
},
"outputId": "13feca0b-2aae-44dd-a40e-b8d01443c51b"
},
"source": [
"np.sum(y)/10"
],
"execution_count": 23,
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/plain": [
"0.5835314827830524"
]
},
"metadata": {
"tags": []
},
"execution_count": 23
}
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "5rURs_N4sw82"
},
"source": [
"同じ計算を習いたてのfor文を使って書くこともできます。"
]
},
{
"cell_type": "code",
"metadata": {
"id": "hyqrIanSs1AM",
"colab": {
"base_uri": "https://localhost:8080/"
},
"outputId": "2ad66f44-fecd-41fd-8fa5-f20fa2c7e430"
},
"source": [
"h = 0\n",
"for k in range(0,10):\n",
" h = h + y[k]\n",
"h = h/10\n",
"print(h)"
],
"execution_count": 24,
"outputs": [
{
"output_type": "stream",
"text": [
"0.5835314827830524\n"
],
"name": "stdout"
}
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "8auXzdBss9lD"
},
"source": [
"まずは計算の結果を格納するhを0と初期化します。初期化というのははじめに変な値が入っていないことが確実になるようにすることです。このhにy[0]、y[1]、、、と次々に足していけば合計が計算できますね。\n",
"ここで[]の中身にkを用いているところが驚くかもしれません。こういう使い方もできます。\n",
"でてきた計算結果は合計ですから、その結果を10で割り、平均の計算とします。"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "XkolY3lXd04n"
},
"source": [
"この平均はここまでで2通りの計算方法を示したましたが、実はnumpyの関数でnp.mean()というものがあります。meanは平均を示す英単語です。"
]
},
{
"cell_type": "code",
"metadata": {
"id": "6wq2MLiSd7fc",
"colab": {
"base_uri": "https://localhost:8080/"
},
"outputId": "25ffb843-e07b-4f80-a53c-18156c7b3310"
},
"source": [
"np.mean(y)"
],
"execution_count": 25,
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/plain": [
"0.5835314827830524"
]
},
"metadata": {
"tags": []
},
"execution_count": 25
}
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "_WY1bl8JNZPY"
},
"source": [
"どれも同じ結果になりますね。\n",
"こうしてみたようにやりたいことに対して、いくつかの書き方があるのがプログラミングの面白さです。\n",
"もちろん出来合いのnp.mean()が最も簡単ですが、それはあらかじめ用意されているから、とも言えます。\n",
"もしも用意されていなければ自分で作る必要があります。\n",
"用意された関数を組み合わせて、自分の必要とする計算を作り出すところがプログラミングの工夫のしどころです。\n",
"その意味で、プログラミングは勉強すればするほど、自分の経験から良い書き方ができるようになるので、\n",
"成長を実感しやすいという特徴があります。\n"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "EEMGn6rFt_zf"
},
"source": [
"### 分散でデータの散らばり具合を知る"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "WpmH9Jnqt97K"
},
"source": [
"さて平均は、その数字の周りにたくさんの数字が分布している、バラバラ散らばっているのだな、ということがうかがいすることができます。\n",
"どれだけの範囲に広がっているのかを示す指標が分散というもので、次のように計算することができます。\n",
"\\begin{equation}\n",
"x_{\\rm var} = \\frac{1}{n} \\sum_{k=1}^n \\left( x_k - x_{\\rm mean} \\right)^2\n",
"\\end{equation}\n",
"この計算通りにプログラムを組むことはできるでしょうか?\n",
"足し算をすれば良いことがわかりますからfor文の出番かもしれませんね。\n",
"何を足すのか、と考えると数列の各要素から平均を引いたものを二乗したものということですから、その通り書きましょう。"
]
},
{
"cell_type": "code",
"metadata": {
"id": "OeRhRMszucZb",
"colab": {
"base_uri": "https://localhost:8080/"
},
"outputId": "0c24392b-6d6b-4206-deb1-2644c769852d"
},
"source": [
"h = 0\n",
"m = np.mean(y)\n",
"for k in range(0,10):\n",
" h = h + (y[k] - m)**2\n",
"h = h/10\n",
"print(h)"
],
"execution_count": 26,
"outputs": [
{
"output_type": "stream",
"text": [
"0.059465161189176954\n"
],
"name": "stdout"
}
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "jnEvH1Jxwd84"
},
"source": [
"いかがでしょうか。最初にhは初期化する。そして今回は、途中で何度も出てくる平均値をmとして格納して、何度も計算しないようにしています。\n",
"これはプログラミングの工夫で重要なことです。同じことを繰り返すのが得意といえども、コンピュータに計算は負担がかかることですから、できるだけ楽をさせてあげましょう。同じことは繰り返しさせないように。\n",
"そして引き算はy[k]-mとして、マイナスをすれば良く、数式のままにカッコをつけて、二乗する。\n",
"2乗は**2として表記します。3乗もお手の物で**3とすればOKです。\n",
"最後に要素数10で割り算して計算完了。\n"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "yIOCCVhWxBD_"
},
"source": [
"もちろんこの計算も別の書き方があります。足し算をするのですから、np.sum()を使っても計算できます。"
]
},
{
"cell_type": "code",
"metadata": {
"id": "CplbG07yxG71",
"colab": {
"base_uri": "https://localhost:8080/"
},
"outputId": "d9686157-1fd2-4dcd-a90d-63a5aeb55464"
},
"source": [
"np.sum((y-m)**2)/10"
],
"execution_count": 27,
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/plain": [
"0.059465161189176954"
]
},
"metadata": {
"tags": []
},
"execution_count": 27
}
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "8288yymlxMZ9"
},
"source": [
"いかがでしょうか。yという数列全体にmを一斉に引き算して、全部一斉に2乗する。\n",
"それを合計してから要素数の10で割り算をする。同じ結果になりましたね。\n",
"\n",
"実はこの計算もnumpyの中に既に用意されていてnp.var()として計算することができます。"
]
},
{
"cell_type": "code",
"metadata": {
"id": "liAoezk2dcFs",
"colab": {
"base_uri": "https://localhost:8080/"
},
"outputId": "674a559c-7726-4655-8730-e9028661a1dc"
},
"source": [
"np.var(y)"
],
"execution_count": 28,
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/plain": [
"0.059465161189176954"
]
},
"metadata": {
"tags": []
},
"execution_count": 28
}
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "8J3zHxYkqrkW"
},
"source": [
"便利ですから、知っていればそれを使えばよいのですが、ちょっと自分で格好よく短くプログラミングできそうかどうか、\n",
"少し考えてみると楽しくなることでしょう。"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "_BXqgIoNxnA4"
},
"source": [
"## 大学生はプログラミングでさらに楽しく!?"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "ee2ASDr4xqx9"
},
"source": [
"高校でも学びますが、大学生の必須の科目として「線形代数」、そしてその関連科目があるかと思います。\n",
"ベクトルや行列といった計算をたくさん行います。\n",
"手で計算するのは大変ですが、実はプログラミングで大規模な行列とベクトルでも一瞬にして計算することができます。"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "-dIvRDH8yJZE"
},
"source": [
"例えばベクトルの内積。\n",
"\\begin{equation}\n",
"{\\bf a}\\cdot {\\bf b} = a_1b_1 + a_2 b_2 + \\ldots +a_n b_n\n",
"\\end{equation}\n",
"ここで2つのベクトルを${\\bf a} = (a_1,a_2,\\ldots,a_n)$、${\\bf a} = (b_1,b_2,\\ldots,b_n)$としています。\n",
"これを計算するのは手で計算せよ、と言われると大変ですが、まず数学ではシグマ記号の略記方法を導入することができますね。\n",
"\\begin{equation}\n",
"{\\bf a}\\cdot {\\bf b} = \\sum_{k=1}^n a_k b_k\n",
"\\end{equation}\n",
"忘れた頃にまたシグマ記号を思い出させています。\n",
"これで$a_kb_k$を何度も足し算すれば良いから内積の計算もプログラムすることができそうです。\n",
"そうですfor文を使いましょう。"
]
},
{
"cell_type": "code",
"metadata": {
"id": "ZBnq0NjWNX_6",
"colab": {
"base_uri": "https://localhost:8080/"
},
"outputId": "11f28ce6-5458-45ec-c59d-9d4204e2e813"
},
"source": [
"h = 0 \n",
"a = np.random.rand(10)\n",
"b = np.random.rand(10)\n",
"\n",
"for k in range(0,10):\n",
" h = h + a[k]*b[k]\n",
"print(h)"
],
"execution_count": 29,
"outputs": [
{
"output_type": "stream",
"text": [
"2.5360102997203726\n"
],
"name": "stdout"
}
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "nJ4Ibkwyz9Wz"
},
"source": [
"aとbにはでたらめな乱数をnp.random.rand()でそれぞれ用意しました。\n",
"a[k][*b[k]でそれぞれの要素をかけたものを計算して、それを何度も足し算するというプログラムになっていますね。\n",
"この内積計算についても、幸いなことにnumpyで用意されています。\n"
]
},
{
"cell_type": "code",
"metadata": {
"id": "YRIKuspk0XQx",
"colab": {
"base_uri": "https://localhost:8080/"
},
"outputId": "039f9436-88d2-4e89-d00c-347379f32f0f"
},
"source": [
"np.dot(a,b)"
],
"execution_count": 30,
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/plain": [
"2.536010299720372"
]
},
"metadata": {
"tags": []
},
"execution_count": 30
}
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "iH9yoebh0aw_"
},
"source": [
"同じように行列(縦と横に数値が並んだもの)も用意することができます。\n",
"適当な乱数による行列は次のように作ります。"
]
},
{
"cell_type": "code",
"metadata": {
"id": "iv58mNqDzkvS",
"colab": {
"base_uri": "https://localhost:8080/"
},
"outputId": "c8edd2f5-14cc-4437-97c3-06e504158147"
},
"source": [
"A = np.random.randn(10,10)\n",
"print(A)"
],
"execution_count": 31,
"outputs": [
{
"output_type": "stream",
"text": [
"[[ 0.53022511 -0.37472079 1.72198257 -0.97954557 1.62127324 -2.05384978\n",
" 0.70944181 -0.05173238 -0.94341187 -0.61096433]\n",
" [-1.00250283 0.6378543 -1.24281895 0.69998471 0.68630983 0.57570523\n",
" -0.26868434 1.56202131 0.58191163 -2.37701128]\n",
" [-0.18145991 1.36851339 -0.3082993 -0.6797512 -1.0136382 2.33558842\n",
" 0.95637194 0.95882307 -0.83825937 0.98203512]\n",
" [ 2.17889054 -0.38560042 0.78320057 0.09802492 -0.27664365 -0.75319451\n",
" 0.75112078 0.71835411 -0.42269378 -0.19308585]\n",
" [ 0.57057354 -0.39476345 -2.41745891 -1.17522394 0.91432191 0.80198868\n",
" -0.37510282 0.32564944 -1.74725572 0.29828165]\n",
" [-0.17543465 -1.68354899 -0.17593811 -0.90281417 -0.72028189 0.14205185\n",
" -0.76062012 0.22313866 -0.18073995 -0.34691678]\n",
" [-0.32821805 0.39673881 -0.39334981 -0.09796328 -0.4572241 -0.24873905\n",
" 0.86228194 1.03844312 -0.17168227 -0.08714228]\n",
" [ 0.05671482 2.19950266 0.0268085 0.36516141 1.11602212 -0.72864943\n",
" 0.13264564 0.96282195 0.96429814 0.65709349]\n",
" [ 0.68356624 0.32272741 -0.36095184 -0.91392161 0.32815908 0.67161071\n",
" -0.24505146 0.17892375 0.45071594 -1.6903456 ]\n",
" [ 1.8444051 -0.94460674 -0.07641798 -0.41662126 0.11649425 -1.09985796\n",
" -0.19526838 1.97204052 2.38095822 -0.99950997]]\n"
],
"name": "stdout"
}
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "4-Zg4bh60thr"
},
"source": [
"この行列Aとベクトルbの内積なんていうのも簡単に計算することができます。"
]
},
{
"cell_type": "code",
"metadata": {
"id": "1UuwxCyu0oe1",
"colab": {
"base_uri": "https://localhost:8080/"
},
"outputId": "e20e48ea-9768-4764-85cc-2aae1b873af2"
},
"source": [
"np.dot(A,b)"
],
"execution_count": 32,
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/plain": [
"array([-0.25494245, 0.65431093, 1.47523076, 1.09737003, -2.40886596,\n",
" -3.44110024, -0.01764953, 4.1331299 , 0.14992639, 1.21364655])"
]
},
"metadata": {
"tags": []
},
"execution_count": 32
}
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "k092EilO037g"
},
"source": [
"dotというのは、内積を英語でドットプロダクトというところから来ています。\n",
"行列とベクトルの内積ってどうやって計算するのだっけ?と教科書を紐解くと、酷くめんどくさい計算が記載されています。"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "neqbhula1lBr"
},
"source": [
"\\begin{equation}\n",
"A \\cdot {\\bf b} = \n",
"\\left(\n",
"\\begin{array}{cccc}\n",
"A_{11} & A_{12} & \\cdots & A_{1n} \\\\\n",
"A_{21} & A_{22} & \\cdots & A_{2n} \\\\\n",
"\\vdots & & \\ddots & \\vdots \\\\\n",
"A_{n1} & A_{n2} & \\cdots & A_{nn} \\\\\n",
"\\end{array}\n",
"\\right)\n",
"\\left(\n",
"\\begin{array}{cccc}\n",
"b_{1} \\\\\n",
"b_{2} \\\\\n",
"\\vdots \\\\\n",
"b_{n} \\\\\n",
"\\end{array}\n",
"\\right) = \n",
"\\left(\n",
"\\begin{array}{c}\n",
"A_{11}b_1 + A_{12}b_2 + \\cdots + A_{1n}b_n \\\\\n",
"A_{21}b_1 + A_{22}b_2 + \\cdots + A_{2n}b_n \\\\\n",
"\\vdots \\\\\n",
"A_{n1}b_1 + A_{n2}b_2 + \\cdots + A_{nn}b_n \\\\\n",
"\\end{array}\n",
"\\right)\n",
"\\end{equation}"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "2UKoEhTJ2Vgm"
},
"source": [
"行列の縦の並びを行、横の並びを列と呼びますが、要するに行ごとに同じような計算をして並べろというわけです。\n",
"その同じような計算は、ようく眺めると、足し算の繰り返しになっています。\n",
"少々面倒ですが、自分で書いてみましょうか。\n",
"まず計算結果は縦に複数並んでいます。行列とベクトルの内積はベクトルという結果になります。\n",
"これを一つ一つ計算することを考えていきましょう。\n",
"まず計算結果を格納する場所は1つじゃないということになります。\n",
"そこで複数個用意しましょう。最初は初期化されたものが欲しい。0がたくさん。0をたくさん並べれば良いですね。"
]
},
{
"cell_type": "code",
"metadata": {
"id": "__m7NqvL0yaP"
},
"source": [
"h = np.array([0,0,0,0,0,0,0,0,0,0])"
],
"execution_count": 33,
"outputs": []
},
{
"cell_type": "markdown",
"metadata": {
"id": "egF4rzzc3hqT"
},
"source": [
"0をたくさん並べました!\n",
"np.array()で囲むのは、計算を一斉に行うという特徴を持った形式に保存するためのおまじないです。\n",
"いくつ0が並んでいるのか数えるのも嫌ですよね。\n",
"便利なのが.shapeと打つと、そのベクトルや行列の形・サイズが分かります。"
]
},
{
"cell_type": "code",
"metadata": {
"id": "-MhjKmwo1gy2",
"colab": {
"base_uri": "https://localhost:8080/"
},
"outputId": "9d0bf2ad-d810-408c-e7bf-0c7fc0bf1845"
},
"source": [
"h.shape"
],
"execution_count": 34,
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/plain": [
"(10,)"
]
},
"metadata": {
"tags": []
},
"execution_count": 34
}
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "HzJB9Q8633Wu"
},
"source": [
"ベクトルはもちろん、行列もバッチリです。"
]
},
{
"cell_type": "code",
"metadata": {
"id": "LckOJyrH3gbP",
"colab": {
"base_uri": "https://localhost:8080/"
},
"outputId": "c1f1a72d-26df-4c98-82e0-eae8b9fa43b2"
},
"source": [
"A.shape"
],
"execution_count": 35,
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/plain": [
"(10, 10)"
]
},
"metadata": {
"tags": []
},
"execution_count": 35
}
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "GEvoR_sY37cb"
},
"source": [
"これで10個の0が並んだ初期化の済んだhを用意することができました。\n",
"計算をしたいものの一番上を見てみると、$A_{1k}b_{k}$という形で$k$を変えながら足し算しろということが見えてきます。\n",
"数式がプログラムをするためのヒントになっていることがこれでよく分かります。\n",
"たくさん並んだ文字を見たら、法則性を見出し、変わっているところ、変わっていないところを探して、\n",
"変わっているところはfor文を使ってコンピュータに計算させてやろうというわけです。\n",
"この考察の結果、計算結果の1番目は次のように書くことができるでしょう。"
]
},
{
"cell_type": "code",
"metadata": {
"id": "CcUFymzF4xKA"
},
"source": [
"for k in range(0,10):\n",
" h[0] = h[0] + A[0,k]*b[k]"
],
"execution_count": 36,
"outputs": []
},
{
"cell_type": "markdown",
"metadata": {
"id": "Jh4YYVnj5Zms"
},
"source": [
"これが縦にも、同じことが繰り返される、、、繰り返しならもう一度for文を使えば良いのではないか?\n",
"そう気づいたら、こっちのものです。\n",
"改めて初期化込みで書き出してみましょう。\n",
"また0を何回も書くのは嫌ですよね。\n",
"そのためにnp.zeros()という関数を利用しましょう。指定した個数の0が並びます。\n",
"類似したものでnp.ones()という関数もあります。これは指定した個数の1が並びます。\n"
]
},
{
"cell_type": "code",
"metadata": {
"id": "26LGF_BK5Syl",
"colab": {
"base_uri": "https://localhost:8080/"
},
"outputId": "bc31072c-316f-41d1-8152-8850ae19b213"
},
"source": [
"h = np.zeros(10)\n",
"for i in range(0,10):\n",
" for k in range(0,10):\n",
" h[i] = h[i] + A[i,k]*b[k]\n",
"print(h)"
],
"execution_count": 37,
"outputs": [
{
"output_type": "stream",
"text": [
"[-0.25494245 0.65431093 1.47523076 1.09737003 -2.40886596 -3.44110024\n",
" -0.01764953 4.1331299 0.14992639 1.21364655]\n"
],
"name": "stdout"
}
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "_bpuiN7l6AiW"
},
"source": [
"最初に初期化をしなおして、iによるfor文は、上から下に様々な計算結果を受けるようにhの添え字としてiを動かすために利用します。\n",
"それぞれの計算は、先ほどと同じように$A_{ik}b_k$の足し算ですから、kによるfor文でかけます。\n",
"二重のfor文を作るときはtabによる空白を2段階進める必要があります。\n",
"先ほどのnp.dot()による結果を見事に再現しています。\n",
"np.dot()で書いた方が確実で短くかけますので、普段はそちらでも良いのですが、\n",
"同じ計算を違う書き方でできないかな、とは常に考えてください。\n",
"特にfor文は多くなると計算の速度が低減する要因となります。\n",
"できるだけfor文のない書き方を目指してください。\n",
"今回の場合ですと、やはり足し算の部分は、np.sumが使えるのではないか、と考えるはずです。\n",
"A[i,k]のように要素を1つだけ抜き取る以外にも、行列からベクトルを抜き出すこと、つまり複数の要素を取り出すことができます。"
]
},
{
"cell_type": "code",
"metadata": {
"id": "5CZa-PXU5w_8",
"colab": {
"base_uri": "https://localhost:8080/"
},
"outputId": "15b223e3-3d7a-4005-93d5-63e9cda7682f"
},
"source": [
"A[0,:]"
],
"execution_count": 38,
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/plain": [
"array([ 0.53022511, -0.37472079, 1.72198257, -0.97954557, 1.62127324,\n",
" -2.05384978, 0.70944181, -0.05173238, -0.94341187, -0.61096433])"
]
},
"metadata": {
"tags": []
},
"execution_count": 38
}
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "C89nN1eA69Tx"
},
"source": [
"このようにコロンを使うと、要素全て、という意味になります。この場合は行列Aのうち、縦の1番目の要素を全て取り出すということになります。これを用いれば、次のようにプログラムを書き換えることができますね。\n"
]
},
{
"cell_type": "code",
"metadata": {
"id": "-rYCgEbT68Ip",
"colab": {
"base_uri": "https://localhost:8080/"
},
"outputId": "a42bf3c4-ef94-4792-8e4f-8aa19285542f"
},
"source": [
"h = np.zeros(10)\n",
"for i in range(0,10):\n",
" h[i] = h[i] + np.dot(A[i,:],b)\n",
"print(h)"
],
"execution_count": 39,
"outputs": [
{
"output_type": "stream",
"text": [
"[-0.25494245 0.65431093 1.47523076 1.09737003 -2.40886596 -3.44110024\n",
" -0.01764953 4.1331299 0.14992639 1.21364655]\n"
],
"name": "stdout"
}
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "FWw4bWa67V68"
},
"source": [
"このように同じ計算結果を導く、for文の少ないプログラミングができました。\n",
"まあやっぱりnp.dot(A,b)で一度に書いた方が見た目にも良いですね。\n",
"これだけ繰り返したらだんだんと慣れてきたのではないでしょうか。\n",
"人間の手に負えない計算をコンピュータにやらせることで、これまでにない大規模のデータを処理させていきましょう。それがプログラミングの威力です。"
]
}
]
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment