シグモイド関数

ロジスティック回帰
-> 線形回帰式をシグモイド関数にかけて確率値と解釈

f(x) = 1 / (1 + exp^(-ax)) = a・exp(-ax) / (1 + exp^(-ax))^2

sympyを使っていく

import sympy

x = sympy.Symbol('x')
y = sympy.Symbol('y')

print(type(x))

[vagrant@localhost python]$ python app.py

変数を使っていく

import sympy

x = sympy.Symbol('x')
y = sympy.Symbol('y')
expr = x**2 + y + 1
print(expr)

ほう
[vagrant@localhost python]$ python app.py
x**2 + y

x = sympy.Symbol('x')
y = sympy.Symbol('y')
expr = x**2 + y + 1
print(expr.subs(x,3))
print(expr.subs(x,y))

代入も出来る。完全に再現できるわけね。当たり前か。
[vagrant@localhost python]$ python app.py
y + 10
y**2 + y + 1

xとyの代入も

print(expr.subs([(x,3),(y,2)]))

式の展開

expr = (x + 1)**2
print(sympy.expand(expr))

こいつは凄い
[vagrant@localhost python]$ python app.py
x**2 + 2*x + 1

因数分解

print(sympy.factor(x**3 - x**2 - 3*x + 3))
print(sympy.factor(x*y + x + y + 1))

[vagrant@localhost python]$ python app.py
(x – 1)*(x**2 – 3)
(x + 1)*(y + 1)
何これー

print(sympy.solve(x**2 - 3*x +2))
print(sympy.solve(x**2 + x + 1))

Iは虚数ですね。
[vagrant@localhost python]$ python app.py
[1, 2]
[-1/2 – sqrt(3)*I/2, -1/2 + sqrt(3)*I/2]

で、肝心の微分
来ましたねー

print(sympy.diff(x**3 + 2*x**2 + x))

expr = x**3 + y**2 - y
print(sympy.diff(expr, x))
print(sympy.diff(expr, y))

[vagrant@localhost python]$ python app.py
3*x**2 + 4*x + 1
3*x**2
2*y – 1

常微分

odeintは1階の常微分方程式を解くのに有効な積分器

import numpy as np
from scipy.integrate import odeint
import matplotlib.pyplot as plt 

def func(y, x, a):
	dydx = a*y
	return dydx

a = 1
y0 = 1
x = np.arange(0, 3, 0.01)

y = odeint(func, y0, x, args=(a,))

plt.plot(x, y, label='exp')
plt.legend()
plt.savefig('01')

import matplotlib.pyplot as plt
import numpy as np 
from scipy.integrate import odeint
from numpy import sin, cos, pi 
from matplotlib.animation import FuncAnimation 

def func(state, t):
	dydt = np.zeros_like(state)
	dydt[0] = state[1]
	dydt[1] = -(G/L)*sin(state[0])
	return dydt 

G = 9.8
L = 1

th1 = 30.0
w1 = 0.0

state = np.radians([th1, w1])

dt = 0.05
t = np.arange(0.0, 20, dt)

sol = odeint(func, state, t)

theta = sol[:, 0]
x = L * sin(theta)
y = - L * cos(theta)

fig = plt.figure()
ax = fig.add_subplot(111, autoscale_on=False, xlim=(-L, L), ylim=(-L, L))
ax.set_aspect('equal')
ax.grid()

line, = ax.plot([], [], 'o-', lw=2)

def animate(i):
	thisx = [0, x[i]]
	thisy = [0, y[i]]

	line.set_date(thisx, thisy)
	return line,

ani = FuncAnimation(fig, animate, frames=np.arange(0, len(t)), interval=25, blit=True)

plt.savefig('01')

極限の計算

極限とは、xの値をある一定値αに限りなく近づけるとき

limit(sin(x)/x, x, 0)
limit(x, x, oo)
limit(1/x,x, oo)
limit(x**x, x, 0)

python set型

和集合、積集合、部分集合などの計算の為、pythonのsetを

s = {1, 2, 2, 3, 1, 4}

print(s)
print(type(s))

[vagrant@localhost python]$ python app.py
{1, 2, 3, 4}

s = {i**2 for i in range(5)}

print(s)

s = {1, 2, 2, 3, 1, 4}
print(s)
print(len(s))

[vagrant@localhost python]$ python app.py
{0, 1, 4, 9, 16}
{1, 2, 3, 4}
4

和集合

s1 = {0, 1, 2}
s2 = {1, 2, 3}
s3 = {2, 3, 4}

s_union = s1 | s2
print(s_union)

s_union = s1.union(s2)
print(s_union)

セットで計算

s1 = {0, 1, 2}
s2 = {1, 2, 3}
s3 = {2, 3, 4}

s_union = s1.union(s2,s3)
print(s_union)

等差数列の和

等差数列の和の公式は
S = 1/2*n(a + l)
これは基本中の基本でしょう。
pythonで表現します。

範囲の足し算

sum = 0
for i in range(1, 100):
	sum += i
print(sum)

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

forでなく、sumを使う場合

n =99
print(sum(range(1, n + 1)))

[vagrant@localhost python]$ python myapp.py
4950
答えは同じです

公式を使う場合

def sn(a, lim):
	n = int(lim) / a
	l = n * a
	return (a + l) * n / 2
print(sn(3,999))

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

公式でもできるが、rangeやsumでできてしまうって事ね。
ただ、これ、気象計算や原子力など計算量が大きくなった場合に何が一番早いかってところだな。

pythonで等差数列

初項と公差をarray(range(x,y,z))で指定する

import numpy as np 
x = np.array(range(7, 187, 11))
print(x)

[vagrant@localhost python]$ python myapp.py
[ 7 18 29 40 51 62 73 84 95 106 117 128 139 150 161 172 183]

arangeやlimspaceなどの方法もある

import numpy as np 
x = np.arange(6, 100, 12)
print(x)

y = np.linspace(8, 120, 15)
print(y)

[vagrant@localhost python]$ python myapp.py
[ 6 18 30 42 54 66 78 90]
[ 8. 16. 24. 32. 40. 48. 56. 64. 72. 80. 88. 96. 104. 112.
120.]

linspaceは難しい等差数列ができるようで、応用が効くようだ。

ユークリッド距離

点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の略か、納得。