ロジスティック回帰
-> 線形回帰式をシグモイド関数にかけて確率値と解釈
f(x) = 1 / (1 + exp^(-ax)) = a・exp(-ax) / (1 + exp^(-ax))^2
ソフトウェアエンジニアの技術ブログ:Software engineer tech blog
随机应变 ABCD: Always Be Coding and … : хороший
ロジスティック回帰
-> 線形回帰式をシグモイド関数にかけて確率値と解釈
f(x) = 1 / (1 + exp^(-ax)) = a・exp(-ax) / (1 + exp^(-ax))^2
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を
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でできてしまうって事ね。
ただ、これ、気象計算や原子力など計算量が大きくなった場合に何が一番早いかってところだな。
初項と公差を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")
まじかー、これ。うーん、なんだかな。。
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の略か、納得。