Coursera Machine Learning 2週目 プログラミング課題の提出
解答例
vanhuyz.com
課題提出の流れ
Octaveを使用する方法です。
1. Octaveをインストールする
www.gnu.org
octave-X.X.X-w64-installer.exe をクリック
2. 課題のプログラムをダウンロード
赤矢印のとこクリック
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はメイン関数みたいになっている)
Coursera Machine Learning 2週目の復習
自分用のメモです。
- ①Multivariate Linear Regression
- ②Computing Parameters Analytically
- ③Octave/Matlab Tutorial
- プログラミング課題
①Multivariate Linear Regression
複数の特徴量(Feature)
線形回帰で、複数の変数を持つものは、"multivariate linear regression"と呼ばれる。
これまではインプット(x)は一つだったが、普通はx1,x2...のように複数ある。
記法
nとmで違うのに注意。mはデータのセットの個数、nは特徴量の個数
Hypothesis 仮説関数 (特徴量が複数ある場合)
注意:x0なんていう特徴量は存在しないが、x0があるとしてx0=1とすると、スッキリしたベクトル式が書けるのでそう定義する。
コスト関数 (特徴量が複数ある場合)
Feature Scaling -特徴量のスケーリング
特徴量のサイズの大きさは揃えて計算したほうがいい。
例えば、家の特徴量として、面積x1は0-2000feet, ベッドルームの数x2は1-5個
のように特徴量の大きさが離れていると、その2つの値に同じα(学習率)を用いると最急降下法のコストが高くなる。
のように。
スケーリングの目安としては、全ての特徴量が -1 ≦ x ≦ 1 に収まるようにするとよい。
-1 ≦ x ≦ 0 はOK, -100 ≦ x ≦ 100 や -0.01 ≦ x ≦ 1 はダメ
スケーリングの仕方は
・特徴量を最大値で割る
・特徴量 = (特徴量 - 平均値)/取る値の範囲 で置き換える
学習率αの選び方
αが小さすぎると、収束が遅い
αが大きすぎると、コスト関数の値は小さくならないかもしれない
ので、αは都度試してみる
多項式回帰
直線の式に当てはまらなさそうなデータでも、線形回帰モデルを工夫すれば使うことができる。
仮説を
としたとき、
のように、sizeとsizeの二乗をそれぞれ別の特徴量とする。
このとき、特徴量のスケーリングがより重要になる。
なぜなら、例えばsize =100ならsize^2は10000になる、つまり各特徴量の差が大きくなるから。
②Computing Parameters Analytically
Normal Equation 正規方程式
A⊤A が正則なとき、Ax−b を最小にする x はただ一つであり,
それは正規方程式
を解くことで得られる。(x,bは縦ベクトル、Aは行列)
これを変形すると
最急降下法と正規方程式の特徴まとめ
最急降下法 | 正規方程式 |
---|---|
学習率αを設定する必要がある | αの設定がいらない |
たくさんのイテレーションが必要 | 一発で求められる |
O(kn^2) | O(n^3) ...X^TXの計算が必要 |
nが巨大なときに使うといい | nが巨大だと遅い |
だいたいn=10000くらいが境目になるらしい。それより小さければ全部正規方程式でいい。
O(nkn^2)とかいうのは、計算量(オーダー)のこと。
ざっくりいうと、計算するのに必要な所要時間のようなもの。
qiita.com
プログラミング課題
難しかった。これは別の記事で。
Coursera Machine Learning 2週目 プログラミング課題 - 高卒フリーターがAIエンジニアを目指す
【確率統計】ベイズの定理
条件付き確率
Xが起こった下でYが成り立つ確率P(Y|X)は
意味として解釈すると、原因Xによって結果Yが起きる確率。
ベイズの定理
上の式を利用して変形していく。
①の式のXとYを入れ替えると
また①の式より
③を②に代入すると
④の式は、ただ式変形で導き出されただけの式
しかし、これを意味として解釈すると、結果が生じている際の、原因の確率を探る、ということになる。因果関係を、結果→原因の順で追う。
観察結果から見て、前提条件がこうであった、と推測するような式になる。
こういうのを尤度だとか言うらしい。尤もらしさ(もっともらしさ)。
罹患率・陽性・陰性・偽陽性・偽陰性
病気の診断のときにこの定理が発揮される。
ざっくり書くと、罹患率0.01%の病気の診断で、陽性だと診断された場合、実際に陽性である確率はかなり低い。
これは、診断結果から病気(原因)の確率を求めることになる。
*罹患率…その病気にかかっている確率。人口1億人の国で1万人がかかっている病気の罹患率は、1万割る1億。
【確率統計】推定・検定入門/全9講
ヨビノリさんの確率統計の再生リスト
www.youtube.com
これからの講義で対象になるのは「推測統計」
①母集団と標本
コンドル(ファボ0のレポ)
コンドルは死肉を食べる(ハゲワシも一緒)。頭に毛がない理由は、毛に死肉の細菌がつかないようにするため。また、殺菌のために日光浴もする。
母集団
調査の対象となる全データのこと。
3つの統計解析
統計解析は大きく分けて記述統計と推測統計の2つに分けられる。ベイズ統計はおまけで足した
- 記述統計
演繹的な算法。母集団が判明しており、その母集団の特徴を求めるもの。例えば、あるクラス40人の身長の平均値を算出するなど。(クラス40人全ての身長が判明している)
- 推測統計
帰納的に推測する統計。母集団のうちからいくつかの標本を取り、その標本から母集団の特徴を推測するもの。例えば、世界中の人間の身長の平均値を算出するなど。
- ベイズ統計
上の2つとはちょっと毛色が違う(というか並列関係にない)
ベイズの定理を用いた統計学。詳しくは↓
noromap.hatenablog.com
推測統計(より詳細に)
- 観察集団(標本)のデータから母集団の特性を「推定」する
- 平均/分散/係数値などの推定(点推定)
- 点推定値のばらつきを調べる(区間推定)
- 検定統計量を用いた「検定」
推測統計では、母集団は大きくないとダメ。
入っている個数の少ないボックスガチャを考えてほしい。1個ガチャを引く(標本を抽出する)と、残りのガチャ全体(母集団)の特徴が変わってしまう。
記号の定義
大文字と小文字で表すものの違い
大文字…確率変数
小文字…具体的な数(実現値、観測値)
標本って具体的な数値じゃないの?と思うかもしれないし、実際そうだけど、
標本は抽出するたびに変わるから確率”変数”
標本を10個とってきてまた母集団に戻し、次にまた標本10個とってきたとき、
最初の10個と次の10個では値が全然異なっている。
Coursera Machine Learning 1週目の復習
自分用のメモです。
①Introduction
回帰問題
予測するものの値が連続的である場合の問題。実数値を推測する問題。
(数学の関数の連続と定義は違うけどニュアンス的に一緒)
土地の広さをxとしたとき、土地の相場yは、y=2x のような関数を算出する問題。
分類問題
対象にラベルをつける問題。これはりんご、これはみかん、のように判別する問題。
②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を算出してはいけない、ということ
学習記録① Python
まずPythonを学習しよう!
機械学習の勉強にあたって、まずこの本を読んだ。
機械学習エンジニアになりたい人のための本 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くんですが、インデントにはめっちゃ厳しいです。
インデントがチョットずれていると怒られます。靴揃えてなかったら怒るお母さんみたいな
クラスについて詳しく
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でコンソールで動く○✕ゲームかなにかを作ろうと思います。