暇人日記

アラフォーおっさんのコーセラの機械学習の課題を解こうと頑張っています!

Coursera Machine Learning Week4 課題 2周目⑥ -苦闘記憶-  One vsALL④

前回と同じく引き続きoneVsAll.mに取り組みます。

 

f:id:omoshiroamericanews:20200226220631p:plain

 

が、問題文詳細oneVSAll.mを読んで

問題文とは違うことをやっていることに気づきましたorz

 

問題文詳細oneVSAll.mでは、ユーザーが変更しない箇所に

all_theta = zeros(num_labels, n + 1)

と書いてあります。

これは私が最適thetaの401X10と同じことを狙っているベクトルなのですが、

all_thetaは10X401のベクトルなので、このままではコースで点がとれません。

(ベクトルの形が違うのでエラーになります。)

 

しかし、縦横が違うだけなので基本的な考え方はあっていると思います。

401X10でも10X401でも転置さえしてしまえば、

5000X401にかけて5000x10にするのはできるはずだからです。

 

次回の日記でall_thetaは10X401のベクトルの作り方を検証することにして、

今回の日記ではPreditionとその精度までのプログラミングを考えたいと思います。

 

 

というわけで振り返りです。

前回の日記でこの仮説を

 

f:id:omoshiroamericanews:20200308172425p:plain

 

具現化することができました↓

f:id:omoshiroamericanews:20200308121554p:plain



あとはこの1行目の場合は10、つまり数字としては0とプログラムで認識させることが

できれば5000行について予測が作成できます。

そうするとYの実Sampleと比較して精度検証することができます。

 

イメージは↓ですね。

具現化された5000X10をイメージ化すると↓みたいになっています。

f:id:omoshiroamericanews:20200308174347p:plain

そして、これを

f:id:omoshiroamericanews:20200308174546p:plain

というように最大値のある場所とひもづけて0-9の数字を決定したいと

いうことになります。

 

『列ごとに最大値を認識して、その場所を数として教えてくれる』

 という便利な関数があればいいなぁという感じです。

 

そして、そんな都合のいい関数あるわけないだろう、と思っていると

predictoneVsAll.mのHintの中にそんな都合のいい関数の紹介がでてきます。

f:id:omoshiroamericanews:20200308175121p:plain

max(A, [], 2)を使ってみて、というのがアドバイスなので

5X5のベクトルで小実験してみます。

f:id:omoshiroamericanews:20200308175502p:plain

そしてアドバイスを使ってみます。

f:id:omoshiroamericanews:20200308175519p:plain

これで1列目は24がある『2』

2列目は23がある『1』

と出てくれば完璧です。

 

f:id:omoshiroamericanews:20200308175614p:plain

残念。場所じゃなくて値がでてきました。

 

help Functionを使ってmaxを調べて、というのもアドバイスにあるので

みてみます。

 

な、長い。。。

f:id:omoshiroamericanews:20200308175903p:plain

 

真ん中くらいにある↓が使えそうです。

f:id:omoshiroamericanews:20200308180112p:plain

これはxが値の最大である5を取り出してきていて、

ixが最大値のある3行目の3を取り出してきています。 

 

さっきの5X5の例で実験してみます。

f:id:omoshiroamericanews:20200308180346p:plain

とりあえず値をForecastのFとして、場所がPredictionのPにします。

 

f:id:omoshiroamericanews:20200308175502p:plain

 

これで1列目は24がある『2』

2列目は23がある『1』

とPが取り出してくれたら成功です。

 

f:id:omoshiroamericanews:20200308180706p:plain

Pで最大値のある場所を取り出してくれたので成功です!

 

f:id:omoshiroamericanews:20200308180905p:plain

Bは↓です

f:id:omoshiroamericanews:20200308121554p:plain

これでPは5000X1行で0-9の値をとり、最初の10行は10のはずです。

 

f:id:omoshiroamericanews:20200308181044p:plain

f:id:omoshiroamericanews:20200308181110p:plain

予想通りになりました!

 

あとはこれでPとYの正答率をみれば精度がわかります!

 

これはWeek3の↓の日記でやりました。

www.courseradaisuki.com

 

こういうことですね↓

f:id:omoshiroamericanews:20200308181453p:plain

Pを大文字にしたら完成です!

 

f:id:omoshiroamericanews:20200308181244p:plain

94.9%の正答率ですね!

 

f:id:omoshiroamericanews:20200308181710p:plain

 問題文に正しく実行できた場合の正答率は94.9%とあるので、

解法は違いましたが正解だと思います!

 

 今回はここまでです!

次回は問題文詳細oneVsAll.mを問題文に即して解くことにトライします!