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

pythonで三角関数

math.pi

import math

print(math.pi)

[vagrant@localhost python]$ python app.py
3.141592653589793

角度変換: math.degrees(), math.radians()

import math

print(math.degrees(math.pi))
print(math.radians(180))

[vagrant@localhost python]$ python app.py
180.0
3.141592653589793

import math

print(math.sin(math.radians(30)))
print(round(sin30, 3))
print('{:.3}'.format(sin30))
print(format(sin30,'.3'))

[vagrant@localhost python]$ python app.py
0.49999999999999994
Traceback (most recent call last):
File “app.py”, line 4, in
print(round(sin30, 3))
NameError: name ‘sin30’ is not defined

あれ、sin30って使えない?
あ、sin30 = math.sin(math.radians(30)) で定義してないとダメだね。

import math

cos60 = math.cos(math.radians(60))
print(cos60)

[vagrant@localhost python]$ python app.py
0.5000000000000001

誤差がああああああ

三角関数

Pythonでは標準モジュールmathを使うと、三角関数(sin,cos,tan)および逆三角関数(arcsin,arccos,arctan)の計算ができる。

は?逆三角関数って何?

通常の三角関数では角度θに応じてyの値を出す
例えば、x = π/3[rad] として、
y = cos π/3 = 1/2

逆関数とは、その逆。値を与えて、角度を得る
あれ、ちょっと待って、sin, cos, tanの y に対する x って1つじゃないよね。。つまり逆三角関数って、螺旋状のようなグラフになるって事かい。。

対数

1でない正数aと正数Nとの間にN = a^bの関係がある時、そのbのこと。
bを、aを底とするNの「対数」と言い、log[a]N = bと表す。
10を底とする常用対数や、eを底とする自然対数を、単に「対数」で指す場合がある

import math
print(math.log10(x) for x in (1,10,100,1000,10000))

ん?

print(math.log10(10))
print(math.log10(-1))

[vagrant@localhost python]$ python app.py
1.0
Traceback (most recent call last):
File “app.py”, line 4, in
print(math.log10(-1))
ValueError: math domain error

import numpy as np 
import matplotlib.pyplot as plt 

x = np.arange(0, 10, 0.01) + 0.00001
y = np.log10(x)
plt.plot(x, y)
plt.savefig('01')

log[10]は0に近づくとマイナスになる。

で、対数って何に使うか?
-> 数字がでかくなる時に、y軸を対数スケールにすると分かりやすくなる …

-> 掛け算、割り算
log[x][y] = log[x] + log[y]
log[x]/[y] = log[x] – log[y]
機械学習には必須。。

-> 2^x = N だから、 x = log[2]N
2分法のアルゴリズムの計算か。あれ、これは結構重要じゃん

「あとどれ位やればある程度マスターできる」って思考が宜しくないね。

指数関数

mathモジュールを使います

import math

a = math.exp(1)
b = math.exp(2)
c = math.exp(-1)

print("e = {}".format(a))
print("e**2 = {}".format(b))
print("e**(-1) = {}".format(c))

[vagrant@localhost python]$ python app.py
e = 2.718281828459045
e**2 = 7.38905609893065
e**(-1) = 0.36787944117144233

import math

x = math.e

y = len(str(math.e)) - 1

print("e = {}".format(x))
print("桁数 {}".format(y))

[vagrant@localhost python]$ python app.py
e = 2.718281828459045
桁数 16

3次関数の極大、極小を求める

引き続きmatplotlibを使います。使い方は同じで、三次函数にしただけ。

import matplotlib.pyplot as plt 
import numpy as np 

x = np.arange(-10, 10, 0.1)

y = x**3 - 3*x**2 + 4

plt.plot(x,y)
plt.savefig('01')

グラフを見ると極大、極小を取っていることがわかりますね。
x = 0(極大)
x = 2(極小)

最小2乗法は線形回帰のアルゴリズム。
うむ、なんとも。

pythonのグラフの描写

matplotlibで書く

import matplotlib.pyplot as plt 
import numpy as np 

x = np.arange(-10, 10, 0.1)

y = x**2 + 10*x + 1

plt.plot(x,y)
plt.savefig('01')


x軸、y軸を定義してplotするだけですね。
感覚的には数式に近いような気がします。

偏微分

Δy = 0 としてxを変化させると、極限Δx → 0 を考えることができる。これをxについて偏微分したと言う。

from sympy import *
sym.init_printing()

x=Symbol('x')
y=Symbol('y')

print(diff(sin(x),x))
print(diff(exp(x),x))

print(diff(x**4+x**3,x,2))

print(diff(x**2+x*y+2*y**2,x))

print(Derivative(y(t),t))

[vagrant@localhost python]$ python app.py
Traceback (most recent call last):
File “app.py”, line 2, in
sym.init_printing()
NameError: name ‘sym’ is not defined

あれ。。

3x^2 + 5xy + 3y^3
xで偏微分すると 6x + 5y
yで偏微分すると 5y + 9y^2

理屈は簡単ですな。

線形回帰モデルで予想モデルを作りたい

目的変数 y = CTR
独立変数 ユーザバイオグラフィック x1 … x10?
係数 w
レコード数 n

回帰モデルは
y = w0 + lΣ[k=1]wkxk

各係数wを求めたい

線形回帰モデルの場合は、独立変数を行列X、係数ベクトルWとして目的変数Yを求める
Y = XW

微分した時に距離Dがゼロになる値を複数の変数で計算する

あれ、これは、線形回帰モデルではないな。少なくとも線形ではない(と思う)
しかし、ボストンのサンプルばっかりでイマイチ掴めんな。。

常微分

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')