前回と同じく引き続きoneVsAll.mに取り組みます。
が、問題文詳細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とその精度までのプログラミングを考えたいと思います。
というわけで振り返りです。
前回の日記でこの仮説を
具現化することができました↓
あとはこの1行目の場合は10、つまり数字としては0とプログラムで認識させることが
できれば5000行について予測が作成できます。
そうするとYの実Sampleと比較して精度検証することができます。
イメージは↓ですね。
具現化された5000X10をイメージ化すると↓みたいになっています。
そして、これを
というように最大値のある場所とひもづけて0-9の数字を決定したいと
いうことになります。
『列ごとに最大値を認識して、その場所を数として教えてくれる』
という便利な関数があればいいなぁという感じです。
そして、そんな都合のいい関数あるわけないだろう、と思っていると
predictoneVsAll.mのHintの中にそんな都合のいい関数の紹介がでてきます。
max(A, [], 2)を使ってみて、というのがアドバイスなので
5X5のベクトルで小実験してみます。
そしてアドバイスを使ってみます。
これで1列目は24がある『2』
2列目は23がある『1』
と出てくれば完璧です。
残念。場所じゃなくて値がでてきました。
help Functionを使ってmaxを調べて、というのもアドバイスにあるので
みてみます。
な、長い。。。
真ん中くらいにある↓が使えそうです。
これはxが値の最大である5を取り出してきていて、
ixが最大値のある3行目の3を取り出してきています。
さっきの5X5の例で実験してみます。
とりあえず値をForecastのFとして、場所がPredictionのPにします。
これで1列目は24がある『2』
2列目は23がある『1』
とPが取り出してくれたら成功です。
Pで最大値のある場所を取り出してくれたので成功です!
Bは↓です
これでPは5000X1行で0-9の値をとり、最初の10行は10のはずです。
予想通りになりました!
あとはこれでPとYの正答率をみれば精度がわかります!
これはWeek3の↓の日記でやりました。
こういうことですね↓
Pを大文字にしたら完成です!
94.9%の正答率ですね!
問題文に正しく実行できた場合の正答率は94.9%とあるので、
解法は違いましたが正解だと思います!
今回はここまでです!
次回は問題文詳細oneVsAll.mを問題文に即して解くことにトライします!