デジタル・デザイン・ラボラトリーな日々

アラフィフプログラマーが数学と物理と英語を基礎からやり直す。https://qiita.com/yaju

機械学習に使われる微分の数式を理解してみる(勾配降下法:確率的勾配法)

はじめに

前回の記事の続きとなります。
yaju3d.hatenablog.jp

最急降下法確率的勾配降下法の違いについては、以前に記事を書きました。
yaju3d.hatenablog.jp

参考

やる夫で学ぶ機械学習 - 多項式回帰と重回帰 - · けんごのお屋敷

パラメーター更新の式

最急降下法

前回、重回帰で求めたパラメーター更新の式です。
\displaystyle \theta_j := \theta_j - \eta \sum_{i=1}^n \Biggl(f_{\theta}(x^{(i)})-y^{(i)}\Biggr)x_j^{(i)}

最急降下法は学習データのすべての誤差の合計を取ってからパラメーターを更新します。学習データが多いと計算コストがとても大きくなってしまいます。また、学習データが増えるたびに全ての学習データで再学習が必要となってしまいます。

確率的勾配法

\theta_j := \theta_j - \eta \Biggl(f_{\theta} ({x}^{(k)}) - y^{(k)}\Biggr){x_j}^{(k)}
(式中のkは、パラメーター更新毎にランダムに選ばれたインデックス)

大きな違いとして、確率的勾配降下法ではシグマ\sum (1~nまで合計)が取れています。
その分、計算コストは少なくなる。

確率的勾配降下法は学習データをシャッフルした上で学習データの中からランダムに1つを取り出して誤差を計算し、パラメーターを更新をします。勾配降下法ほどの精度は無いが増えた分だけの学習データのみで再学習する(重みベクトルの初期値は前回の学習結果を流用)ため再学習の計算量が圧倒的に低くなります。

ミニバッチ確率的勾配降下法

\displaystyle \theta_j := \theta_j - \eta \sum_{k\in K} \Biggl(f_{\theta} ({x}^{(k)}) - y^{(k)}\Biggr){x_j}^{(k)}

ここでシグマが付くのですが、これはインデックスの集合となります。
たとえば学習データが100個あると考えた時に、m=10 だったら、K={61,53,59,16,30,21,85,31,51,10} みたいにランダムに10個のインデックスの集合を作って、パラメーターの更新を繰り返すことになります。

ミニバッチ確率的勾配降下法最急降下法確率的勾配降下法の間を取ったような形となります。 最急降下法では時間がかかりすぎ、確率的勾配降下法では一つ一つのデータにかなり揺さぶられることになるので、学習データの中からランダムにいくつかのデータを取り出して誤差を計算、パラメーターを更新をします。このときの一回に取り出すデータの数をバッチサイズと呼びます。

視覚化

※注意 これまでやってきたのは最小2乗法を用いたものでした。この視覚化についてはロジスティクス回帰となっています。
最急降下法と確率的勾配法とミニバッチ確率的勾配降下法の違いを知るだけならいいのですが、プログラムの中身はパラメーター更新と一致しないです。

下記サイトでは、最急降下法と確率的勾配法とミニバッチ確率的勾配降下法の違いを視覚化されています。
sinhrks.hatenablog.com

これを、組み直ししてみました。 qiita.com

最後に

視覚化を組み直してみたのですが内容を見ないで単純に移植してみたようなものなので、今後は視覚化したのを説明していきたいですね。
その前に、内積ロジスティクス回帰などをやっていきます。
まだ数式とプログラムを組むイメージが頭の中で一致してないので理解度が足りてないですな。

機械学習に使われる微分の数式を理解してみる(重回帰)

はじめに

前回の記事の続きとなります。
yaju3d.hatenablog.jp

参考

やる夫で学ぶ機械学習 - 多項式回帰と重回帰 - · けんごのお屋敷

重回帰

前回の多項式回帰でも、変数 x が1つだけでした。
f_\theta(x) = \theta_0 + \theta_1x + \theta_2 x^{2} + \theta_3 x^{3} + \cdot + \theta_n x^{n}

機械学習をする上で実際に解きたい問題は変数 x が2つ以上の方が多いです。
変数が3つの場合
f_\theta(x_1,x_2,x_3) = \theta_0 + \theta_1 x_1 + \theta_2 x_2 + \theta_3 x_3

一般式

変数を n 個にした場合の一般式
f_\theta(x_1,\cdots,x_n) = \theta_0 + \theta_1 x_1 + \cdots + \theta_n x_n

列ベクトル化

先程の一般式を \theta_0x を列ベクトルとして定義してみます。
\theta = \begin{bmatrix}
\theta_0 \\
\theta_1 \\
\theta_2 \\
\vdots \\
\theta_n
\end{bmatrix}
\ \ \
\boldsymbol{x} = \begin{bmatrix}
x_1 \\
x_2 \\
\vdots \\
x_n
\end{bmatrix}

\thetax の次元数が違うので揃えます。
1を追加したとしても計算上は値が変わらない。\theta_0 \times 1 = \theta_0となるため。
\theta = \begin{bmatrix}
\theta_0 \\
\theta_1 \\
\theta_2 \\
\vdots \\
\theta_n
\end{bmatrix}
\ \ \
x = \begin{bmatrix}
1  \\
x_1 \\
x_2 \\
\vdots \\
x_n
\end{bmatrix}

もう一工夫する。x_0 = 1 と定義することで、すべて x とすることができる。

\theta = \begin{bmatrix}
\theta_0 \\
\theta_1 \\
\theta_2 \\
\vdots \\
\theta_n
\end{bmatrix}
\ \ \
x = \begin{bmatrix}
x_0  \\
x_1 \\
x_2 \\
\vdots \\
x_n
\end{bmatrix}
\ \ \
(x_0 = 1)

こうすることで、\theta を転置したものと x を掛けると次のように書ける。
\theta^{T} x = \theta_0 x_0 + \theta_1 x_1 + \theta_2 x_2 + \cdots + \theta_n x_n

これは一般式を x_0 = 1 としたものと同じになるわけです。
そして、すべて x としたことで簡潔した式に表現できるようになるのです。
f_\theta(x) = \theta^{T} x

更新式を求める

\thetaj 番目の要素を \theta_j とすると、E\theta_j偏微分した式

\displaystyle \frac{\partial u}{\partial \theta_j} = \frac{\partial u}{\partial v} \cdot \frac{\partial v}{\partial \theta_j}

※誤解されないように最初に説明しておくと、x^{(i)}y^{(i)}i 乗という意味ではなくて、i 番目の学習用データを参照する意味である。

uv微分

uv微分するところは前々回までと同じ(再掲)

\displaystyle \frac{\partial u}{\partial v} =  \frac{\partial}{\partial v} \Biggl(\frac{1}{2}\sum_{i=1}^n \left(y^{(i)} - v\right)^{2} \Biggr)

=\displaystyle \frac{1}{2}\sum_{i=1}^n \Biggl(\frac{\partial}{\partial v}\left(y^{(i)} - v\right)^{2} \Biggr)

=\displaystyle \frac{1}{2}\sum_{i=1}^n \Biggl(\frac{\partial}{\partial v}\left(y^{(i)^{2}} - 2y^{(i)}v+v^{2}\right) \Biggr)

v微分するので、y^{(i)^{2}} は計算対象外なので除外します。

=\displaystyle \frac{1}{2}\sum_{i=1}^n \left(-2y^{(i)}+2v\right)

共通因数の -2 を前に出します。
=\displaystyle \frac{1}{2}\sum_{i=1}^n -2\left(y^{(i)}-v\right)

こうすると \displaystyle \frac{1}{2} と相殺できます。
=\displaystyle \sum_{i=1}^n -\left(y^{(i)}-v\right)

このままでもいいですが、マイナス符号を先頭に付けないようにもう一工夫します。
足し算を入れ替えても結果は変わらないので、 - y^{(i)}v を入れ替えます。

=\displaystyle \sum_{i=1}^n \left(v - y^{(i)}\right)

v=f_{\theta}(x)の定義を元に戻す。

=\displaystyle \sum_{i=1}^n \Biggl(f_{\theta}(x^{(i)})-y^{(i)}\Biggr)

v\theta_j微分

v\theta_j微分する。
\displaystyle \frac{\partial v}{\partial \theta_j} = \frac{\partial}{\partial \theta_j}(\theta^{T} x) \\
= \displaystyle \frac{\partial}{\partial \theta_j}(\theta_0 x_0 + \theta_1 x_1 + \theta_2 x_2 + \cdots + \theta_n x_n) \\
= x_j

結果を掛ける

合成関数の微分に従って、それぞれの結果を掛ける。
\displaystyle \frac{\partial u}{\partial \theta_j} = \frac{\partial u}{\partial v} \cdot \frac{\partial v}{\partial \theta_j}

=\displaystyle \sum_{i=1}^n \Biggl(f_{\theta}(x^{(i)})-y^{(i)}\Biggr) \cdot x_j^{(i)}

最終的な更新式

最終的なパラメーターの更新式は下記のようになります。

\displaystyle \theta_j := \theta_j - \eta \sum_{i=1}^n \Biggl(f_{\theta}(x^{(i)})-y^{(i)}\Biggr)x_j^{(i)}

最後に

今回はここまで、次回は確率的勾配法となります。

機械学習に使われる微分の数式を理解してみる(多項式回帰)

はじめに

前回の記事の続きとなります。
yaju3d.hatenablog.jp

最終的な更新式を求めたところまでやりました。
パラメータ  \theta_0 \theta_1 の更新式は、最終的に下記のようになります。

\displaystyle \theta_0 := \theta_0 - \eta \sum_{i=1}^n \Biggl(f_{\theta}(x^{(i)})-y^{(i)}\Biggr)

\displaystyle \theta_1 := \theta_1 - \eta \sum_{i=1}^n \Biggl(f_{\theta}(x^{(i)})-y^{(i)}\Biggr)x^{(i)}

参考

やる夫で学ぶ機械学習 - 多項式回帰と重回帰 - · けんごのお屋敷

多項式回帰

プロットしたデータにフィットさせる際に1次関数の場合は形が直線にしかなりません。
しかし、場合によっては曲線の方がプロットしたデータにフィットする。
f:id:Yaju3D:20190413234724p:plain

これは関数 f_\theta(x) を2次関数として定義することで実現できる。

f_\theta(x) = \theta_0 + \theta_1x + \theta_2 x^{2}

もっと大きな次数にすることも出来る。その場合はより複雑な曲線に対応できるようになる。

f_\theta(x) = \theta_0 + \theta_1x + \theta_2 x^{2} + \theta_3 x^{3} + \cdot + \theta_n x^{n}

しかし、次数を増やせば増やすほどいい感じになるわけではない。確かにフィットするようにはなるけど、過学習と呼ばれる別の問題が発生するようになる。

更新式を求める

前回と同じように v\theta_2偏微分して更新式を求めます。
\theta_0\theta_1 x は計算対象外なので除外します。残った \theta_2 x^{2}微分して x^{2} になります。

\displaystyle \frac{\partial v}{\partial \theta_2} = \frac{\partial}{\partial \theta_2} \left(\theta_0 + \theta_1 x + \theta_2 x^{2} \right) = x^{2}

最終的な更新式

最終的なパラメーターの更新式は下記のようになります。

\displaystyle \theta_0 := \theta_0 - \eta \sum_{i=1}^n \Biggl(f_{\theta}(x^{(i)})-y^{(i)}\Biggr)

\displaystyle \theta_1 := \theta_1 - \eta \sum_{i=1}^n \Biggl(f_{\theta}(x^{(i)})-y^{(i)}\Biggr)x^{(i)}

\displaystyle \theta_2 := \theta_2 - \eta \sum_{i=1}^n \Biggl(f_{\theta}(x^{(i)})-y^{(i)}\Biggr)x^{(i)^{2}}

これはパラメーターが、 \theta_3\theta_4\cdot と増えていっても同じような更新式になります。
ということは、j 番目のパラメーターの更新式は下記のようにできる。
x^{0} = 1 となることを利用する。

\displaystyle \theta_j := \theta_j - \eta \sum_{i=1}^n \Biggl(f_{\theta}(x^{(i)})-y^{(i)}\Biggr)x^{(i)^{j}}

このように多項式の次数を増やした関数を使うものは、多項式回帰と呼びます。

※誤解されないように説明しておくと、x^{(i)}y^{(i)}i 乗という意味ではなくて、i 番目の学習用データを参照する意味である。

最後に

今回はここまで、次回は重回帰となります。

機械学習に使われる微分の数式を理解してみる(勾配降下法:最急降下法)

はじめに

前回の記事で、シグモイド関数微分を行いました。
yaju3d.hatenablog.jp

今回は、偏微分を含んだ微分を理解していきます。
本とかだと分かっている人向けなので展開式を省略されてしまうのですが、私はあえて分かりやすく展開式を書きたいと思っています。

参考

やる夫で学ぶ機械学習 - 単回帰問題 - · けんごのお屋敷

勾配降下法

yaju3d.hatenablog.jp

数値解析の分野では勾配降下法を最急降下法と呼びますが、勾配降下法の中にもいくつかの方法が存在します。

最急降下法とは

最急降下法は学習データのすべての誤差の合計を取ってからパラメーターを更新します。学習データが多いと計算コストがとても大きくなってしまいます。また、学習データが増えるたびに全ての学習データで再学習が必要となってしまいます。

目的関数の微分方法

目的関数 最小2乗法
\displaystyle E(\theta)=\frac{1}{2}\sum_{i=1}^n \left(y^{(i)} - f_{\theta}(x^{(i)})\right)^{2}

※誤解されないように最初に説明しておくと、x^{(i)}y^{(i)}i 乗という意味ではなくて、i 番目の学習用データを参照する意味である。

この目的関数は、f_{\theta}(x) を含んでいて、今回 f_{\theta}(x) は、\theta_0\theta_1 の2つのパラメーターを持っているとします。
これは\theta_0\theta_1の2変数を持つ2変数関数になるので、普通の微分ではなく偏微分になります。
偏微分とは、n 変数関数のある一つの変数以外の n-1 個の変数の値を固定し、残りの 1 つの変数について関数を微分することです。
mathtrain.jp

更新式を求める

更新式は下記の2つになります。
\displaystyle\ \theta_0 := \theta_0 - \eta\frac{\partial E}{\partial \theta_0}…①

\displaystyle\ \theta_1 := \theta_1 - \eta\frac{\partial E}{\partial \theta_1}…②

実際に①を偏微分してみましょう。これには合成関数の微分を使うといいです。

合成関数の微分
fg という関数があったとき、これらの合成関数 f(g(x))x微分する場合は下記式になり、これを使えば簡単になる。
\displaystyle \frac{df}{dx}=\frac{df}{dg} \cdot \frac{dg}{dx}

これを目的関数に適用します。
E(\theta) の中に  f_{\theta}(x) が出てきて、  f_{\theta}(x) の中に \theta_0 が出てきます。
それを下記のように考えてみます。

u=E( \theta_0)

v=f_{\theta}(x)

すると、こうやって段階的に微分が出来ます。
合成関数の微分
\displaystyle \frac{\partial u}{\partial \theta_0} = \frac{\partial u}{\partial v} \cdot \frac{\partial v}{\partial \theta_0}

まずは uv微分するところから計算してみます。

\displaystyle \frac{\partial u}{\partial v} =  \frac{\partial}{\partial v} \Biggl(\frac{1}{2}\sum_{i=1}^n \left(y^{(i)} - v\right)^{2} \Biggr)

=\displaystyle \frac{1}{2}\sum_{i=1}^n \Biggl(\frac{\partial}{\partial v}\left(y^{(i)} - v\right)^{2} \Biggr)

=\displaystyle \frac{1}{2}\sum_{i=1}^n \Biggl(\frac{\partial}{\partial v}\left(y^{(i)^{2}} - 2y^{(i)}v+v^{2}\right) \Biggr)

v微分するので、y^{(i)^{2}} は計算対象外なので除外します。

=\displaystyle \frac{1}{2}\sum_{i=1}^n \left(-2y^{(i)}+2v\right)

共通因数の -2 を前に出します。
=\displaystyle \frac{1}{2}\sum_{i=1}^n -2\left(y^{(i)}-v\right)

こうすると \displaystyle \frac{1}{2} と相殺されて、微分した後の式が簡単になります。
それが最初に \displaystyle \frac{1}{2} を掛けていた理由です。 =\displaystyle \sum_{i=1}^n -\left(y^{(i)}-v\right)

このままでもいいですが、マイナス符号を先頭に付けないようにもう一工夫します。
足し算を入れ替えても結果は変わらないので、 - y^{(i)}v を入れ替えます。

=\displaystyle \sum_{i=1}^n \left(v - y^{(i)}\right)

次に  v \theta_0微分します。
\theta_1 x は計算対象外なので除外します。残った \theta_0微分して 1 になります。

\displaystyle \frac{\partial v}{\partial \theta_0} = \frac{\partial}{\partial \theta_0} \left(\theta_0 + \theta_1 x\right) = 1

合成関数の微分に従って、それぞれの結果を掛けてあげれば、  \theta_0微分した結果が出る。

\displaystyle \frac{\partial u}{\partial \theta_0} = \frac{\partial u}{\partial v} \cdot \frac{\partial v}{\partial \theta_0}

=\displaystyle \sum_{i=1}^n \left(v - y^{(i)}\right)  \cdot 1

v=f_{\theta}(x)の定義を元に戻す。

=\displaystyle \sum_{i=1}^n \Biggl(f_{\theta}(x^{(i)})-y^{(i)}\Biggr)

次は、②の  \theta_1 について微分します。

\displaystyle \frac{\partial u}{\partial \theta_1} = \frac{\partial u}{\partial v} \cdot \frac{\partial v}{\partial \theta_1}

 u v微分するところは同じ展開なので省略しても良かったのですが、あえて書いておきます。

\displaystyle \frac{\partial u}{\partial v} =  \frac{\partial}{\partial v} \Biggl(\frac{1}{2}\sum_{i=1}^n \left(y^{(i)} - v\right)^{2} \Biggr)

=\displaystyle \frac{1}{2}\sum_{i=1}^n \Biggl(\frac{\partial}{\partial v}\left(y^{(i)} - v\right)^{2} \Biggr)

=\displaystyle \frac{1}{2}\sum_{i=1}^n \Biggl(\frac{\partial}{\partial v}\left(y^{(i)^{2}} - 2y^{(i)}v+v^{2}\right) \Biggr)

v微分するので、y^{(i)^{2}} は計算対象外なので除外します。

=\displaystyle \frac{1}{2}\sum_{i=1}^n \left(-2y^{(i)}+2v\right)

共通因数の -2 を前に出します。
=\displaystyle \frac{1}{2}\sum_{i=1}^n -2\left(y^{(i)}-v\right)

こうすると \displaystyle \frac{1}{2} と相殺できます。
=\displaystyle \sum_{i=1}^n -\left(y^{(i)}-v\right)

このままでもいいですが、マイナス符号を先頭に付けないようにもう一工夫します。
足し算を入れ替えても結果は変わらないので、 - y^{(i)}v を入れ替えます。

=\displaystyle \sum_{i=1}^n \left(v - y^{(i)}\right)

次に  v \theta_1微分する部分だけを計算する。
\theta_0 は計算対象外なので除外します。残った \theta_1 x微分して x になります。

\displaystyle \frac{\partial v}{\partial \theta_1} = \frac{\partial}{\partial \theta_1}(\theta_0 + \theta_1 x) = x

合成関数の微分に従って、それぞれの結果を掛けてあげれば、  \theta_1微分した結果が出る。
\displaystyle \frac{\partial u}{\partial \theta_1} = \frac{\partial u}{\partial v} \cdot \frac{\partial v}{\partial \theta_1}

=\displaystyle \sum_{i=1}^n\left(v - y^{(i)}\right) \cdot x^{(i)}

v=f_{\theta}(x)の定義を元に戻す。

=\displaystyle \sum_{i=1}^n \Biggl(f_{\theta}(x^{(i)})-y^{(i)}\Biggr)x^{(i)}

最終的な更新式

パラメータ  \theta_0 \theta_1 の更新式は、最終的に下記のようになります。

\displaystyle \theta_0 := \theta_0 - \eta \sum_{i=1}^n \Biggl(f_{\theta}(x^{(i)})-y^{(i)}\Biggr)

\displaystyle \theta_1 := \theta_1 - \eta \sum_{i=1}^n \Biggl(f_{\theta}(x^{(i)})-y^{(i)}\Biggr)x^{(i)}

最後に

長くなったので今回はここまで、次回は多項式回帰となります。

機械学習に使われる微分の数式を理解してみる(シグモイド関数)

はじめに

機械学習関連の本や記事を見るたびに出てくる微分の数式、これを理解しないと自分は先に進めない。
しばらくはシリーズで取り組みたいと思います。

以前の記事で、シグモイド関数微分を導出してみました。再度、一から見直していきます。
yaju3d.hatenablog.jp

シグモイド関数微分

前提

sigmoid(x) = \displaystyle \frac{1}{1 + e^{-x}}

結論

f(x)=sigmoid(x) とした時、
f(x)′=f(x)(1−f(x))

導出

前回の記事では、逆数の微分公式をそのまま使用しました。
\displaystyle \left(\frac {1}{f}\right)^{\prime}=\frac{−f^{\prime}}{f^{2}} です。

逆数の微分公式

まずは、 逆数の微分公式がなぜこうなるのか、どこから2乗がでてくるのかを理解していきます。

その前に分子に分数を含む式の計算を理解しておく必要があります。
manapedia.jp

分子に分数を含む式
\displaystyle \frac{\left(\frac{1}{2}\right)}{4}
これは、下記のように変更できます。
\displaystyle \frac{\left(\frac{1}{2}\right)}{4}  = \frac{1}{2}  \div 4 = \frac{1}{2}  \times \frac{1}{4} =  \frac{1}{8}

次は、微分の定義式で下記の数式になっています。
 \displaystyle\lim_{h\to 0}\dfrac{f(x+h)-f(x)}{h}=f'(x)

これを逆数にするので下記のようになります。
\displaystyle \left(\dfrac{1}{f(x)}\right)' = \displaystyle\lim_{h\to 0}\dfrac{\frac{1}{f(x+h)}-\frac{1}{f(x)}}{h}

これを展開していきます。先ずは分子の分母を通分します。
= \displaystyle\lim_{h\to 0}\dfrac{\dfrac{f(x)-f(x+h)}{f(x+h)f(x)}}{h}

分子に分数を含む式なので変形します。
= \displaystyle\lim_{h\to 0}\dfrac{f(x)-f(x+h)}{f(x+h)f(x)} \div h

= \displaystyle\lim_{h\to 0}\dfrac{f(x)-f(x+h)}{f(x+h)f(x)} \times \dfrac{1}{h}

= \displaystyle\lim_{h\to 0}\dfrac{f(x)-f(x+h)}{h(f(x+h)f(x))}

これを下記のように分解すると微分の定義式f'(x)が見えてきます。
=\displaystyle\lim_{h\to 0}-\dfrac{1}{f(x)f(x+h)}\cdot\dfrac{f(x+h)-f(x)}{h}

=\displaystyle\lim_{h\to 0}-\dfrac{1}{f(x)f(x+h)}\cdot f'(x)

 h は極限で  0 として扱うので無視します。

=\displaystyle\lim_{h\to 0}-\dfrac{1}{f(x)f(x+0)}\cdot f'(x)

=-\dfrac{f'(x)}{f(x)^{2}}

これで逆数の微分公式が求まりました。

e の微分公式

公式 (e^{x})^\prime = e^{x}

符号違いのもう一つ公式を求めます。
公式 (e^{-x})^\prime = -e^{-x}

導出するにはチェーンルール(合成関数の微分公式)を用いて求めます。
y=e^{u}u=-x とおいて、\displaystyle  y\prime=\frac{dy}{du}\frac{du}{dx}=e^{u}\cdot(-1)=-e^{-x}

シグモイド関数微分

ここからシグモイド関数を逆数の微分公式を使用して微分します。

シグモイド関数1+exp(−x) の逆数なので
f^{\prime}(x)=\left(\displaystyle \frac {1}{1+exp(−x)}\right)^{\prime}

逆数の微分公式 -\dfrac{f'(x)}{f(x)^{2}} を当てはめます。

=\displaystyle \frac{-(1+exp(-x))^{\prime}}{(1+exp(-x))^{2}}

分子は微分するので1は消えます。
=\displaystyle \frac {-(-exp(−x))}{\left(1+exp(−x)\right)^{2}}
公式 (e^{-x})^\prime = -e^{-x} を当てはめると分子の符号がプラスになります。
=\displaystyle \frac {exp(−x)}{\left(1+exp(−x)\right)^{2}}

式を分解して分けます。分ける理由は、定義の式f(x)が出てくるようにするためです。
=\displaystyle \frac {1}{1+exp(−x)} \frac {exp(−x)}{1+exp(−x)}

=\displaystyle \frac {1}{1+exp(−x)} \left(\frac {1+exp(−x)}{1+exp(−x)}−\frac {1}{1+exp(−x)}\right)

=\displaystyle \frac {1}{1+exp(−x)} \left(1−\frac {1}{1+exp(−x)}\right)

ここで、
f(x)=\displaystyle \left(\frac {1}{1+exp(-x)}\right)
であるから、式を当てはめると

=f(x)\left(1−f(x)\right)

最後に

定義の式が出てくるように式を変形するという部分は難しいですね。
今回は、偏微分や合成関数などの出てきてません。まーやり方はいろいろあるので次回は使っていきます。

2019年こそ英語を継続して勉強する

はじめに

今年になってサブタイトルにこっそり「英語」を追記しました。
毎年新年を迎えると今年こそ英語をと誓うものの、数ヶ月もすれば何もしないで終わってそのまま1年経ってしまう。
こんなことを25年ぐらいやっているわけで、溜まるのは本や教材ばかりです。
20年前のドリッピーもあるし、釈由美子さんやっていたNHK英語でしゃべらナイト」の本は全部揃ってます。

ネットで紹介されてた本も買うものの、買うだけで満足してしまったり、読み終えるだけで終わるって状態です。

習慣化

昨年、Twitterのツイートでコワーキングをしている「エニシア静岡」ってところを知りました。勉強会の会場とかになってたんですね。
www.enicia.net

静岡街中の丸井の最上階にあるんですが、今いる会社から近いので今年からAfter Time会員になって仕事帰りに静岡駅に行く前に寄るようにしています。
ここで今は平日は1時間勉強しています。慣れてくれば時間を徐々に増やして2時間ぐらいまでしていきたいところですが、家もそもそも遠いので限界があります。今なら観たいドラマもTverで時間ずらして見れますしね。

英語力

中学1年生レベルからはじめました。
本を購入したんですが、結局iPhoneアプリ版を使っています。

これと英語組み立てTOWNをやっています。自分は昔に購入したので有料版を使っていますが、今は広告有りの無料版が出ているようです。
これは英文法の整序問題で正しい順序にして英文法を作成するのですが、結構楽しいです。

最後に

TOEICを受けたことがないですが、現在のレベルからしたら300点以下だと思います。これをTOEIC600点以上にはしていきたいです。

「サザエさんのじゃんけん データ分析」の2018年の結果

はじめに

明けましておめでとうございます。

さてさて、2018年のサザエさんのじゃんけん結果はどうなったでしょう。
ちなみに、2017年のサザエさんのじゃんけん結果は、32勝9敗7分(勝率0.780)でした。

人工知能による予測化を断念

ごめんなさい、DeepLearningを使用して予想をする予定でしたが、まだ勉強中のままです。

r_stdさんが、機械学習を用いて検証してくれました。
この方は2016年に統計検定準1級に合格している方で幾つかの手法を使っています。
2017年の結果として、naive bayesで33勝9敗6分と好成績を残しています。
r-std.hatenablog.com

約一年越しに②の記事が追加されました。
2018年の結果としてランダムフォレストで32勝10敗7分と好成績を残しています。
r-std.hatenablog.com

次の手の予測アルゴリズム

2017年冬版 サザエさんじゃんけん白書によるとクール(四半期)の初回(1月、4月、7月、10月の初回)はチョキが出やすいとのことで、今回取り入れてみました。

  • チョキが多いので、グー > チョキ > パーの優先順位とする
  • 前回と違う手を出すので、上記の優先順位で勝手を選ぶ
  • 二手前と一手前が違う手なら、残りの手を出すので勝手を選ぶ
  • 三手の中に同手がある場合、 残りの手を出すので勝手を選ぶ
  • 二手前と一手前が同じ手なら、勝手を出すので負手を選ぶ
  • 1月、4月、7月、10月の第1週目はチョキが出やすいので、グーを選ぶ(追加)

qiita.com

2018年の勝敗結果

年月 サザエさんの手 予想の手 勝敗結果
01月07日 チョキ グー 勝ち
01月14日 グー グー 引き分け
01月21日 チョキ チョキ 引き分け
01月28日 グー チョキ 負け
02月04日 パー チョキ 勝ち
02月11日 グー グー 引き分け
02月18日 チョキ グー 勝ち
02月25日 チョキ チョキ 引き分け
03月04日 パー チョキ 勝ち
03月11日 グー パー 勝ち
03月18日 グー グー 引き分け
03月25日 チョキ グー 勝ち
04月01日 チョキ グー 勝ち
04月08日 グー チョキ 負け
04月15日 パー チョキ 勝ち
04月22日 パー グー 負け
04月29日 チョキ グー 勝ち
05月06日 グー パー 勝ち
05月13日 チョキ チョキ 引き分け
05月20日 パー チョキ 勝ち
05月27日 グー パー 勝ち
06月03日 チョキ グー 勝ち
06月10日 グー チョキ 負け
06月17日 パー チョキ 勝ち
06月24日 パー グー 負け
07月01日 チョキ グー 勝ち
07月08日 グー パー 勝ち
07月15日 パー チョキ 勝ち
07月22日 グー グー 引き分け
07月29日 チョキ グー 勝ち
08月05日 チョキ チョキ 引き分け
08月12日 パー チョキ 勝ち
08月19日 グー パー 勝ち
08月26日 グー グー 引き分け
09月02日 パー グー 負け
09月09日 チョキ グー 勝ち
09月16日 グー パー 勝ち
09月23日 チョキ チョキ 引き分け
09月30日 パー チョキ 勝ち
10月07日 チョキ グー 勝ち
10月14日 グー パー 勝ち
10月21日 パー チョキ 勝ち
11月04日 パー グー 負け
11月11日 チョキ グー 勝ち
11月18日 チョキ パー 負け
11月25日 グー パー 勝ち
12月02日 グー チョキ 負け
12月09日 パー チョキ 勝ち
12月16日 チョキ グー 勝ち

結果は、30勝9敗10分(勝率0.769)となりました。

ちなみに、サザエさんじゃんけん研究所 公式ウェブサイトサザエさんの手の予想と勝負結果(2018年)が29勝7敗13分(勝率0.805)でした。

今回は勝数では上回ったのですが、勝率では負けました。 勝率の計算は、「勝ち / (勝ち + 負け)」で行っているのですが、負けが響いたわけです。

データ分析(新)として「1月、4月、7月、10月の第1週目はチョキが出やすいのでグーを選ぶ」という機能を追加して過去の勝敗結果も出してみました。そうすると意外といい数字になるわけですね。

データ分析(新) データ分析 研究所公式 r_stdさん
2013 26勝11敗12分(勝率0.703) 24勝13敗12分(勝率0.649) 25勝9敗17分(勝率0.735) -
2014 32勝8敗11分(勝率0.800) 30勝10敗11分(勝率0.750) 30勝9敗12分(勝率0.769) -
2015 34勝8敗8分(勝率0.810) 32勝9敗9分(勝率0.780) 33勝9敗8分(勝率0.785) -
2016 26勝12敗12分(勝率0.684) 27勝11敗12分(勝率0.711) 22勝13敗15分(勝率0.628) -
2017 34勝8敗6分(勝率0.810) 32勝9敗7分(勝率0.780) 29勝8敗11分(勝率0.783) 33勝9敗6分(勝率0.785)
2018 30勝9敗10分(勝率0.769) - 29勝7敗13分(勝率0.805) 32勝10敗7分(勝率0.761)

勝率を計算する際には、引き分けを除いて考えることが多いです。プロ野球などの勝率は引き分けを除いて計算されています。 mathwords.net

スライド

2013年に静岡Developers勉強会で機械学習を学び、2014年1月にネタとしてSlideShareに公開しました。

サザエさんのじゃんけん データ分析 from yaju88

最後に

今年こそはTensorFlowを使って人工知能ディープラーニングで予測手を作りたいと思います。
r_stdさんのようにディープラーニングを使わない別の機械学習の方法でもいい結果が出ているので参考にさせて頂きます。