指数,対数の恒等式,関数を題材に,jupyter notebookを使ってpythonでのplotをbrush upしていく様子を見てもらいます.その過程で指数,対数で数値を取ることの意義を理解してもらいます.
下の図は $10^x$と$1/10^x$を(x,-3,3)で同時にlogplotした結果である.
この図の意味を解説せよ.
というのが第一目標です.でも,じっと眺めているだけでは何もわかりません. ネットにも答えはありません(多分). そこで,いろいろ段階を踏んでこのplotを組み上げていきます.
指数と対数がなぜできたのかを思いだすために, $$ \frac{1500 \times 230}{4} $$ を考えましょう.そのまま計算させるだけでなく,対数とってevalfで打ち出して手計算して,それを戻してください.
print(1500 * 230 /4);
86250.0
from sympy import *
print(log(1500).evalf());
print(log(230).evalf());
print(log(4).evalf());
7.31322038709030 5.43807930892320 1.38629436111989
val = 7.31+5.44-1.386;
print(val);
11.364
print(exp(val).evalf());
86163.3334371859
%matplotlib inline
from sympy import *
x = Symbol('x')
plot(2**x,(x,-3,3))
<sympy.plotting.plot.Plot at 0x7f8f39426ac0>
普通に$2, 2^2, 2^3, 2^4$と確認できますが,$1/2, 1/2^2, 1/2^3$なんかも数値で確認できるでしょう.
2つの関数を同時にplotする練習を兼ねて, $2^x$と$1/2^x$を(x,-3,3)で同時にplotせよ.
p = plot(2**x, (1/2)**x, (x, -3,3),
legend=True, show=False)
p[0].line_color = 'b'
p[1].line_color = 'r'
p.show()
2**x
と0.5**x
がどういう変化をするかがわかるでしょう.
2**x
は,xの増加に従って,単調に増加していきます.2**x
は,xの減少に伴って,単調に減少しますが,これは,1/2**x
でxを増加していくのと等価です.こうしてx=0に対して対称になっていることが確認できます.
変数にパラメータを入れることで,変更箇所を出来るだけまとめて一般化しましょう. 2とか3として直打ちしている数値を変数に変更しましょう.
a = 2
n = 3
として再度同時plotせよ.
a = 2
n = 3
p = plot(a**x, (1/a)**x, (x, -n, n), ylim=[0,a**n],
legend=True, show=False)
p[0].line_color = 'b'
p[1].line_color = 'r'
p.show()
ここでは出力は変わりません.
a = 10
n = 3
p = plot(a**x, (1/a)**x, (x, -n, n),
legend=True, show=False)
p[0].line_color = 'b'
p[1].line_color = 'r'
p.show()
グラフの概形が変わっているのに気が付きますか? 指数の底を2から10に変更することで, 変化がより顕著な関数になっていることが確認できます. こうなると,小さな値の変化も微妙だし,大きな値の変化もわかりづらくなります.
a**3*a**(-1.5), a**(3-1.5), a**3*(1/a)**1.5
(31.622776601683793, 31.622776601683793, 31.6227766016838)
グラフから数値を読み取り,$10^x=150$となる$x$の値を小数点以下2桁で求めよ
a**2*a**0.1*a**0.07*a**0.006
149.96848355023738
解を求める関数を使えばすぐですが,グラフを拡大するなどして確認することができます. 先ほどの和の公式を使えば,指数関数は単調増加関数なので,正ならどんな実数も表現できることがわかるでしょう.
p = plot(a**x, (1/a)**x, (x, -n, n),
legend=True, show=False)
p[0].line_color = 'b'
p[1].line_color = 'r'
p.yscale = 'log'
p.show()
$\log(a^x,a), \log((1/a)^x,a)$をyscale='linear'でplotせよ. 先ほどのlogplotとの違いを指摘せよ.
p = plot(log(a**x,a), log((1/a)**x,a), (x, -n, n),
legend=True, show=False)
p[0].line_color = 'b'
p[1].line_color = 'r'
p.yscale = ''
p.show()
$\log_{10} 10^x = x \log_{10} 10 = x$と変形できますよね. だから直線になります.
さて,以上の変形,誘導をまとめて,先ほどのlogplot図の意図を解説してください.
log(a**2,a)+log(a**4,a), log(a**2*a**4,a)
(6, 6)
$\log_{10}(10^x10^y)$を (x,-n,n),(y,-n,n)でplotせよ.
plot3dはテキストで紹介しているが,例はこんな感じ.
%matplotlib inline
from sympy import *
from sympy.plotting import plot3d
x,y = symbols('x,y')
plot3d(sin(x)*cos(y), (x,-3, 3),(y,-3, 3))
%matplotlib inline
from sympy import *
from sympy.plotting import plot3d
x,y = symbols('x,y')
plot3d(log(a**x*a**y,a), (x,-n,n),(y,-n,n))
<sympy.plotting.plot.Plot at 0x7f8f3a944fa0>
$\log_{10} 10^x + \log _{10} 10^y$を (x,-n,n),(y,-n,n)でplotせよ.
plot3d(log(a**x,a)+log(a**y,a), (x,-n,n),(y,-n,n))
<sympy.plotting.plot.Plot at 0x7f8f486566a0>
これらの公式から,対数を取ることによって,積の計算が和の計算に変換されることが確認できるでしょう. コンピュータが苦手とする大きな数と小さな数の掛け算が,たし算に変換できます. AIの中身である確率計算にとっても便利です. なぜなら確率は必ず正の値をとり,さらに指数計算が頻出するからです.
対数を取るのは確率を考えるときに便利と述べました. 実際にロジスティック回帰と呼ばれる手法では,確率の対数をとって, 交差エントロピー誤差を考えます(p.215-9あたり).
その様子を示したのが下のプロットです. $$f(x) = (1-x)^3x$$ に対して$-\log(f(x))$をとり,その様子をplotしています.
に注意ください. なお,定義域は$0<x<1$ですが, pythonは,最初は文句を言いますが,適当に判断して表示してくれます.
それと,安定位置を求めるための微分や方程式の解を求めるcommandをつけておきます. 来週詳しく扱います.
%matplotlib inline
from sympy import *
x = Symbol('x')
p = plot((1-x)**3*x, (x, 0, 1),
legend=True, show=False)
p.show()
p = plot(-log((1-x)**3*x), (x, 0.0, 1.0),
legend=True, show=False)
p.show()
diff(-log((1-x)**3*x),x)
simplify(diff(-log((1-x)**3*x),x))
solve(diff(-log((1-x)**3*x),x))
[1/4]