ユークリッド距離

二次元
√(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であってると思うんだが。。

機械学習に必要な数学的基礎

ーーーーーーーーーーーーー
変数・定数
1次式と2次式
関数の概念
平方根
累乗と累乗根
指数関数と対数関数
自然対数
シグモイド関数
三角関数
絶対値とユークリッド距離
数列
要素と集合
ーーーーーーーーーーーーー
ちなみにこれ、中1から高校までの数学らしい。
指数関数、対数関数、自然対数、シグモイド関数、ユークリッド距離あたりから怪しくなってくるな。

– ニューラルネットワークでは、重み(w)という概念がある。コンピュータが自動的に重み(w)を学習する。学習したモデルを利用するときは重みが「定数」として扱われる。

– 一次式は直線、二次式は放物線
– 一番大きな次数についている係数の正負によりグラフの向きが異なる

線形代数とは

– 行列とベクトルの性質を調べる学問
– 線形空間と線形変換を中心とした理論
– 行列、行列式、連立一次方程式の理論を含む

行列とは何か
数字を四角に並べたもの。あ、少し思い出してきた。。
1 4 8
2 3 8
7 5 4

線形代数の応用
→ 画像処理、3次元データ処理
→ PageRank
→ 統計学
→ 量子力学

連立方程式と行列
2x + 4 = 7
x + 3y = 6
係数が行列になる
2 4 x = 7
1 3 y = 6
→ 行列を使った方程式を解くことは、連立方程式を解くことと同じ

ベクトル
数字が縦横のどちらにしか並んでいないものをベクトルという

行列
記号、実数、複素数などを縦、横、長方形に並べたもの
-4 4.3
-1 3.5
5.7 12
横の並びを行、縦の並びを列
3 x 3行列 などと言ったりする
行列を構成する要素一つ一つを成分と呼ぶ
以下のようにi行j列の成分を表すことがある
a11 a12 a13
a21 a22 a23
a31 a32 a33
抽象的な行列は
A = [aij]
1行しかない行列を行ベクトル、1列しかない行列を列ベクトル

ベクトルの大きさ
||a|| = √x^2 + y^2

線形変換
scale, rotate, reflect, shearなど
なるほど、ベクトルだとこういうことができるのね。