技術をかじる猫

適当に気になった技術や言語、思ったこと考えた事など。

機械学習で使う数学系関数…つーか数式

相変わらず Puthon 3.7.x (anaconda) で検証。

シグモイド関数

基本形はこんな数式らしい。

 f _ \theta(x) = \frac{1}{1 + e ^ {-\theta ^ Tx}}

グラフにしてみるかね

import numpy as np
import matplotlib.pyplot as plt
import math
%matplotlib inline

def sigmoid(x):
    """シグモイド関数"""
    e = math.e
    return 1/(1 + e**-x)

x = np.arange(-20, 20, 0.5)
y = sigmoid(x)

fig = plt.figure(figsize=(10.0, 5.0))

plt.plot(x, y, color='blue')

plt.grid()
plt.show()

f:id:white-azalea:20200618235120p:plain

よくニューラルネットワークニューロンにされるやつ。

まぁ要するに 0 - 1 の間、0 でちょうど 0.5 となってるので、パーセンテージを扱う処理に向いてるって話らしい。
これで単純な二値判定するなら、0.5 が当然のようにボーダーになるわけで…

0 がちょうど 50% なので、それがプラスかマイナスかで 1/ 0 と判定すればいいので


  y =
  \begin{cases}
     1 \quad (\theta ^ T \geq 0) \\
     0 \quad (\theta ^ T \leq 0) \\
  \end{cases}

という形になる。

これで長方形判定をするものと考えると。
横長である確率を求めると考えて、横軸を x _ 1 縦軸を x _ 2 として適当なパラメータを与えてみる(あくまでも適当)


 \theta =\left[
    \begin{array}{rrr}
        \theta_0 \\
        \theta_1 \\
        \theta_2
    \end{array}
  \right] = \left[
    \begin{array}{rrr}
        -50 \\
        4 \\
        2
    \end{array}
  \right], \quad x = \left[
    \begin{array}{rrr}
        1 \\
        x_1 \\
        x_2
    \end{array}
  \right]

式に直すと


    \theta ^ Tx = -50 \cdot 1 + 4x _ 1 + 2x _ 2  \geq 0 \\
    2x _ 2 \geq 50 - 4x _ 1 \\
    x _ 2 \geq 25 - 2x _ 1

図にすると

def func(x):
    return 20 - 2 * x

x = np.arange(-10, 20, 1)
y = func(x)

fig = plt.figure(figsize=(5.0, 5.0))

plt.plot(x, y, color='blue')

plt.grid()
plt.show()

f:id:white-azalea:20200618235840p:plain

x _ 2 つまり y が大きいときに 1 なのだから、上記グラフの右上に当たる場合は横長と判定するわけだ。
ちなみに前回のデータもプロットすると

nx = np.array([80, 60, 35, 160, 160, 125])
ny = np.array([150, 110, 130, 50, 20, 30])

x = np.arange(-10, 20, 1)
y = func(x)

fig = plt.figure(figsize=(5.0, 5.0))

plt.plot(x, y, color='blue')
plt.scatter(nx, ny, color='red')

plt.grid()
plt.show()

f:id:white-azalea:20200618235939p:plain

デフォだと全部横長扱いだぜひゃっほう
で、 \theta を適当に決めたのが悪いので、これを求めるために、

  1. 目的関数を作る
  2. 微分して更新式を求める

て事すれば良さげ。

尤度

扱うのは確率なので、それを当てはめて考える。
未知のデータ x が横長である確率を  P(y=1|x) = f _ \theta(x) として考える。

横幅 縦幅 y 確率
80 150 縦長 0 P(y=0|x) が最大が理想
60 110 縦長 0 同上
35 130 縦長 0 同上
160 50 横長 1 P(y=1|x) が最大が理想
160 20 横長 1 同上
125 30 横長 1 同上

この学習データは全部独立して発生すると考えると


L(\theta)=P(y ^ {(1)}=0|x ^ {(1)})P(y ^ {(2)}=0|x ^ {(2)})P(y ^ {(3)}=0|x ^ {(3)})P(y ^ {(4)}=1|x ^ {(4)})P(y ^ {(5)}=1|x ^ {(5)})P(y ^ {(6)}=0|x ^ {(6)})\\
L(\theta)=\prod _ {i=1} ^ {N}P(y ^ {(i)}=1|x ^ {(i)}) ^ {y ^ {(i)}}P(y ^ {(i)}=0|x ^ {(i)}) ^ {1-y ^ {(i)}}

うおぉぉぉおおおお(TT

とまれ、y ^ {(i)} が 0 か 1 にできるなら、2つの P のうち片方だけ残るので、実質間違ってない…ナルホドって感じだが、言われなきゃ出てこねえ(TT

この L(\theta) を尤度というそうな…えっぐ