numpyの基本

四則計算

import numpy as np

res1 = np.add(20,30)
res2 = np.subtract(20,55)
res3 = np.multiply(40,25)
res4 = np.divide(500,5)

print(
	res1,
	res2,
	res3,
	res4,
)

[vagrant@localhost python]$ python myapp.py
50 -35 1000 100.0

addとsubtractは行列にも適用できる。行列の掛け算はnp.dotでしたね。

累乗と平方根

import numpy as np

res1 = np.power(2,4)
res2 = np.sqrt(2)
res3 = np.sqrt(4)

print(
	res1,
	res2,
	res3,
)

[vagrant@localhost python]$ python myapp.py
16 1.4142135623730951 2.0
なるほどー、power, sqrtか。

res1 = np.sin(30)
res2 = np.cos(30)
res3 = np.tan(30)

[vagrant@localhost python]$ python myapp.py
-0.9880316240928618 0.15425144988758405 -6.405331196646276

引数はradian。通りでおかしなことになってるわけだ。
180°がπ radian

30°を表したいなら

res1 = np.sin(np.pi * 1/6)
res2 = np.cos(np.pi * 1/6)
res3 = np.tan(np.pi * 1/6)

[vagrant@localhost python]$ python myapp.py
0.49999999999999994 0.8660254037844387 0.5773502691896257
あああああああ、誤差がああああああ、というか、これ、途方も無いな。。
全然先が見えないんだが。。ま、phpよりもpythonの方が遥かに計算の相性が良いことがわかってきた。

anaconda

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

x = np.arange(0,11)
y = 4*x+3
plt.plot(x,y)
plt.grid()

[vagrant@localhost python]$ python myapp.py
File “myapp.py”, line 3
%matplotlib inline
^
SyntaxError: invalid syntax

ん?これって、anacondaが入ってないって事?

[vagrant@localhost python]$ pyenv -v
pyenv 1.2.13

[vagrant@localhost python]$ pyenv install anaconda3-2019.03
Downloading Anaconda3-2019.03-Linux-x86_64.sh…
-> https://repo.continuum.io/archive/Anaconda3-2019.03-Linux-x86_64.sh
Installing Anaconda3-2019.03-Linux-x86_64…
Installed Anaconda3-2019.03-Linux-x86_64 to /home/vagrant/.pyenv/versions/anaconda3-2019.03

[vagrant@localhost python]$ python –version
Python 3.7.3
(anaconda3-2019.03)

(anaconda3-2019.03) [vagrant@localhost python]$ python myapp.py
File “myapp.py”, line 3
% matplotlib inline
^
SyntaxError: invalid syntax

これはどうやらコマンドラインで画像を描画できないからっぽいですね。
まあよかった、原因がわかって。

線形回帰分析

回帰分析とは、ある変数xが与えられた時、それと相関関係のあるyの値を説明・予測すること。

線形回帰分析は、 y = ax + b の一次関数を求めること。

OLS 各点における差の和が最小となるようにパラメータを求める

ei = Yi – (aXi + b)
これを二乗した和
nΣi=0(Yi – aXi – b)^2

推定する値は目的変数、推定元の値は独立変数
線形回帰とは、直線上の数値予測

ああああああああああああああああああああああああああ
結局今すぐpythonやらないと駄目だーーーーーーーーーーーーーーーーーー

行列の掛け算

(-1,2)(3 2) = 1

-1 2 , 3 = 1
1 2 , 2 5

-1 2 , 3 = 1
1 2 , 2 5
3 0 9

m * n型の行列の積はm次元列ベクトルで表される
行列の積はベクトルの内積の概念を拡張したもの
スカラー倍はベクトルだけでなく、行列にもある

行列には割り算はないが、逆行列という概念がある
行列式は det A もしくは |A|と表される
det A = ad – bc

ニューラルネットワークはパラメータと重みの掛け算を足し合わせる。これはベクトルの線形変換。

入力ベクトルx 重みW 出力ベクトルy

線形変換しても元ベクトルと向きが変わらないベクトルを固有ベクトルという

ベクトルのノルム

L1ノルム:ベクトル成分の絶対値の和 最短距離を測る…各成分の絶対値
L2ノルム:ベクトルのユークリッド距離
||a||[2] = √nΣi=1 a^2i

L2ノルム: ||a||2 = √

L1ノムル、L2ノムルは線形回帰モデルで正則化項として使われる
線形回帰モデルで正則化項を付けることで係数の絶対値または2乗値が大きくならない→過学習が起こらない

ノムルからcosθを求めることもできる
cos(a, b)
cos類似度が高い方がベクトルが似ている

線形代数、ベクトル

データを複数個収めることができるように、要素を1列に並べたものをベクトルと呼ぶ

単語をベクトル化するWord2Vecという概念がある
Word2Vecは、単語一つ一つを1列に並べたベクトルに変換
ベクトルに変換すると、足し算、引き算を行うことができる

同じような意味の単語群から、同じような周辺語を予測している??

ベクトルは有向線分で視覚化できる。スカラー倍も考えうる。
ベクトルの足し算、引き算は矢印で考える

初等関数の微分法

x^r: rx^r-1
e^x : e^x
a^x : a^x log[e]a
log[e]x : 1/x
sinx : cos x
cos x : -sing x
tan x : 1/cos^2x

sinx → cos x -> -sin x -> -cos x

合成関数の微分
y = f(x), dy/dx = dy/du * du/dx
合成関数(多変数) z = f(x, y)の微分法

(3x – 4)^50 を微分すると、50(3x – 4)^49 * 3 = 150(3x – 4)^49

(3x + 1)^2 + (x + y + 1)^3
2(3x + 1)* 3 + 3(x + y + 1)^2

xe^x -> 1e^x + x*e^x

正解データとニューラルネットワークの出力が合うように、ニューラルネットワークの重み(w)を調整
ニューラルネットワークの重みの調整量は誤差の値を重みで偏微分した値を考慮したもの
チェーンルールを使う

シグモイド関数
Sa(x) = 1 / 1 + exp(-ax)
dSa(x)/dx = a*exp(-ax) / {1 + exp(-ax)}^2 = aSa(x){1 – Sa(x)}
これ(aSa(x){1 – Sa(x)})をさらにxで微分する

ReLU関数
max(0, x) = {x(x > 0), 0(x <= 0) = 1(x > 0), 0(x < 0) 標準シグモイド関数は微分すると、最大値が0.25 ニューラルネットワークの層が不快と、誤差が伝播しなくなる。その解決値としてReLU関数が多く使用されている => これあれだな、基礎数学もプログラミングみたいに、基礎本を10冊くらいやらんとあかんな。。

最小2乗法

最小2乗法とは、誤差の2乗和が最小になるような関係式を求める
線形回帰と呼ばれる基本的な機械学習アルゴリズム
→ つまり微分した際の「極値」ってことか。。

微分

微分とは、滑らかなグラフの一瞬の変化の割合を示す
極限(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