微分

微分とは、滑らかなグラフの一瞬の変化の割合を示す
極限(lim)とは一定の値に極限まで近づけること

f(x) = (x^2 – 1)/(x – a)
xの値をある一定値αに限りなく近づけると、関数f(x)が一定値αに限りなく近く 収束という

limx-1 (x^2 – 1)/(x – 1) = limx→1 (x + 1) = 2

速度 v = limΔt→0 Δx / Δt = limΔt→0 x(t- Δt) – x(t)/ Δt
Δの代わりにdを用いる
dx(x)/dt

df(x)/dx = limΔx→0 df(x)/dx = limh→0 f(x + h) – fx(x)/h

人工知能では、どの地点で最小値を取るのか調べることが多い

変数が1つのみ 常微分
変数が2つ以上 yを定数(Δy = 0)としてxを変化させる Δx → 0
→ 偏微分

f(x) = ax^2 + bx + c
→微分すると 2ax + b

f(x,y) = 3x^2 + 5xy + 3y^3
xで偏微分すると 6x + 5y
yで偏微分すると 5x + 9y^2

速度v = dx/dtは位置xを時刻tで微分したもの
加速度α=dv/dtは速度vを時刻tで微分

極大値、極小値は微分値の正負が入れ替わる点
2階微分で加速度を把握する

数列

an = a + (n – 1)d

等差数列の和
S = 1/2n(a + l)

等比数列
an = ar^(n-1)

等比数列和
Sn = a(1-r^n)/(1-r) = a(r^n – 1)/(r – 1)

Σ(シグマ)… 総和
π(パイ)… 総乗

数列の和
nΣk=1[k] = 1/2n(n+1)
nΣk=1[k]^2 = 1/6n(n+1)(2n+1)
nΣk=1[k]^3 = {1/2n(n+1)}^2
nΣk=1 = nc

nΣk=1(ak + bk) = nΣk=1ak + nΣk=1bk

ユークリッド距離

二次元
√(a1 – b1)^2 + (a2 – b2)^2

三次元
√(a1 – b1)^2 + (a2 – b2)^2 + (a3 – b3)^2

ユークリッド距離は||A||もしくは||A-B||と表せる

K-NNでも使われる
正解ラベルとのユークリッド距離で判別する

function distance($data1, $data2){
$num = 0;
for($i = 0; $i < sizeof($data1); $i++){ $num += pow($data1[$i] - $data2[$i], 2); } return sqrt($num); } var_dump(distance(array(1, 1), array(4, 5))); [/php] float(5) うん、これは簡単

弧度法

半径rの円で、中心角の大きさ一定で1radと表す。
円周は2π
0° 0
30° 1/6π
45° 1/4π
60° 1/3π
90° 1/2π
120° 2/3π
180° π
360° 2π

これはわかります。

2/6π
sinθ 1/2
cosθ √3/2
tanθ √3/2

1/4π
sinθ √2/2
cosθ √2/2
tanθ 1

で、これの何が役に立つの??
音声認識を行う際に、音の波を解析するため、フーリエ変換が行われる
フーリエ変換は、複雑な波形を持つ関数を三角関数の足し算で表現する

よくわからんから、とりあえずgoogl home mini買ったわ

echo "30度";
echo sin(deg2rad(30)). "<br>";
echo cos(deg2rad(30)). "<br>";
echo tan(deg2rad(30)). "<br>";

echo "60度";
echo sin(deg2rad(60)). "<br>";
echo cos(deg2rad(60)). "<br>";
echo tan(deg2rad(60)). "<br>";

Fast Artificial Neural Network Libraryを使ってみる

まず、libraryを入れます。

[vagrant@localhost fann]$ sudo yum install fann-devel
あれ、全然うまくいってない。。

$num_input = 2;
$num_output = 1;
$num_layers = 3;
$num_neurons_hidden = 3;
$desired_error = 0.001;
$max_epochs = 500000;
$epochs_between_reports = 1000;

$ann = fann_create_standard($num_layers, $num_input, $num_neurons_hidden, $num_output);

if ($ann) {
    fann_set_activation_function_hidden($ann, FANN_SIGMOID_SYMMETRIC);
    fann_set_activation_function_output($ann, FANN_SIGMOID_SYMMETRIC);

    $filename = dirname(__FILE__) . "/xor.data";
    if (fann_train_on_file($ann, $filename, $max_epochs, $epochs_between_reports, $desired_error))
        fann_save($ann, dirname(__FILE__) . "/xor_float.net");

    fann_destroy($ann);
}

ぬ、やっぱり。
[Fri Aug 30 08:52:09 2019] 192.168.33.1:60110 [500]: / – Call to undefined function fann_create_standard() in /home/vagrant/local/fann/index.php on line 10

ぐ。。

シグモイド関数

Sa(x) = 1 / (1 + e^-ax) = (tanh(ax/2) + 1 )/ 2
生物の神経細胞が持つ性質をモデル化
aはゲイン
狭義のシグモイド関数は
S1(x) = 1 / (1 + e^-x) = (tanh(x/2) + 1 )/ 2

y= 0, y = 1
limx→∞Sa(x) = 1
limx→-∞Sa(x) = 0
x=0
Sa(0) = 1/2

個体群増加や閾値以上で起きる反応
ゲイン(a)が大きいほどカーブが急激になる

入力した値を0から1の間に収める
シグモイド関数は微分ができる
シグモイド関数の微分と正規分布関数はにており、計算がしやすい
ロジスティック回帰はシグモイド関数と同じ形

ニューラルネットワークは学習する際に微分を含む計算を行う ステップ関数は微分するとゼロになる シグモイド関数は微分してもゼロにならない

自然対数「e」

e は2.718…を表す定数
log[e]のことをln、 e^xのことをexp x またはexp(x)と表現することがある
eはネイピア数という

e = lim[n→∞](1 + 1/n)^n = 2.718281
e = lim[n→∞](1 – 1/n)^n = 1/e = 0.367879….

(e^x)’ = e^x
微分しても全く変わらない

e = 1/0! + 1/1! + 1/2! + 1/3! + 1/4! …
ちなみに1/0!=1, 1/1!=1 のため、2.718281…となるのだそう

e^x = 1/0! + 1/1!*x + 1/2!*x^2 + 1/3!*x^3 + 1/4!*x^4 …

自然対数 log[e]

[pyhon]
import numpy as np
import matplotlib.pyplot as plt

def get_base():
return 2

def exp_func(x):
b = get_base()
return np.power(b, x)

def numerical_diff(f, x)
h = 1e-2
return (f(x + h) – f(x -h)) / (2 * h)

def main():
x_values = np.arange(-1, 1, 0.1)
exp_values = exp_func(x_values)
diff_values = numerical_diff(exp_func, x_values)

plt.plot(x_values, exp_values, “-“)
plt.plot(x_values, diff_values, “-“, color=”red”)
plt.grid()
plt.show()

if __name__ == ‘__main__’:
main()
[/python]

ネイピア数は微分しても値が変わらない、というのはわかった。
eを底とする指数関数 e^xをexp(x)と表すのもわかった。
しかし、これがなんで便利なんだろう。

連続した確率計算において、ネイピア数eは重要な役割を果たす
あ!

対数logの書き方

log[2]4 = 2
→ 2^2 = 4 となるからですね。
log[3]27 = 3

log[a]a = 1
log[a]1 = 0
log[a]X + log[a]Y は、、、log[a]XY これも当たり前ですね。
log[a]X – log[a]Y = log[a]X/Y うん、少し考えればわかる。
p*log[a]X = log[a]X^p うん、これもわかりますな。

logX / loga
あれーーーーーーーーーーーーーーーー。。。

aの0乗が1の理由

2^5 = 32
→ %2
2^4 = 16
→ %2
2^3 = 8
→ %2
2^2 = 4
→ %2
2^1 = 2

だから、
2^0 は、2%2で1
これは階乗の規則性からの説明。わかることはわかる。

a^x は、1*x*x …. という解釈。最初に1をかけているから、a^0は1になるという説明。
うーん、これはこじつけのような説明。。

指数法則
a^n x a^m = a^(n+m)
これはわかります。nを0にします。
a^0 x a^m = a^m
こうすると、a^0 = 1になります。
まあ、法則から証明するというのは帰納法的だが、しっくりとはきますね。

指数関数と対数関数(log)

指数関数の定義
a > 0, a != 1
y = a^x

a > 1 の時、xが増えるにつれyも増えていく
逆に 0 < a < 1のときは、x が増えるにつれ、yは逓減していく a^0 = 1 あれ、何故 a^0は1なんだ?? べき乗は掛け算の繰り返しだから、aを0回かけるなら 0じゃ無いの? なんか基礎中の基礎でつまづいた。。つまづいたというより、a^0=0であってると思うんだが。。