機械学習で使う数学系関数…つーか数式
相変わらず Puthon 3.7.x (anaconda) で検証。
シグモイド関数
基本形はこんな数式らしい。
グラフにしてみるかね
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()
よくニューラルネットワークのニューロンにされるやつ。
まぁ要するに 0 - 1
の間、0 でちょうど 0.5
となってるので、パーセンテージを扱う処理に向いてるって話らしい。
これで単純な二値判定するなら、0.5
が当然のようにボーダーになるわけで…
0 がちょうど 50% なので、それがプラスかマイナスかで 1/ 0 と判定すればいいので
という形になる。
これで長方形判定をするものと考えると。
横長である確率を求めると考えて、横軸を 縦軸を として適当なパラメータを与えてみる(あくまでも適当)
式に直すと
図にすると
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()
つまり 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()
デフォだと全部横長扱いだぜひゃっほう
で、 を適当に決めたのが悪いので、これを求めるために、
- 目的関数を作る
- 微分して更新式を求める
て事すれば良さげ。
尤度
扱うのは確率なので、それを当てはめて考える。
未知のデータ が横長である確率を として考える。
横幅 | 縦幅 | 形 | y | 確率 |
---|---|---|---|---|
80 | 150 | 縦長 | 0 | が最大が理想 |
60 | 110 | 縦長 | 0 | 同上 |
35 | 130 | 縦長 | 0 | 同上 |
160 | 50 | 横長 | 1 | が最大が理想 |
160 | 20 | 横長 | 1 | 同上 |
125 | 30 | 横長 | 1 | 同上 |
この学習データは全部独立して発生すると考えると
うおぉぉぉおおおお(TT
とまれ、 が 0 か 1 にできるなら、2つの のうち片方だけ残るので、実質間違ってない…ナルホドって感じだが、言われなきゃ出てこねえ(TT
この を尤度というそうな…えっぐ