ユークリッド距離

点Aと点Bのユークリッド距離とは、2点を結んだ線分ABの長さのこと

一次元のユークリッド距離は絶対値
|A – B|

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

うん、こーなるね。

三次元になると、
√(a1 – b1)^2 + (a2 – b2)^2 + (a3 – b3)^2

三平方の定理です。では、これをpythonで計算すると、

import numpy
x1 = 3
y1 = 4
x2 = 4
y2 = 6
a = numpy.array([x1, y1])
b = numpy.array([x2, y2])
u = b - a
print(numpy.linalg.norm(u))

[vagrant@localhost python]$ python myapp.py
2.23606797749979

なんだこれは。
numpy.linalgは固有値、固有ベクトルの計算
normはノムル

ユークリッド距離は何に使われるかというと
k-nearest neighbor algorithm ※k-nn
パターン認識で使われる。

なるほど、確かに距離の計算をしている、ということはわかる。

関数の絶対値

関数の絶対値、ということは、二次関数、三次関数などの絶対値ってことだな。

import numpy as np 
import matplotlib.pyplot as plt 

pi = 2 * np.pi

x = np.arange(0, 2*pi, 0.1)
y1 = np.sin(x)
y2 = np.abs(np.sin(x))

fig = plt.figure()
ax = fig.add_subplot(111)
ax.grid()
ax.set_xlabel("x", fontsize=16)
ax.set_ylabel("y", fontsize=16)
ax.set_xlim(0, 2*pi)
ax.set_ylim(-1.5, 1.5)
ax.set_xticks([0, pi/2, pi, 3*pi/2, 2*pi])
ax.set_xticklabels(["0", "$\pi/2$", "$\pi$", "$3\pi/2$", "$2\pi$"],
				fontsize = 12)

ax.plot(x, y1, linestyle = "--", color = "blue", label = "y = sinx")
ax.plot(x, y2, color = "red", label = "y = |sinx|")
ax.legend()

plt.savefig("01", bbox_inches = "tight")

まじかー、これ。うーん、なんだかな。。

pythonで絶対値

x = -5
y = abs(x)
print(y)

[vagrant@localhost python]$ python myapp.py
5
そのまんまです。

浮動小数点数、複素数

a = abs(-100.0)
print(a)

b = abs(2 + 3j)
print(b)

[vagrant@localhost python]$ python myapp.py
100.0
3.605551275463989

複素数は虚数単位
jは2乗すると-1になる。

absだけでなく、math.fabsでもいける。

import math

a = math.fabs(-100)
b = math.fabs(-100.0)

print(a)
print(b)

整数でも返り値が浮動小数点数になる
[vagrant@localhost python]$ python myapp.py
100.0
100.0

numpyで絶対値

import numpy as np
x = np.array([5, -5, 7 + 9j])

x_abs = np.abs(x)

print(x_abs)

[vagrant@localhost python]$ python myapp.py
[ 5. 5. 11.40175425]
あ、absって、absoluteの略か、納得。

scipyって何?

scipyは高度な科学計算を行う為のライブラリ
scipyはnumpyで行える配列や行列の演算を行うことができる

from scipy import integrate

def func(x):
	return 2*x + 5

result, err = integrate.quad(func, 0, 5)

print('積分結果:{0}\n誤差:{1}'.format(result, err))

なんか、積分が出来るらしい。
[vagrant@localhost python]$ python myapp.py
積分結果:50.0
誤差:5.551115123125783e-13

うーん、なんやら。。

フーリエ変換

import numpy as np
from scipy.fftpack import fft
import matplotlib.pyplot as plt

N = 2**20
dt = 0.0001
f1, f2 = 5, 8
A1, A2 = 5, 0
p1, p2 = 0, 0

t = np.arange(0, N*dt, dt)
freq = np.linspace(0, 1.0/dt, N)

y = A1*np.sin(2*np.pi*f1*t + p1) + A2*np.sin(2*np.pi*f2*t + p2)

yf = fft(y)/(N/2)

plt.figure(2)
plt.subplot(211)
plt.plot(t, y)
plt.xlim(0, 1)
plt.xlabel("time")
plt.ylabel("amplitude")

plt.subplot(212)
plt.plot(freq, np.abs(yf))
plt.xlim(0, 10)
#plt.ylim(0, 5)
plt.xlabel("frequency")
plt.ylabel("amplitude")
plt.tight_layout()
plt.savefig("01")

ちょっと待て、
scipyって何?
matplotlibの基本的な使い方は?

matplotが上手く動作しない

[vagrant@localhost python]$ python
Python 3.6.4 (default, Sep 5 2019, 00:12:03)
[GCC 4.4.7 20120313 (Red Hat 4.4.7-23)] on linux
Type “help”, “copyright”, “credits” or “license” for more information.
>>> import matplotlib
>>> matplotlib.matplotlib_fname()
‘/home/vagrant/.config/matplotlib/matplotlibrc’
>>>

[vagrant@localhost python]$ sudo vi /home/vagrant/.config/matplotlib/matplotlibrc

backendの記載をtkaggに変えます

backend : tkagg
import math
import numpy as np
from matplotlib import pyplot

pi = math.pi   #mathモジュールのπを利用

x = np.linspace(0, 2*pi)
y = np.sin(x)

pyplot.plot(x, y)
pyplot.savefig( 'sinWave.png' ) 

ほう

tahn関数

tahn関数の公式
y = (e^x – e^-x)/(e^x + e^-x)
どうやらこれもニューラルネットワークに使われるみたいだが。。計算式は異なるけど勾配はシグモイド関数にそっくりなんですね。

ReLU関数

活性化関数とは、入力信号の総和がどのように活性化するかを決定する

– 単純パーセプトロンではステップ関数
– 多層パーセプトロンでは、シグモイド関数、ソフトマックス関数、恒等関数など

ステップ関数
入力した値が0以下の時0に成り、0より大きい時1になる

def step_function(x):
	if x>0:
		return 1
	else:
		return 0

print(step_function(5))
print(step_function(-8))

[vagrant@localhost python]$ python myapp.py
1
0
アホみたいだな。概念は凄い大事なんだろうけど。

同じくRelU

def relu(x):
	return np.maximum(0,x)

print(relu(15))
print(relu(-4))

[vagrant@localhost python]$ python myapp.py
15
0
これもそのまんまって感じですな。。

sigmoid関数

Sa(x) = 1 /(x + exp(-ax))
シグモイド関数はxが負の無限大に近づくと分母は正の無限大になるので、yは0に近づき、xが正の無限大に近づくと分母は1に近づくのでyは1に近づく

import numpy as np

def sigmoid(x):
	return 1 / (1 + np.exp(-x))

print(sigmoid(0))

print(sigmoid(-6))

print(sigmoid(6))

[vagrant@localhost python]$ python myapp.py
0.5
0.0024726231566347743
0.9975273768433653

ラムダ式

import numpy as np
sigmoid = lambda x : 1 / (1 + np.exp(-x))

print(sigmoid(0))
print(sigmoid(-5))
print(sigmoid(5))

[vagrant@localhost python]$ python myapp.py
0.5
0.0066928509242848554
0.9933071490757153

計算自体は簡単だなー

自然対数をpythonで表現する

自然対数: 微分しても値が変わらない

import math

print(math.e)

[vagrant@localhost python]$ python myapp.py
2.718281828459045
ほう、

べき乗

print(3**3)
print(pow(2,5))
print(math.pow(2,6))

[vagrant@localhost python]$ python myapp.py
27
32
64.0
冪乗は、用途が多いので、書き方も複数あるようですな。

平方根

print(3**0.5)

print(math.sqrt(3))

print(3**0.5 == math.sqrt(3))

[vagrant@localhost python]$ python myapp.py
1.7320508075688772
1.7320508075688772
True

複素数

import math
import cmath

print(cmath.sqrt(-3 + 4j))

print(cmath.sqrt(-1))

[vagrant@localhost python]$ python myapp.py
(1+2j)
1j

指数関数: eのべき乗

import math

print(math.exp(3))

print(math.exp(2) == math.e**2)

[vagrant@localhost python]$ python myapp.py
20.085536923187668
False
おおお

対数関数

print(math.log(math.e))
print(math.log10(100000))
print(math.log2(1024))

[vagrant@localhost python]$ python myapp.py
1.0
5.0
10.0