Skip to content

Instantly share code, notes, and snippets.

@lasershow
Created February 6, 2017 08:17
Show Gist options
  • Save lasershow/214b0758becf3ed1130963432120dfdd to your computer and use it in GitHub Desktop.
Save lasershow/214b0758becf3ed1130963432120dfdd to your computer and use it in GitHub Desktop.
sample
Display the source blob
Display the rendered blob
Raw
{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# 線形代数入門\n",
"\n",
"## 線形代数とは\n",
"\n",
"線形代数は、数学の分野の一種のことです。\n",
"今まで、行列やベクトルという言葉を聞いたことや学んだことがあると思いますが、これらの分野を数学の専門用語では、`線形代数`と言います。\n",
"\n",
"## なぜ線形代数を学ぶのか\n",
"\n",
"これから機械学習、深層学習ついて、その前にデータサイエンスを学んでいきますが、これらの分野では大量のデータを計算することが必要になります。\n",
"\n",
"例えば、肺がん検出アルゴリズムについて考えてみましょう。\n",
"肺がん検出アルゴリズムでは、様々なデータから患者の腫瘍が陽性であるか、陰性であるかを予測する必要があります。\n",
"データには、患者の年齢、性別、身長、体脂肪率など、多くの特徴があります。\n",
"ここでは、100個程度の特徴があると仮定しましょう。\n",
"さらに患者のデータ数が1万程度あると仮定してください。\n",
"\n",
"これらのデータを元に機械学習を行う場合、\n",
"一番簡単なアルゴリズムでも`100(特徴数)* 100(重み) * 10000(データ数)`の計算が必要になります。\n",
"\n",
"※パーセプトロンのアルゴリズムを想定しています。重みは、特徴数分あります。\n",
"※重みを掛けることで、どれくらいその特徴が重要であるかを定義しますが、ここでは理解しなくて構いません。\n",
"\n",
"式に表すと以下になりますが、特に理解しなくても構いません。\n",
"\n",
"```\n",
"  年齢 * 重み + 体重 * 重み + 身長 * 重み + .....\n",
" 67 0.2 60kg 0.1 165 0.2\n",
" 76 0.2 65kg 0.1 175 0.2\n",
" 45 0.2 89kg 0.1 159 0.2\n",
" 52 0.2 56kg 0.1 172 0.2\n",
" 78 0.2 52kg 0.1 181 0.2\n",
" 59 0.2 78kg 0.1 167 0.2\n",
" 62 0.2 62kg 0.1 176 0.2\n",
" 82 0.2 66kg 0.1 162 0.2\n",
"```\n",
"\n",
"以上の膨大な計算を行おうとすると、今までの演算では膨大な時間と労力がかかってしまいます。( `年齢 * 重み + 体重 * 重み + 身長 * 重み + .....`の計算を1万人分やると考えたら想像がつくはずです。)\n",
"そこで、線形代数を学び、その知識を使用することで膨大な計算でも計算しやすくします。\n",
"\n",
"## ベクトル\n",
"\n",
"先ほどの肺がんのデータのように、多くの特徴(身長や年齢など)をひとつの数式で扱いたいということが、今後数多くあります。多くの数値(特徴)をまとめて扱うためには、ベクトルや行例を使用する必要があります。まずは、ベクトルを学んでいきましょう。\n",
"\n",
"数をならべたものをベクトルと言います。\n",
"\n",
"$\n",
" \\left(\n",
" \\begin{array}{c}\n",
" 67 \\\\\n",
" 76 \\\\\n",
" 45 \\\\\n",
" \\vdots \\\\\n",
" \\end{array}\n",
" \\right)\n",
"$\n",
"\n",
"この縦に並べたベクトルを縦ベクトルと言います。\n",
"この縦ベクトルの値は、年齢を表しています。\n",
"(Aさんの年齢、Bさんの年齢、Cさんの年齢.....)\n",
"\n",
"ベクトルを使用して、複数の値をひとつの数式でまとめることができたので、ベクトルで演算を行ってみましょう。(紙に書き出してみたり、暗算をしてイメージを掴みましょう。)\n",
"\n",
"`足し算`\n",
"\n",
"$\n",
" \\left(\n",
" \\begin{array}{c}\n",
" 67 \\\\\n",
" 76 \\\\\n",
" 45 \\\\\n",
" \\vdots \\\\\n",
" \\end{array}\n",
" \\right) + \\left(\n",
" \\begin{array}{c}\n",
" 67 \\\\\n",
" 76 \\\\\n",
" 45 \\\\\n",
" \\vdots \\\\\n",
" \\end{array}\n",
" \\right) = \\left(\n",
" \\begin{array}{c}\n",
" 134 \\\\\n",
" 152 \\\\\n",
" 90 \\\\\n",
" \\vdots \\\\\n",
" \\end{array}\n",
" \\right) \n",
"$\n",
"\n",
"\n",
"以上のベクトルでの計算は、以下の計算をまとめて行っているのと同義です。(なぜ年齢と年齢と加算しているかについては、加算の練習をしているだけで、意味があるものではないと述べておきます。)\n",
"\n",
"$\n",
"67 + 67 = 134 \\\\\n",
"76 + 76 = 152 \\\\\n",
"45 + 45 + = 330 \\\\\n",
"$\n",
"\n",
"\n",
"また、ベクトル内のそれぞれの値を定数倍することができます。(式を理解しやすくするために、ベクトルの数値を変更しています。)\n",
"\n",
"`定数倍`\n",
"\n",
"$\n",
" 3 \\left(\n",
" \\begin{array}{c}\n",
" 2 \\\\\n",
" 10 \\\\\n",
" 20 \\\\\n",
" \\vdots \\\\\n",
" \\end{array}\n",
" \\right) = \\left(\n",
" \\begin{array}{c}\n",
" 6 \\\\\n",
" 30 \\\\\n",
" 60 \\\\\n",
" \\vdots \\\\\n",
" \\end{array}\n",
" \\right) \n",
"$\n",
"\n",
"こちらも、以下をまとめたものになります。\n",
"\n",
"$\n",
"3 * 2 = 6 \\\\\n",
"3 * 10 = 30 \\\\\n",
"3 * 20 = 60 \\\\\n",
"$\n",
"\n",
"#### 補足 ベクトルの本質について\n",
"\n",
"本来であれば、ベクトルが空間の点、そして矢印であることを説明すべきですが、この章では取扱ません。\n",
"上記により、ベクトル同士の掛け算や割り算、例えば以下は成り立ちません。\n",
"今回は省略し、ベクトルは数値の並びとして説明します。従って、ベクトルは数値をひとつに並べたものと認識できていれば、大丈夫です。\n",
"\n",
"`ベクトルの掛け算はできない`\n",
"\n",
"$\n",
" \\left(\n",
" \\begin{array}{c}\n",
" 2 \\\\\n",
" 3 \\\\\n",
" 4 \\\\\n",
" \\vdots \\\\\n",
" \\end{array}\n",
" \\right) * \\left(\n",
" \\begin{array}{c}\n",
" 2 \\\\\n",
" 3 \\\\\n",
" 4 \\\\\n",
" \\vdots \\\\\n",
" \\end{array}\n",
" \\right) \n",
"$\n",
"\n",
"\n",
"## 行列\n",
"\n",
"行列を使用することで、さらに多くの数値を扱うことができます。\n",
"先ほどベクトルを使用し、複数人の年齢をひとつの数式で扱うことができるようになりました。\n",
"行列を使用することで、さらに多くの特徴(身長や体重)を扱うことができるようになります。\n",
"\n",
"$\n",
"\\begin{pmatrix}\n",
"67 & 60 & 165 \\\\\n",
"76 & 65 & 175\\\\\n",
"45 & 89 & 159 \\\\\n",
"\\vdots & \\vdots & \\vdots \\\\\n",
"\\end{pmatrix}\n",
"$\n",
"\n",
"一列目(67,76,45)は年齢を、二列目(60,65,89)は体重を、三列目(165,175,159)は身長を表しています。\n",
"ベクトルだけでは、年齢のみ扱うことができましたが、行例を使用することで複数の特徴をひとつの数式で表現することが可能です。\n",
"\n",
"また、(67,60,165)の横の並びを行と言います。(76,65,175)は二行目です。(45,89,159)は三行目です。\n",
"従って以上の行列を 3(行) * 3(列)行列といいます。\n",
"\n",
"\n",
"\n",
"### 行列とベクトルの積\n",
"\n",
"では、本題にもどり、パーセプトロンのアルゴリズムも行列とベクトルの積で表すことにします。\n",
"\n",
"※パーセプトロンのアルゴリズム`年齢 * 重み + 体重 * 重み + 身長 * 重み + .....`\n",
"\n",
"以上を三人分数式に直すと以下になります。(年齢、体重、身長に対しての重みをそれぞれ0.2、0.1、0.2に設定しています。重みについて理解する必要はありません。)\n",
"\n",
"$\n",
"67 * 0.2 + 60 * 0.1 + 165 * 0.2\\\\\n",
"$\n",
"\n",
"$\n",
"76 * 0.2 + 65 * 0.1 + 175 * 0.2\\\\\n",
"$\n",
"\n",
"$\n",
"45 * 0.2 + 89 * 0.1 + 159 * 0.2\\\\\n",
"$\n",
"\n",
"以上を行列とベクトルの積で表現すると以下になります。\n",
"\n",
"$\n",
" \\left(\n",
" \\begin{array}{c}\n",
"67 & 60 & 165 \\\\\n",
"76 & 65 & 175\\\\\n",
"45 & 89 & 159 \\\\\n",
" \\end{array}\n",
" \\right) * \\left(\n",
" \\begin{array}{c}\n",
" 0.2\\\\\n",
" 0.1\\\\\n",
" 0.2\\\\\n",
" \\end{array}\n",
" \\right) = \\left(\n",
" \\begin{array}{c}\n",
" 52.4\\\\\n",
"56.7\\\\\n",
" 49.7\\\\\n",
" \\end{array}\n",
" \\right) \n",
"$\n",
"\n",
"分かりやすくするため、それぞれ数値ではなく特徴(年齢、体重など)で置き換えています。\n",
"\n",
"$\n",
" \\left(\n",
" \\begin{array}{c}\n",
"年齢 & 体重 &  身長 \\\\\n",
"年齢 & 体重 & 身長\\\\\n",
"年齢 & 体重 & 身長 \\\\\n",
" \\end{array}\n",
" \\right) * \\left(\n",
" \\begin{array}{c}\n",
" 重み(年齢)\\\\\n",
" 重み(体重)\\\\\n",
" 重み(身長)\\\\\n",
" \\end{array}\n",
" \\right) = \\left(\n",
" \\begin{array}{c}\n",
" 一行目の結果\\\\\n",
" 二行目の結果\\\\\n",
" 三行目の結果\\\\\n",
" \\end{array}\n",
" \\right) \n",
"$\n",
"\n",
"また、演算の仕組みを表すと以下のようになります。\n",
"特徴の後の()の中の数字は、その数字が何行目のものであるかを表しています。\n",
"`年齢(1)` = 一行目\n",
"\n",
"$\n",
" \\left(\n",
" \\begin{array}{c}\n",
"年齢(1) & 体重(1) &  身長(1) \\\\\n",
"年齢(2) & 体重(2) & 身長(2)\\\\\n",
"年齢(3) & 体重(3) & 身長(3) \\\\\n",
" \\end{array}\n",
" \\right) * \\left(\n",
" \\begin{array}{c}\n",
" 重み(年齢)\\\\\n",
" 重み(体重)\\\\\n",
" 重み(身長)\\\\\n",
" \\end{array}\n",
" \\right) = \\left(\n",
" \\begin{array}{c}\n",
" 年齢(1) * 重み(年齢) + 体重(1) * 重み(体重) + 身長(1) * 重み(身長)\\\\\n",
" 年齢(2) * 重み(年齢) + 体重(2) * 重み(体重) + 身長(2) * 重み(身長)\\\\\n",
" 年齢(3) * 重み(年齢) + 体重(3) * 重み(体重) + 身長(3) * 重み(身長)\\\\\n",
" \\end{array}\n",
" \\right) \n",
"$\n",
"\n",
"ベクトルを使用することで、複数の値をひとつの式で扱うことができること。\n",
"そして、行列で複数の値をまとめることができれば、この課題の目的は果たせたと言えます。\n",
"次々回は、Pythonでどのようにベクトルを記述するのか、そしてPythonのライブラリ`Numpy`について学びますが、その前にモジュールについて学びましょう。\n",
"\n",
"## 課題\n",
"\n",
"以下のベクトルの演算をし、答えをDIVERにて提出してください。\n",
"\n",
"$\n",
" \\left(\n",
" \\begin{array}{c}\n",
"10 & 20 & 30 \\\\\n",
"30 & 20 & 10\\\\\n",
"30 & 10 & 20 \\\\\n",
" \\end{array}\n",
" \\right) * \\left(\n",
" \\begin{array}{c}\n",
" 0.2\\\\\n",
" 0.1\\\\\n",
" 0.2\\\\\n",
" \\end{array}\n",
" \\right) = \n",
"$\n",
"\n",
"\n",
"\n",
"`課題例`\n",
"\n",
"$\n",
" \\left(\n",
" \\begin{array}{c}\n",
"1 & 2 & 3 \\\\\n",
"3 & 2 & 1\\\\\n",
"3 & 1 & 2 \\\\\n",
" \\end{array}\n",
" \\right) * \\left(\n",
" \\begin{array}{c}\n",
" 3\\\\\n",
" 2\\\\\n",
" 1\\\\\n",
" \\end{array}\n",
" \\right) = \\left(\n",
" \\begin{array}{c}\n",
"10 \\\\\n",
"15\\\\\n",
"13\\\\\n",
" \\end{array}\n",
" \\right) \n",
"$\n",
"\n",
"\n",
"## テキストフィードバックについて\n",
"\n",
"今後のAIコースの発展のために、お時間があれば\n",
"フィードバックのご協力をお願い致します。\n",
"以下を参考に、DIVERのコメント欄にご投稿して頂けると有難いです。\n",
"\n",
"・テキストの難易度は適切であったか\n",
"\n",
"・テキストの分量は適切であったか\n",
"\n",
"・説明していない用語はなかったか\n",
"\n",
"・テキストに間違いはなかったか\n",
"\n",
"・テキストのゴールに対して適切な内容であったか\n",
"\n",
"・他に説明を加えてほしいことは無かったか\n",
"\n",
"・やってて楽しいテキストであったか\n",
"\n",
"・有益なテキストであったか\n",
"\n",
"**明確な改善点についてはwaffleの方にも投稿をお願い致します!(早急な改善に繋がります。)**\n",
"\n",
"https://waffle.io/DiveintoCode-corp/ai-course\n",
"\n",
"**その他なんでもご意見をご投稿ください**\n",
"\n",
"**DIVER課題機能のコメント欄に記述をお願い致します。**\n",
"\n",
"\n",
"### 参考\n",
"\n",
"線形代数について、深く学びたい方は以下の書籍がオススメです。\n",
"\n",
"プログラミングのための線形代数 単行本 – 2004/10\n",
"平岡 和幸 (著), 堀 玄 (著)"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": []
}
],
"metadata": {
"anaconda-cloud": {},
"kernelspec": {
"display_name": "Python [conda root]",
"language": "python",
"name": "conda-root-py"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.5.2"
}
},
"nbformat": 4,
"nbformat_minor": 1
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment