高卒フリーターがAIエンジニアを目指す

機械学習・Python・数学 の勉強メモ

Coursera Machine Learning 2週目 プログラミング課題の提出

解答例
vanhuyz.com

課題提出の流れ

Octaveを使用する方法です。

1. Octaveをインストールする
www.gnu.org
octave-X.X.X-w64-installer.exe をクリック

2. 課題のプログラムをダウンロード
f:id:noromap:20200928002806p:plain:w300
赤矢印のとこクリック

3. 課題の提出方法
ダウンロードしたフォルダの中にある、submit.m をOctaveで開く。
メールアドレスとトークンの入力を求められるので、入力する。
(メールアドレスとトークンは、courseraの提出方法に書いてあるやつ)

フォルダの中身

今回プログラムを書く必要があるファイルは下の4つ(+任意課題もある)

  • warmUpExercise.m
  • plotData.m
  • computeCost.m
  • gradientDescent.m - Function to run gradient descent

warmUpExerciseは、単体で実行できるが、
下の3つは、単体で実行するとエラーがでる。
ので、ex1.mを実行して確認する必要がある。(ex1.mはメイン関数みたいになっている)

プログラミング課題について

全然分からなかったから、この記事一番上に貼ったリンクを参考にしました。
warmUpExerciseと、plotDataは、付属のpdfに書いてある。
それぞれ、1 Simple Octave/MATLAB function と、2.1 Plotting the Data のとこ。
動画みて理解するのと、実際にプログラムするのとでは大違いだった。辛い

Coursera Machine Learning 2週目の復習

自分用のメモです。

①Multivariate Linear Regression

複数の特徴量(Feature)

線形回帰で、複数の変数を持つものは、"multivariate linear regression"と呼ばれる。
これまではインプット(x)は一つだったが、普通はx1,x2...のように複数ある。
記法
n=特徴量の数 \\m=データの数 \\x^{(i)} = i番目のデータの複数の特徴量 \\x_j^{(i)} = 特徴量jの、i番目の値
nとmで違うのに注意。mはデータのセットの個数、nは特徴量の個数

Hypothesis 仮説関数 (特徴量が複数ある場合)

 h_θ(x) = \theta_0x_0 + \theta_1x_1+ \theta_2x_2 + ... \theta_nx_n
注意:x0なんていう特徴量は存在しないが、x0があるとしてx0=1とすると、スッキリしたベクトル式が書けるのでそう定義する。
x=
\begin{bmatrix}x_0\\x_1\\︙\\x_n \end{bmatrix}\in R^{n+1} \\
\theta=
\begin{bmatrix}\theta_0\\ \theta_1\\︙\\ \theta_n \end{bmatrix}\in R^{n+1} \\
h_\theta(x) = \theta^T_x

コスト関数 (特徴量が複数ある場合)

J(\theta_0,\theta_1,...,\theta_n) = \frac{1}{2m}\sum_{i=1}^{m}(h_θ(x^{(i)}-y^{(i)})^2

Feature Scaling -特徴量のスケーリング

特徴量のサイズの大きさは揃えて計算したほうがいい。
例えば、家の特徴量として、面積x1は0-2000feet, ベッドルームの数x2は1-5個
のように特徴量の大きさが離れていると、その2つの値に同じα(学習率)を用いると最急降下法のコストが高くなる。
x_1 = \frac{2000}{size(feet^2)} \\
x_2 = \frac{5}{number of bedrooms}
のように。

スケーリングの目安としては、全ての特徴量が -1 ≦ x ≦ 1 に収まるようにするとよい。
-1 ≦ x ≦ 0 はOK, -100 ≦ x ≦ 100 や -0.01 ≦ x ≦ 1 はダメ

スケーリングの仕方は
・特徴量を最大値で割る
・特徴量 = (特徴量 - 平均値)/取る値の範囲 で置き換える
 x_1  = \frac{size - 1000}{2000}

学習率αの選び方

αが小さすぎると、収束が遅い
αが大きすぎると、コスト関数の値は小さくならないかもしれない
ので、αは都度試してみる

多項式回帰

直線の式に当てはまらなさそうなデータでも、線形回帰モデルを工夫すれば使うことができる。
仮説を
h_\theta(x) = \theta_0  + \theta_1(size) + \theta_2(size)^2
としたとき、
x_1 = size \\
x_2 = size^2
のように、sizeとsizeの二乗をそれぞれ別の特徴量とする。
このとき、特徴量のスケーリングがより重要になる。
なぜなら、例えばsize =100ならsize^2は10000になる、つまり各特徴量の差が大きくなるから。

②Computing Parameters Analytically

Normal Equation 正規方程式

正規方程式の導出と計算例 | 高校数学の美しい物語
↑より

A⊤A が正則なとき、Ax−b を最小にする x はただ一つであり,
それは正規方程式
A^⊤Ax=A^⊤b
を解くことで得られる。(x,bは縦ベクトル、Aは行列)

これを変形すると
\theta=(X^TX)^{-1}X^Ty

最急降下法と正規方程式の特徴まとめ

最急降下法 正規方程式
学習率αを設定する必要がある αの設定がいらない
たくさんのイテレーションが必要 一発で求められる
O(kn^2) O(n^3) ...X^TXの計算が必要
nが巨大なときに使うといい nが巨大だと遅い

だいたいn=10000くらいが境目になるらしい。それより小さければ全部正規方程式でいい。

O(nkn^2)とかいうのは、計算量(オーダー)のこと。
ざっくりいうと、計算するのに必要な所要時間のようなもの。
qiita.com

Normal Equation Noninvertibility 逆行列が存在しないときの正規方程式

逆行列が存在しないときはほとんどないらしい。
もしそうなったときはいくつか原因が考えられる。

  • 冗長な特徴量がある
    • x1=size in feet^2
    • x2=size in m^2 のように

 これらは線形独立らしい。

  • 特徴量が多すぎる(e.g. m≦n)

たぶん多重共線性っていうのに関係してる?

Octave/Matlab Tutorial

プログラミング関連の話は省略する。

Vectorization ベクトル化
  • ベクトル化の例1

h_\theta(x) = \sum_{j=0}^n\theta_jx_j 
\\=\theta^Tx
\\x,\thetaは列ベクトル

\theta_j := \theta_j-α\frac{1}{m}\sum_{i=1}^m(h_\theta(x^{(i)}) - y^{(i)})x_j^{(i)} (for\ all\ j) \\
\theta_0 := \theta_0-α\frac{1}{m}\sum_{i=1}^m(h_\theta(x^{(i)}) - y^{(i)})x_j^{(i)} \\
\theta_1 := \theta_1-α\frac{1}{m}\sum_{i=1}^m(h_\theta(x^{(i)}) - y^{(i)})x_j^{(i)} \\
\theta_2 := \theta_2-α\frac{1}{m}\sum_{i=1}^m(h_\theta(x^{(i)}) - y^{(i)})x_j^{(i)}


これを
\theta:=\theta - αδ \\
 where\space δ = \frac{1}{m}\sum_{i=1}^m(h \theta(x^{(i)}) - y^{(i)}) x^{(i)}
とする。

\theta:n+1の列ベクトル\\
α:スカラー\\
δ:n+1の列ベクトル\\
h\theta(x^{(i)}) :スカラー. \theta^Txだから\\
 y^{(i)}:スカラー

【確率統計】ベイズの定理

youtu.be

条件付き確率

Xが起こった下でYが成り立つ確率P(Y|X)は
P(Y|X)=\frac{P(X,Y) : XかつYの確率}{P(X)}…①
意味として解釈すると、原因Xによって結果Yが起きる確率。

ベイズの定理

上の式を利用して変形していく。
①の式のXとYを入れ替えると
P(X|Y)=\frac{P(X,Y)}{P(Y)}…②
また①の式より
P(X,Y) = \frac{P(Y|X)}{P(X)}…③
③を②に代入すると
P(X|Y)=\frac{P(Y|X)P(X)}{P(Y)}…④

④の式は、ただ式変形で導き出されただけの式
しかし、これを意味として解釈すると、結果が生じている際の、原因の確率を探る、ということになる。因果関係を、結果→原因の順で追う。
観察結果から見て、前提条件がこうであった、と推測するような式になる。
こういうのを尤度だとか言うらしい。尤もらしさ(もっともらしさ)。

罹患率・陽性・陰性・偽陽性偽陰性

病気の診断のときにこの定理が発揮される。
ざっくり書くと、罹患率0.01%の病気の診断で、陽性だと診断された場合、実際に陽性である確率はかなり低い。
これは、診断結果から病気(原因)の確率を求めることになる。
罹患率…その病気にかかっている確率。人口1億人の国で1万人がかかっている病気の罹患率は、1万割る1億。

事前確率、情報、事後確率

罹患率0.01%の病気の診断で陽性だと診断された場合、その病気にかかっている確率は0.05%になったとする。
このとき、罹患率は事前確率、診断は情報、0.05%は事後確率、のように呼ばれる。

確率の更新プロセス

事前確率→(情報を与える)→事後確率、のように、ベイズの定理は確率更新に用いられる。
こういう手法を逐次ベイズ推定と呼ばれたりする。

【確率統計】推定・検定入門/全9講

ヨビノリさんの確率統計の再生リスト
www.youtube.com
これからの講義で対象になるのは「推測統計」

①母集団と標本

https://youtu.be/Bj8fkq533Dc

コンドル(ファボ0のレポ)

コンドルは死肉を食べる(ハゲワシも一緒)。頭に毛がない理由は、毛に死肉の細菌がつかないようにするため。また、殺菌のために日光浴もする。

母集団

調査の対象となる全データのこと。

3つの統計解析

統計解析は大きく分けて記述統計と推測統計の2つに分けられる。ベイズ統計はおまけで足した

  • 記述統計

演繹的な算法。母集団が判明しており、その母集団の特徴を求めるもの。例えば、あるクラス40人の身長の平均値を算出するなど。(クラス40人全ての身長が判明している)

  • 推測統計

帰納的に推測する統計。母集団のうちからいくつかの標本を取り、その標本から母集団の特徴を推測するもの。例えば、世界中の人間の身長の平均値を算出するなど。

上の2つとはちょっと毛色が違う(というか並列関係にない)
ベイズの定理を用いた統計学。詳しくは↓
noromap.hatenablog.com

推測統計(より詳細に)
  • 観察集団(標本)のデータから母集団の特性を「推定」する
    • 平均/分散/係数値などの推定(点推定)
    • 点推定値のばらつきを調べる(区間推定)
  • 検定統計量を用いた「検定」

推測統計では、母集団は大きくないとダメ。
入っている個数の少ないボックスガチャを考えてほしい。1個ガチャを引く(標本を抽出する)と、残りのガチャ全体(母集団)の特徴が変わってしまう。

記号の定義

母平均:μ \\
母分散:σ^2 \\
標本:X_1,X_2 ... X_n

大文字と小文字で表すものの違い
大文字…確率変数
小文字…具体的な数(実現値、観測値)
標本って具体的な数値じゃないの?と思うかもしれないし、実際そうだけど、
標本は抽出するたびに変わるから確率”変数”
標本を10個とってきてまた母集団に戻し、次にまた標本10個とってきたとき、
最初の10個と次の10個では値が全然異なっている。

②点推定

ツキノワグマ(ファボ0のレポ)

猛獣扱いされるツキノワグマ、実は主食は山菜。

Coursera Machine Learning 1週目の復習

自分用のメモです。

①Introduction

機械学習とは
教師あり学習

データセットに答えが含まれており、インプットに対するアウトプットの答えが既に判明している状態での学習。
教師あり学習の課題は大きく「回帰問題」と「分類問題」に分けられる。

回帰問題

予測するものの値が連続的である場合の問題。実数値を推測する問題。
(数学の関数の連続と定義は違うけどニュアンス的に一緒)
土地の広さをxとしたとき、土地の相場yは、y=2x  のような関数を算出する問題。

分類問題

対象にラベルをつける問題。これはりんご、これはみかん、のように判別する問題。

教師なし学習

学習過程で答えが与えられない。Googleはコンピューターに画像を見せ続けて猫を認識させるのに成功したが、これが教師なし学習だったので、話題になった。つまり、人間がコンピューターに”猫という概念”を教えることなく、コンピューターは猫を認識した。
教師あり学習で認識させる場合は、猫や犬の画像を見せて「これは猫」「これは犬」と学習させ、「じゃ、これは?」と聞く。(分類問題)

②Model and Cost Function

数式の定義

x:インプット
y:アウトプット
m:データの組の総数
i:何番目のデータの組か
$$
(x^{(i)}, y^{(i)}) : データの組
$$
h:仮説関数 (hypothesis)

仮説関数 (Hypothesis)

記号hで表される。yをxから推測するための関数。
y = h(x) の形をとる。
仮説という名前はなんとなくつけられてしまっただけで、先生的にはあまりいい命名じゃないと。

コスト関数 (Cost Function)

適切な仮説関数を導き出す(仮説関数の係数、定数の適切な値を導き出す)ために使われる関数。
hが線形回帰の場合、仮説関数は下のように表される。
$$
h_θ(x)^{x{(i)}} = θ_0+θ_1x^{(i)}
$$
このとき、コスト関数は
$$
J(θ_0,θ_1)=\frac{1}{2m}\sum_{i=1}^{m}(h_θ(x_i)-y_i)^2
$$
となる。
このJ()が最小となるθ_0,θ_1を求めることで適切な仮説関数が導き出される。

③Parameter Learning

勾配法

最適化問題において、関数の勾配に関する情報を解の探索に用いるアルゴリズムの総称。

最急降下法

勾配法のアルゴリズムの一つ。
関数の傾きから関数の最小値を探索する、連続最適化問題アルゴリズム
勾配法としては最も単純で、よく使われる。
(それから、線形回帰のコスト関数以外にも使えるよ。)
最急降下法を用いる手順
・θ_0, θ_1 を適当に設定してスタート
・θ_0,θ_1を変えながら、J(θ_0,θ_1) を小さくしていき、最小値を探す
その更新式が↓
$$
\theta_{j}:=\theta_{j}-α\frac{\partial}{\partial \theta_{j}}J(\theta_{0},\theta_{1})
$$
αは探索幅(学習率と呼ぶ)、:=はイコールではなく代入の意味
なぜ更新式がこの形をとるのかがいまいち理解できないときは、
Gradient Descent Intuition - Linear Regression with One Variable | Coursera

ポイントは、全てのθの値は同時に更新する必要があること。つまり
$$
temp0:=\theta_{0}-α\frac{\partial}{\partial \theta_{0}}J(\theta_{0},\theta_{1})
temp1:=\theta_{1}-α\frac{\partial}{\partial \theta_{1}}J(\theta_{0},\theta_{1})
\theta_{0} := temp0
\theta_{1}:=temp1
$$
こういう順番で行う必要がある。先にθ0を更新して、そのθ0を用いてθ1を算出してはいけない、ということ

線形代数 Linear Algebra

知らなかったところだけ書く

転置行列

行列Aが
A=\begin {bmatrix}1 & 2 & 3 \\4 & 5 & 6 \end{bmatrix}
のとき、Aの転置行列は
A^T=\begin {bmatrix}1 &4 \\2&5\\3&6 \end{bmatrix}
TはTransposeの意味

はてなブログで綺麗な数式を書けるようにする(LaTex)

参考情報

haskell.hatenablog.com

導入方法

はてなブログダッシュボードを開く
②左カラムのデザインを押す
③カスタマイズ(レンチのアイコン)を押す
④ヘッダ の タイトル下 の欄に下記を入力する

f:id:noromap:20200921020050p:plain:h200

これでLaTexの記法で書くと反映されます。

書き方

LaTexの記法で書いた部分を$$で囲む。

$$
y = ax^2 + bx + c
$$


$$
y = ax^2 + bx + c
$$

学習記録① Python

まずPythonを学習しよう!

機械学習の勉強にあたって、まずこの本を読んだ。

機械学習エンジニアになりたい人のための本 AIを天職にする (AI&TECHNOLOGY)

機械学習エンジニアになりたい人のための本 AIを天職にする (AI&TECHNOLOGY)

  • 作者:石井 大輔
  • 発売日: 2018/10/17
  • メディア: 単行本(ソフトカバー)
ほーほー、とりあえず習うより慣れろでやってみろ!と。
だから早速Kaggleに取り組もうとした。
けど、さっぱり分からなかった。AIうんぬんデータうんぬんの前に、Notebookとかディレクトリの構成とか、プログラミングの環境周りがさっぱり分からなかった。ので、Pythonの基本から学ぶことにした。
C#はUnityでまあまあ触っていたので、プログラミング自体の知識はある。のでPython習得も楽勝だろうきっと!

ゆるゆるニシキヘビ言語Python

めちゃくちゃ分かりやすい記事を見つけた。C#Pythonを比較して紹介されている。ありがてぇ。。。
hiroronn.hatenablog.jp
ほか参考記事
とほほのPython入門 - クラス - とほほのWWW入門
Python♪用語集:モジュール、パッケージ、ライブラリの違い | Snow Tree in June
Python入門 ~Pythonのインストール方法やPythonを使ったプログラミングの方法について解説します~ | PythonWeb



………C#と全然ちがうよーーー!!

  • 改行とインデントでブロックを判別する

{}で区切ったりしないのです。まじかよ。そしてインデントはスペース推薦だそう。

  • クラスの定義
class TestClass:
    pass

x = TestClass()

うおおーまじで{}がない。(ついでに文末の:(セミコロン)もない)

  • 型をつけない、書かない

↑のコードのように、xにTestClassを代入するときにvar x = とか TestClass x = とか書かない
Pythonは動的型付け

  • 1ファイルが1モジュール

一つのファイル(testmodule.py)がモジュールとみなされる。
モジュールを外部ファイルから使うときは

import testmodule

のように書く。

  • リストは x = [1,3,"aa] (突然の文字列でもOK。同じリストに違う型の値を入れられる)
  • ハッシュセット(重複なしセット)は x = {1,2,3}

 └Pythonではset,集合型と呼ばれている。

  • Dictionaryはpeople = {'noromap': 24 } のように。

こんな感じでゆるゆるなPythonくんですが、インデントにはめっちゃ厳しいです。
インデントがチョットずれていると怒られます。靴揃えてなかったら怒るお母さんみたいな

クラスについて詳しく

qiita.com

class TestClass2:
    val = [] #publicメンバ
    __val = []  #privateメンバ __(アンダーバー2つを頭につけるだけ。ゆる~!)
    def __init__(self):   #コンストラクタ. selfは自身のインスタンス
        print("init:" + str(self.val))
        # 初期化
        self.val.append(1)
        self.val.append("Yaaay")

    def test_method1(self):
        print("test_method2:" + str(self.val))

testClass2 = TestClass2()
testClass2.test_method1()

実行結果

init:[]
test_method2:[1, 'Yaaay']

次回はPythonでコンソールで動く○✕ゲームかなにかを作ろうと思います。