復習と頭の整理のためにメモとして書いていきます。随時、追記していきます。
#分類
画像が縦長か横長か、2つの分類先に分ける二値分類について考える。
データ : 高さと横幅の部分
ラベル : 形の部分
表の内容をプロットすると次のようになる。
更に、データ数を増やしてみる。
再度、プロットすると次のようになる。
これは、次のように線を引いて分類できる。
分類の場合は、図形的に解釈するとわかりやすいから、大きさと向きを持った矢印のベクトルをイメージするといい。
先の線は、重みベクトルを法線ベクトルとする直線ということになる。
(注意)
は重みベクトルというパラメータで、法線は、ある直線に対して垂直なベクトルのこと。
ベクトル同士の内積について
実ベクトル空間の内積は各要素の積を足し上げたものだから、次の式と同じ意味ということ。
今回の縦幅と横幅を求める式は次のようになる。
= (1, 1)のとき
となり、傾き-1の直線を表すということがわかる。
(内積の式は直線のグラフを表す。)
![スクリーンショット 2017-10-29 12.37.58.png](https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.amazonaws.com%2F0%2F170564%2Fba63b2f7-680a-6f4b-2095-5b5b9e82948c.png?ixlib=rb-4.0.0&auto=format&gif-q=60&q=75&s=5824c4e9d362f0439036a26148fd0ad5)
重みベクトル = (1, 1)を書き加えると、
が直線に対して垂直になっていることがわかる。
縦長か横長かを判定する関数(つまり1か-1を返す関数)は識別関数という名前がついている。
![スクリーンショット 2017-10-29 12.38.58.png](https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.amazonaws.com%2F0%2F170564%2F09785988-7374-39f2-81dd-9578e0a8887c.png?ixlib=rb-4.0.0&auto=format&gif-q=60&q=75&s=a1562a33eb45d65eebf0ed66bd9ff6f0)
![スクリーンショット 2017-10-29 12.38.52.png](https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.amazonaws.com%2F0%2F170564%2F990cb401-86c9-576a-7c00-ee1615841111.png?ixlib=rb-4.0.0&auto=format&gif-q=60&q=75&s=c95dec43343b9c66e7a7d5310fd0d857)
![スクリーンショット 2017-10-29 22.31.17.png](https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.amazonaws.com%2F0%2F170564%2F2cae6bef-3f21-1766-cf84-4e1f777a395b.png?ixlib=rb-4.0.0&auto=format&gif-q=60&q=75&s=731458c8289631079ae37cb571f074a7)
![スクリーンショット 2017-10-29 22.32.15.png](https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.amazonaws.com%2F0%2F170564%2Fdc85c639-344e-6e00-941b-994e0b6ae209.png?ixlib=rb-4.0.0&auto=format&gif-q=60&q=75&s=5aa68f45164e98488faa2c13a5b1a218)
![スクリーンショット 2017-10-29 16.55.30.png](https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.amazonaws.com%2F0%2F170564%2F502b6b41-1759-fb00-11d0-016ea22953ff.png?ixlib=rb-4.0.0&auto=format&gif-q=60&q=75&s=67e5a0bcfe34e61cf783dc0d3c5514f8)
![スクリーンショット 2017-10-29 22.32.15.png](https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.amazonaws.com%2F0%2F170564%2Fdc85c639-344e-6e00-941b-994e0b6ae209.png?ixlib=rb-4.0.0&auto=format&gif-q=60&q=75&s=5aa68f45164e98488faa2c13a5b1a218)
![スクリーンショット 2017-10-29 12.39.07.png](https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.amazonaws.com%2F0%2F170564%2Fd58091f4-a71f-de5c-0061-c73e115b3f21.png?ixlib=rb-4.0.0&auto=format&gif-q=60&q=75&s=5b62692f8b5ca74e8132714ba3aa7e06)
![スクリーンショット 2017-10-29 12.39.14.png](https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.amazonaws.com%2F0%2F170564%2Fc4b7b683-a54c-4602-a343-8d73b3fb79d2.png?ixlib=rb-4.0.0&auto=format&gif-q=60&q=75&s=47ae35fa0bee362a7d3f821ad38a4407)
重みベクトルの更新式は、次のようになる。
これをすべての学習データに対して繰り返し処理して重みベクトルを更新していく。
は、識別関数による分類がうまくいかなかった場合。
(横幅と高さのベクトルを識別関数に通して分るいした結果と、実際のラベルyが異なっている)
それに対して、は、識別関数による分類がうまくいったということ。
つまり、
この式は、識別関数による分類に失敗した時だけ新しいパラメータに更新するよ、という式。
分類に成功した時は、そのままを代入しているので何も変わらない。
では、詳しく分類に失敗した時の更新式を見ていく。
重みベクトルは、回帰のパラメータ同様、ランダムな値で初期化するから、適当に以下のベクトルで考えてみる。
![スクリーンショット 2017-10-29 12.39.52.png](https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.amazonaws.com%2F0%2F170564%2F0572a7c1-d1cd-8ba1-3e35-a618af039920.png?ixlib=rb-4.0.0&auto=format&gif-q=60&q=75&s=c95b57117c202c6e316b13486e1438ff)
というデータがあるとき、これでパラメータを更新することを考えてみる。
お互いのベクトルはほぼ反対を向いているからと
の成す角θは
になって、内積は負になる。
したがって、識別関数による分類は-1となる。
つまり、になって、分類に失敗したという状態。
更新式が適用され、より、
ここで面白いのは、新しい次のは
で、その新しい重みベクトルに垂直な直線(識別関数)は回転したこと。
![スクリーンショット 2017-10-29 12.40.30.png](https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.amazonaws.com%2F0%2F170564%2Fd79a484f-0eb8-691c-155f-b232ef2a744b.png?ixlib=rb-4.0.0&auto=format&gif-q=60&q=75&s=1613a4a1b296f37299ae052d0ddf3ea0)
![スクリーンショット 2017-10-29 22.55.58.png](https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.amazonaws.com%2F0%2F170564%2Fdefe4216-3fe4-7cd3-bb51-94993f3b4f44.png?ixlib=rb-4.0.0&auto=format&gif-q=60&q=75&s=37d8b2245b87d8a8226998335c0fc99f)
なので、内積が正になり、
による分類は1になる。
なので、分類に成功したということになる。
このように、パラメータの重みベクトルは更新されていく。
この更新をすべての学習データについて繰り返していくことがパーセプトロンの学習ということになる。
##ロジスティック回帰/シグモイド関数
ロジスティック回帰は、分類を確率として考えるので、アプローチの仕方が異なる。
横長を1、縦長を0とすると、
Q. 縦長を今回−1にしなかったのは何故か?
更新式を簡潔にするための便宜上の理由。本当はどちらでもいい。
回帰の関数は、勾配降下法を使ってθを学習し、そのθを使って未知のデータ
に対する出力値を求めることができた。
このように、未知のデータがどのクラスに分類されるかを求める関数が必要で、次のような式になる。
ちなみに =
なので、
は、
と書き換えることができる。
を横軸、
を縦軸だとする、シグモイド関数は次のようなグラフになる。
シグモイド関数は、だから、分類を確率として考える上で便利。
未知のデータが横長だとう確率
は、次のように表すことができる。
の中の縦棒は、条件付き確率、つまり
というデータが与えられた時に横長(
)になる確率を表す。
のとき、横幅である確率は70%だということ。=>横長に分類される。
は横幅の確率が20%ということ。=> 縦長に分類される。
つまり、の結果を見て、0.5をしきい値として横長か縦長かを分類される。
![スクリーンショット 2017-10-29 12.43.10.png](https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.amazonaws.com%2F0%2F170564%2F69c9628d-dc3f-47d7-1a19-1795831c5d7c.png?ixlib=rb-4.0.0&auto=format&gif-q=60&q=75&s=06d705f960880d6bcfa91491c9096311)
![スクリーンショット 2017-10-29 12.42.53.png](https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.amazonaws.com%2F0%2F170564%2Fc0fa4069-f29a-3026-33c8-6dd9c5ffe1f4.png?ixlib=rb-4.0.0&auto=format&gif-q=60&q=75&s=adfd5294c85410c4ff974aa11709c5ea)
![スクリーンショット 2017-10-29 12.43.17.png](https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.amazonaws.com%2F0%2F170564%2F5fd98eae-a9b1-ccb1-eb6f-7a2af2909c5c.png?ixlib=rb-4.0.0&auto=format&gif-q=60&q=75&s=98c7be0ee90435f722af32acd9c66675)
![スクリーンショット 2017-10-30 1.04.55.png](https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.amazonaws.com%2F0%2F170564%2F81ac505a-b1ce-d272-9212-f286e93b111e.png?ixlib=rb-4.0.0&auto=format&gif-q=60&q=75&s=5922b0e7b11b2ffa14bed58893838686)
![スクリーンショット 2017-10-30 1.05.08.png](https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.amazonaws.com%2F0%2F170564%2F79b1ab65-e62a-825e-9283-de657eeec9a5.png?ixlib=rb-4.0.0&auto=format&gif-q=60&q=75&s=b889198206eac469c9dea5e76863a653)
![スクリーンショット 2017-10-29 12.43.24.png](https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.amazonaws.com%2F0%2F170564%2F971d197e-65ac-8ca5-888e-b3ed718f51d0.png?ixlib=rb-4.0.0&auto=format&gif-q=60&q=75&s=7d22d229bcab9ea9a171e851563f48fb)
![スクリーンショット 2017-10-29 12.43.28.png](https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.amazonaws.com%2F0%2F170564%2F1aa4495d-86fb-1ec7-6906-467af38e79cd.png?ixlib=rb-4.0.0&auto=format&gif-q=60&q=75&s=f6661e8f3d0c6eaccd908d9f317f06d9)
![スクリーンショット 2017-10-30 1.08.20.png](https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.amazonaws.com%2F0%2F170564%2F85fc619e-d557-a454-7ed2-34dea9ba4545.png?ixlib=rb-4.0.0&auto=format&gif-q=60&q=75&s=57dc2c122a9b29ca957ba16a42bc450c)
![スクリーンショット 2017-10-29 12.43.34.png](https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.amazonaws.com%2F0%2F170564%2F5a6a1305-5aa5-227f-71fd-22cc9842bf1f.png?ixlib=rb-4.0.0&auto=format&gif-q=60&q=75&s=f28c4d9e39a19dd019eca7abd0801360)
要するに、を境界線として、分類している。
このようにデータを分類するための直線のことを決定境界という。
今回は、パラメータθに適当な値を入れたので、上手く分類できていない。
次はそのθを求めるために、目的関数を定義して微分してパラメータの更新式を求める(ロジスティック回帰)。
が横長である確率
を
と定義したので、学習ラベル
と
の関係は、
のとき
、
のとき、
すべての学習データはお互い関係なく独立に発生すると考えると、この場合の全体の確率は、次のように表すことができる。
場合分けするより、1つの式にまとまって表記が簡単になっている。
目的関数がわかったところで、次は、目的関数を最大化するパラメータθを考える。
(回帰の時は誤差を最小化する、今考えているのは、同時確率。確率が高くなってほしいから、最大化する。)
##対数尤度関数
これからは尤度関数を微分して、パラメータθを求めていく。
ただし、予め尤度関数は変形する(尤度関数の対数をとる)。
(確率は全て1以下の数で、同時確率のようなかけ算は、かけるほど値が小さくなっていくため。)
logは単調増加関数(グラフがずっと右上がりで、なら
となるような関数
のこと。)で、そのグラフの形はこのような感じ。
なら
になっている。だから、尤度関数についても
なら
になる。
要するに、を最大化することと
を最大化することは同じことになる。
次に、尤度関数の微分について
ロジスティック回帰は、この対数尤度関数を目的関数として使うことになる。
これをパラメータθで微分していくと、
次のように置き換えて、
よって、
まずは、から計算すると、
![スクリーンショット 2017-10-29 12.47.52.png](https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.amazonaws.com%2F0%2F170564%2Fb485ca4a-e51c-648e-66ed-66df86a40cd9.png?ixlib=rb-4.0.0&auto=format&gif-q=60&q=75&s=dfdcba9050d233e37028517a472e9d98)
次は、を
で微分する。
ただし、を微分することは、ややこしいので、以下のようなシグモイド関数の微分結果を利用して微分する。
![スクリーンショット 2017-10-29 12.48.17.png](https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.amazonaws.com%2F0%2F170564%2Fed42dffd-c148-7db1-e4fe-9792994fbca2.png?ixlib=rb-4.0.0&auto=format&gif-q=60&q=75&s=cd6908800e4d4cf0ccb7f972ba53fc62)
![スクリーンショット 2017-10-29 12.48.24.png](https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.amazonaws.com%2F0%2F170564%2Fb304cbf0-aca2-ff4e-6dd7-916e52ff02eb.png?ixlib=rb-4.0.0&auto=format&gif-q=60&q=75&s=509b52489bb29863f3bed8e13926b388)
を
で微分する部分が要するにシグモイド関数の微分のことなので、
![スクリーンショット 2017-10-29 12.48.40.png](https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.amazonaws.com%2F0%2F170564%2Ffc3bfe0e-8e62-4d58-a6b2-ed5ac9ced611.png?ixlib=rb-4.0.0&auto=format&gif-q=60&q=75&s=af48bb19e6d51079736394f48fd79205)
結果をかけあわせて、
![スクリーンショット 2017-10-29 12.48.46.png](https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.amazonaws.com%2F0%2F170564%2F8cc1ab22-e8ba-2de2-60b6-6eeb189c10d9.png?ixlib=rb-4.0.0&auto=format&gif-q=60&q=75&s=464b7ad2dd4885ade07b8341f4156522)
![スクリーンショット 2017-10-29 12.48.52.png](https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.amazonaws.com%2F0%2F170564%2Fd9e79eb4-b98d-a860-618a-ae347989fc87.png?ixlib=rb-4.0.0&auto=format&gif-q=60&q=75&s=94b6bbaf2d74b7b14d553b930fe2214f)
あとは、この式からパラメータ更新式を導き出すだけ。今は最大化することが目的なので、微分した結果の符号と同じ方向に動かさないといけない。
![スクリーンショット 2017-10-29 12.49.01.png](https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.amazonaws.com%2F0%2F170564%2Fad93bdf7-1d59-8a16-2472-1c69ce556365.png?ixlib=rb-4.0.0&auto=format&gif-q=60&q=75&s=aab918d03d668c158621c6c47419d214)
ηの前と、シグマの中の符号を入れ替えて、回帰の時と符号を合わせるようにして、次のようにも書ける。
##線形分離不可能
ロジスティック回帰を線形分離不可能な問題に適用する。
線形分離不可能な問題も、曲線であれば分類はできる。つまり次数を増やす必要がある。
のとき、
θが以下のようなベクトルだったときのグラフの形を考えると、
θをとりあえず代入して、
よって、となる。
グラフに書くと次のようになる。
このようにして、線形分離不可能な問題を解いて行く。
(今回はパラメータθがまだ適切ではないので、データを正しく分類できていない。)
例えば、好きなように次数を増やして、複雑な形の決定境界にすることもできる。