機械学習のための数学メモ #2 （回帰）

学び始めで頭の整理でやってます、間違っていたり何かありましたら遠慮なくご指摘お願いしますm(__)m
#回帰

回帰モデルは、連続値をとる目的変数を予測するために使用される。
このため、変数間の関係を理解したり、データのトレンドを評価したり、予報を作成するなどの形で応用されたり、科学のさまざまな問題に取り組んだりするのに適している。
（例：企業の今後数カ月間の売上を予測するなど。）

まずは、単変量の線形回帰の話から:relaxed:
単変量の線形回帰の目的は、単一の特徴量（説明変数x）と連続値の応答（目的変数y）との関係をモデルとして表現すること。
##最小二乗法/目的関数/最適化問題
下図で、x=200のときのyの値を知りたいとき
<img width="244" alt="スクリーンショット 2017-10-29 11.18.03.png" src="https://qiita-image-store.s3.amazonaws.com/0/170564/07ae0db8-a30d-96fd-5780-9211eb0dea6f.png">

以下のような１次関数をひくと予測できる。
<img width="241" alt="スクリーンショット 2017-10-29 11.18.23.png" src="https://qiita-image-store.s3.amazonaws.com/0/170564/c428fd2c-347a-883d-5a01-3f18cf8a4d5d.png">

<img width="143" alt="スクリーンショット 2017-10-29 11.32.31.png" src="https://qiita-image-store.s3.amazonaws.com/0/170564/4180821a-b183-532e-7970-18aa4d1013e8.png">のとき、パラメータ*θ*の値を調整することで、予測精度の高いグラフを描くことができる。

したがって、パラメータ*θ*を巧みに調整することが予測精度を上げる鍵となる。
また、点(y)とグラフのy軸(*f(x)*)が同じとき、オフセットまたは残差（回帰直線からサンプル点への予測の誤差）は0であり、一番理想的。
<img width="59" alt="スクリーンショット 2017-10-29 11.37.45.png" src="https://qiita-image-store.s3.amazonaws.com/0/170564/63e5d1f2-e694-5bfa-71cd-9fac601887cd.png">
<img width="80" alt="スクリーンショット 2017-10-29 11.38.27.png" src="https://qiita-image-store.s3.amazonaws.com/0/170564/6b1d5bb7-b571-98ed-5a4e-d2a3d5a33c1c.png">
ただし、それはなかなか実現が難しいので、これから誤差を可能な限り小さくしていく（**最小二乗法**）。
そして、この最も適合する直線は**回帰直線**という。

<img width="257" alt="スクリーンショット 2017-10-29 11.41.35.png" src="https://qiita-image-store.s3.amazonaws.com/0/170564/0b6b912f-5953-178b-89c6-4a7c27eb3e8c.png">
*E(θ)*は**目的関数**というもので、学習データがn個あるとき、学習データごとの誤差の和を表している。
**最適化問題**では、この*E(θ)*の値が一番小さくなるような*θ*を求めるのを目的とする。

Q. 二乗しているのは何故か？
各学習データとの誤差同士の相殺を避けるため。

Q. 1/2しているのは何故か？
この1/2は、この後の計算結果を鑑みての便宜上つけた定数。
正の定数をかけても、グラフの幅が変わるだけで、最小値に影響はなく、最適化問題において、定数を勝手に付け加えても結果は同じ。

では、具体的に、どのようにして最適な*θ*を求めることができるか？
結論は、先ほどの目的関数を微分して最小値を求める。

例えば、以下のような２次関数があったとする。（目的関数も２次関数）
<img width="232" alt="スクリーンショット 2017-10-29 12.02.37.png" src="https://qiita-image-store.s3.amazonaws.com/0/170564/ab9acf40-4b88-060c-368f-b3126de60238.png">

微分すると、次のようになる。
<img width="135" alt="スクリーンショット 2017-10-29 12.02.47.png" src="https://qiita-image-store.s3.amazonaws.com/0/170564/a0f37089-b7fc-12a2-99dd-47792db3c0f9.png">

導関数（微分した後の関数）の符号を見てみると、次のようになる。
<img width="404" alt="スクリーンショット 2017-10-29 12.03.22.png" src="https://qiita-image-store.s3.amazonaws.com/0/170564/e819d7f6-4110-0d27-cf74-9beba2c9d0f6.png">
x=3のとき、xを減らすと*g(x)*は最小になる。
x=-1のとき、xを増やすと*g(x)*は最小になる。

**最急降下法or勾配降下法**は、導関数の符号と逆の方向にずらし、最小値を見つけること。

それは次のような式で表すことができる。
<img width="148" alt="スクリーンショット 2017-10-29 12.13.22.png" src="https://qiita-image-store.s3.amazonaws.com/0/170564/f9bd87a6-654d-8e1e-05c6-d16462b4b236.png">

Q. 「A := B」という書き方について
AをBによって定義するという意味。
新しいxを、1つ前の古いxを使って定義しているということ。

Q. η（イータ）について
ηは正の定数で、**学習率**を表す。
学習率の大小によって、最小値にたどり着くまでの更新回数が変わる。
学習率を変えることで、収束の速さが変わったり、収束せずに発散したりする。

具体的に、２つ例を用意する。
１つ目は、ηの値が大きすぎる場合
２つ目は、ηの値が小さすぎる場合

例１（ηの値が大きすぎる場合）：
η=1, x=3のとき、x := x-η(2x-2)なので、
<img width="281" alt="スクリーンショット 2017-10-29 12.20.04.png" src="https://qiita-image-store.s3.amazonaws.com/0/170564/c3974b35-9fff-24be-2867-7ec1e7842693.png">となり、以下のように、3と-1をループする。

<img width="232" alt="スクリーンショット 2017-10-29 12.19.16.png" src="https://qiita-image-store.s3.amazonaws.com/0/170564/9f5be2e6-28f9-a905-bc8f-2d7a08d49be1.png">

例2（ηの値が小さすぎる場合）：η=0.1, x=3のとき、
<img width="309" alt="スクリーンショット 2017-10-29 12.20.33.png" src="https://qiita-image-store.s3.amazonaws.com/0/170564/cdd6e3cc-8a2b-8024-5f9b-66f64dc80bac.png">

<img width="232" alt="スクリーンショット 2017-10-29 12.19.40.png" src="https://qiita-image-store.s3.amazonaws.com/0/170564/69df366a-6735-98bb-bc73-1a21c204343a.png">
このようになり、移動量が小さくなって更新回数が増える。

勾配降下法について理解したところで、目的関数　<img width="254" alt="スクリーンショット 2017-10-29 12.21.35.png" src="https://qiita-image-store.s3.amazonaws.com/0/170564/494e3d21-bf38-b6a4-70b3-f2840f078a4b.png">に当てはめてみる。

目的関数で勾配降下法を使いたい時、目的関数は<img width="26" alt="スクリーンショット 2017-10-29 14.50.16.png" src="https://qiita-image-store.s3.amazonaws.com/0/170564/54da8357-8ac2-5a0f-6014-5601f0a70926.png">を含んでおり、<img width="11" alt="スクリーンショット 2017-10-29 14.51.07.png" src="https://qiita-image-store.s3.amazonaws.com/0/170564/5145915c-0065-c528-7b37-e71cd64bd66d.png">と<img width="10" alt="スクリーンショット 2017-10-29 14.51.27.png" src="https://qiita-image-store.s3.amazonaws.com/0/170564/3fe217d7-a166-78cf-7ff2-dfadb8676619.png">の２つのパラメータを持つ２変数関数であるため、普通の微分ではなく、偏微分する必要がある。
*g(x)*を*E*に置き換えて、偏微分した更新式は次のようになる。
<img width="137" alt="スクリーンショット 2017-10-29 12.21.55.png" src="https://qiita-image-store.s3.amazonaws.com/0/170564/80723dac-d941-b9e5-f64b-6bbf50bb438b.png">

合成関数の微分を使って、<img width="59" alt="スクリーンショット 2017-10-29 14.58.13.png" src="https://qiita-image-store.s3.amazonaws.com/0/170564/5e5286c6-7ca5-96d2-d7a2-ead1335d3470.png">のとき、<img width="164" alt="スクリーンショット 2017-10-29 12.22.11.png" src="https://qiita-image-store.s3.amazonaws.com/0/170564/6e00d8fb-3e9b-f312-c1eb-abaf11b4a174.png">

まず<img width="7" alt="スクリーンショット 2017-10-29 15.05.44.png" src="https://qiita-image-store.s3.amazonaws.com/0/170564/8ba88ff7-c60e-2d0e-cac8-817467c070b6.png">を<img width="8" alt="スクリーンショット 2017-10-29 15.04.38.png" src="https://qiita-image-store.s3.amazonaws.com/0/170564/f25318b3-5834-ecab-253b-407055bc8285.png">で微分する。
<img width="279" alt="スクリーンショット 2017-10-29 12.22.25.png" src="https://qiita-image-store.s3.amazonaws.com/0/170564/e8cd3a4c-7bc7-131f-d84a-819e51026439.png">

次に、<img width="8" alt="スクリーンショット 2017-10-29 15.04.38.png" src="https://qiita-image-store.s3.amazonaws.com/0/170564/e34d68c7-ab12-dff3-f924-f8b74a64afc0.png">を<img width="11" alt="スクリーンショット 2017-10-29 14.51.07.png" src="https://qiita-image-store.s3.amazonaws.com/0/170564/179467ef-eee0-675c-f0b9-8bd0bb250d92.png">で微分する。
<img width="129" alt="スクリーンショット 2017-10-29 15.09.35.png" src="https://qiita-image-store.s3.amazonaws.com/0/170564/1a30cd2d-3237-4bac-2e5a-269509c23ace.png">

それぞれの結果を掛け合わせて、<img width="11" alt="スクリーンショット 2017-10-29 14.51.07.png" src="https://qiita-image-store.s3.amazonaws.com/0/170564/97c36403-2727-92b4-2cce-38389f0f11ec.png">で微分した結果が求まる。<img width="8" alt="スクリーンショット 2017-10-29 15.04.38.png" src="https://qiita-image-store.s3.amazonaws.com/0/170564/ebc1a62d-8054-f2dd-300f-b9110c8eb981.png">は<img width="26" alt="スクリーンショット 2017-10-29 14.50.16.png" src="https://qiita-image-store.s3.amazonaws.com/0/170564/ce6127b9-bfcf-80a8-1107-d4dcbe8028a8.png">に戻しておく。

<img width="158" alt="スクリーンショット 2017-10-29 15.15.08.png" src="https://qiita-image-store.s3.amazonaws.com/0/170564/36462f98-406f-8f4e-6c02-da25e6729deb.png">

次は、<img width="10" alt="スクリーンショット 2017-10-29 14.51.27.png" src="https://qiita-image-store.s3.amazonaws.com/0/170564/5494e9d8-6897-efba-c39d-426eb94ffc7c.png">について微分する。
<img width="131" alt="スクリーンショット 2017-10-29 15.16.20.png" src="https://qiita-image-store.s3.amazonaws.com/0/170564/1427f197-8875-f692-fd8e-ac64572fe9f4.png">

<img width="8" alt="スクリーンショット 2017-10-29 15.04.38.png" src="https://qiita-image-store.s3.amazonaws.com/0/170564/6dc3e791-4a90-6510-7f67-cb13afdfdafa.png">を<img width="10" alt="スクリーンショット 2017-10-29 14.51.27.png" src="https://qiita-image-store.s3.amazonaws.com/0/170564/1a0ddeb4-6930-2e03-c84e-61dc3fa6707b.png">で微分すると<img width="123" alt="スクリーンショット 2017-10-29 15.18.21.png" src="https://qiita-image-store.s3.amazonaws.com/0/170564/9ec903b9-d5a3-2f29-d425-f34230317803.png">

つまり、<img width="7" alt="スクリーンショット 2017-10-29 15.05.44.png" src="https://qiita-image-store.s3.amazonaws.com/0/170564/1a3b7791-8268-fa7f-2b99-3fd89a03ce5f.png">を<img width="10" alt="スクリーンショット 2017-10-29 14.51.27.png" src="https://qiita-image-store.s3.amazonaws.com/0/170564/c4dc4b26-bd2a-043a-f1dd-1ad201e0ef43.png">で微分した結果は<img width="216" alt="スクリーンショット 2017-10-29 12.23.48.png" src="https://qiita-image-store.s3.amazonaws.com/0/170564/7648231f-5134-7672-0bd8-643684f50b6c.png">となる。

最終的に、以下のようになる。
<img width="259" alt="スクリーンショット 2017-10-29 12.24.03.png" src="https://qiita-image-store.s3.amazonaws.com/0/170564/f27ddc31-39e0-ccb9-feb3-1c6cfdb57498.png">

この式に従って、<img width="11" alt="スクリーンショット 2017-10-29 14.51.07.png" src="https://qiita-image-store.s3.amazonaws.com/0/170564/fd84d94a-2294-671c-4b2e-8a4911b19883.png">と<img width="10" alt="スクリーンショット 2017-10-29 14.51.27.png" src="https://qiita-image-store.s3.amazonaws.com/0/170564/1384e411-fea4-4a92-4b93-5924b4888408.png">を更新していけば、最適な１次関数<img width="26" alt="スクリーンショット 2017-10-29 14.50.16.png" src="https://qiita-image-store.s3.amazonaws.com/0/170564/decde178-1ebf-4701-aadf-9222bc83dff9.png">を求めることができる。


##多項式回帰/過学習
直線よりも、曲線の方が予測精度の高いグラフを導き出せることがあり、
<img width="290" alt="スクリーンショット 2017-10-29 12.25.18.png" src="https://qiita-image-store.s3.amazonaws.com/0/170564/a605d046-a235-d203-58d6-6b0853510a9a.png">
２次関数やそれ以上の次数をもった式を使うことができる。
<img width="244" alt="スクリーンショット 2017-10-29 12.26.29.png" src="https://qiita-image-store.s3.amazonaws.com/0/170564/40716257-1f74-f2a7-3a76-dae7074f4a67.png">
解きたい問題に対して、臨機応変にどのようなグラフが最も予測精度が高くなるかを考える。
<img width="362" alt="スクリーンショット 2017-10-29 12.26.44.png" src="https://qiita-image-store.s3.amazonaws.com/0/170564/156aebf8-f6f3-92c5-2a37-f97b8569d202.png">次元を増やせば増やすほどフィットしやすくなるが、**過学習**というデメリットが起きることもある。

<img width="244" alt="スクリーンショット 2017-10-29 12.26.29.png" src="https://qiita-image-store.s3.amazonaws.com/0/170564/40716257-1f74-f2a7-3a76-dae7074f4a67.png">
の式で、パラメータとして<img width="11" alt="スクリーンショット 2017-10-29 15.34.24.png" src="https://qiita-image-store.s3.amazonaws.com/0/170564/b623496d-a0a3-aa47-c294-a5406355f3a6.png">が増えたので、目的関数を<img width="11" alt="スクリーンショット 2017-10-29 15.34.24.png" src="https://qiita-image-store.s3.amazonaws.com/0/170564/16605c72-af8c-37af-2836-c5bb70ef8878.png">で偏微分する。

<img width="198" alt="スクリーンショット 2017-10-29 12.27.01.png" src="https://qiita-image-store.s3.amazonaws.com/0/170564/15eb3a1e-6bcc-3e5d-44c0-0d4f59ca7a42.png">

結局、パラメータの更新式は以下のようになる。パラメータが増えていっても同じように更新式を求めることができる。
<img width="264" alt="スクリーンショット 2017-10-29 12.27.24.png" src="https://qiita-image-store.s3.amazonaws.com/0/170564/05139ae4-b831-4c7b-1ca1-3545a6fd6881.png">
このように、多項式の次数を増やした関数を使うものは、多項式回帰と呼ばれる。

##重回帰
<img width="363" alt="スクリーンショット 2017-10-29 12.27.40.png" src="https://qiita-image-store.s3.amazonaws.com/0/170564/95fbe217-6556-57a1-d0a3-aa7362be4b01.png">
このように、関数が複数の変数を受け取る場合、<img width="49" alt="スクリーンショット 2017-10-29 15.40.07.png" src="https://qiita-image-store.s3.amazonaws.com/0/170564/e3f36ed0-8670-dac8-ea92-bcebf2699ee6.png">について目的関数をそれぞれ偏微分して、パラメータを更新していく。

変数がn個ある場合、<img width="364" alt="スクリーンショット 2017-10-29 12.28.00.png" src="https://qiita-image-store.s3.amazonaws.com/0/170564/92c47f4f-07aa-18a4-113a-4a48f23f3a49.png">で次のように表すことができる。
<img width="191" alt="スクリーンショット 2017-10-29 12.28.13.png" src="https://qiita-image-store.s3.amazonaws.com/0/170564/3d3b6a2f-70cd-d004-c22a-1c9fb5ebe0d8.png">

次元を調整するために、１を足す。
<img width="201" alt="スクリーンショット 2017-10-29 12.28.31.png" src="https://qiita-image-store.s3.amazonaws.com/0/170564/3bd2f34c-e891-e82a-2741-e0d9fe4b65a0.png">

<img width="11" alt="スクリーンショット 2017-10-29 14.51.07.png" src="https://qiita-image-store.s3.amazonaws.com/0/170564/6b2aa9f7-0680-71cc-7505-88a78d15e455.png">にならって<img width="33" alt="スクリーンショット 2017-10-29 15.45.51.png" src="https://qiita-image-store.s3.amazonaws.com/0/170564/8ef79247-d9e7-dee7-02e5-0288440f282c.png">とすると<img width="268" alt="スクリーンショット 2017-10-29 12.28.45.png" src="https://qiita-image-store.s3.amazonaws.com/0/170564/fd94aa36-f3a1-b267-2304-162e40c7709d.png">

次に*θ*を転置したものとxを掛けると、<img width="369" alt="スクリーンショット 2017-10-29 12.29.04.png" src="https://qiita-image-store.s3.amazonaws.com/0/170564/7abae847-396f-8679-d6a5-80839b1d5fb4.png">となり、<img width="364" alt="スクリーンショット 2017-10-29 12.28.00.png" src="https://qiita-image-store.s3.amazonaws.com/0/170564/92c47f4f-07aa-18a4-113a-4a48f23f3a49.png">と同じになる。

また、ベクトルを使うと次のように表すことができる。
<img width="135" alt="スクリーンショット 2017-10-29 12.29.18.png" src="https://qiita-image-store.s3.amazonaws.com/0/170564/4ddc9ffb-c5f6-4b67-6b98-6b6f91c33422.png">

パラメータの更新式は、<img width="163" alt="スクリーンショット 2017-10-29 12.29.31.png" src="https://qiita-image-store.s3.amazonaws.com/0/170564/7ccaa2cb-fab5-3337-1517-ae65dcc1bb2e.png"><img width="8" alt="スクリーンショット 2017-10-29 15.04.38.png" src="https://qiita-image-store.s3.amazonaws.com/0/170564/2a3f35e2-8be5-adce-a450-68bfc57adae0.png">を<img width="11" alt="スクリーンショット 2017-10-29 15.50.16.png" src="https://qiita-image-store.s3.amazonaws.com/0/170564/4505cb05-1095-caa7-123b-16402c447d27.png">で微分して、<img width="266" alt="スクリーンショット 2017-10-29 12.29.43.png" src="https://qiita-image-store.s3.amazonaws.com/0/170564/364f0f0f-8e05-5085-bebf-54dc8fa3b867.png">

よって、j番目のパラメータの更新式は次のようになる。ベクトルを使うことで、更新式を１つにまとめることができる。

<img width="368" alt="スクリーンショット 2017-10-29 12.29.55.png" src="https://qiita-image-store.s3.amazonaws.com/0/170564/12f45f4d-d2bc-5851-474d-66f575b99c87.png">
このように、複数の変数を使ったものを**重回帰**という。

##確率的勾配降下法
普通の勾配降下法で、学習率ηが小さすぎると、更新回数が多くなり、学習率ηが大きすぎると、収束しないという欠点を学んだが、もう１つ**局所解**に捕まるという欠点もある。
次のような関数があった時に、<img width="278" alt="スクリーンショット 2017-10-29 12.30.16.png" src="https://qiita-image-store.s3.amazonaws.com/0/170564/931f7ae1-75be-b15a-009d-3ebb78bf35a8.png">

初期値によって、最小値が変わるということが以下の２つの図からわかる。
<img width="276" alt="スクリーンショット 2017-10-29 12.30.35.png" src="https://qiita-image-store.s3.amazonaws.com/0/170564/d48b9fa4-7acf-f1c3-6b6b-c5f838099622.png">
<img width="292" alt="スクリーンショット 2017-10-29 12.30.45.png" src="https://qiita-image-store.s3.amazonaws.com/0/170564/dfc7ec8a-ff3b-9670-2c4a-718ac88829a9.png">

次の更新式は、普通の勾配降下法のパラメータ更新式。この式では全ての学習データの誤差を使っている。
<img width="372" alt="スクリーンショット 2017-10-29 12.30.55.png" src="https://qiita-image-store.s3.amazonaws.com/0/170564/ed44f2d4-05ce-80fb-9765-8ab7f43362fd.png">
それに対して、確率的勾配降下法では、ランダムに学習データを１つ選んで、それをパラメータの更新に使う。
この式のkはランダムに選ばれたインデックスのこと。

普通の勾配降下法で１回パラメータを更新する間に、確率的勾配降下法ではn回パラメータが更新でき、学習データをランダムに選んでその時点での勾配を使ってパラメータを更新していくから、目的関数の局所解に捕まりにくい。
ランダムに選ぶが必ず収束する。
<img width="327" alt="スクリーンショット 2017-10-29 12.31.01.png" src="https://qiita-image-store.s3.amazonaws.com/0/170564/af978fc1-a999-cfbf-df18-365313da6c6d.png">

##ミニバッチ法
学習データをランダムにm個だけ選んでパラメータを更新するやり方もある。
ランダムにm個だけ選ばれた学習データのインデックスの集合を*K*とおくと、次のようにパラメータを更新する（**ミニバッチ法**）。
<img width="367" alt="スクリーンショット 2017-10-29 12.31.09.png" src="https://qiita-image-store.s3.amazonaws.com/0/170564/a78984e7-5cb2-b415-5959-6226264871a5.png">

##探索的データ解析
探索的データ解析は、機械学習モデルのトレーニングを行う前の、最初の重要なステップの１つ。
探索的データ解析によって、外れ値、データの分布、特徴量の間の関係を視覚的に検出するのに便利になる。

まず、**散布図行列**というものをつくる。
散布図行列を利用すれば、データセットの特徴量のペアに対する相関関係を１つの平面上で可視化できる。

散布図行列プロットには、seabornライブラリのpairplot関数を使用する。
（seabornはmatplotlibに基づいて統計グラフを描画するためのpythonライブラリのこと。）

続く


[機械学習のための数学メモ #3 （分類）](https://qiita.com/anzunba/items/9eadf8fa145281fd28bc)