指数,対数の恒等式,関数を題材に,jupyter notebookを使ってpythonでのplotをbrush upしていく様子を見てもらいます.その過程で指数,対数で数値を取ることの意義を理解してもらいます.
下の図は $10^x$と$1/10^x$を(x,-3,3)で同時にlogplotした結果である.
この図の意味を解説せよ.
というのが第一目標です.でも,じっと眺めているだけでは何もわかりません. ネットにも答えはありません(多分). そこで,いろいろ段階を踏んでこのplotを組み上げていきます.
指数と対数がなぜできたのかを思いだすために, $$ \frac{1500 \times 230}{4} $$ を考えましょう.そのまま計算させてもいいですが,対数とって計算してそれを戻してください.
普通に$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せよ.
2**x
と0.5**x
がどういう変化をするかがわかるでしょう.
2**x
は,xの増加に従って,単調に増加していきます.2**x
は,xの減少に伴って,単調に減少しますが,これは,1/2**x
でxを増加していくのと等価です.こうしてx=0に対して対称になっていることが確認できます.
ここでは出力は変わりません.
グラフの概形が変わっているのに気が付きますか? 指数の底を2から10に変更することで, 変化がより顕著な関数になっていることが確認できます. こうなると,小さな値の変化も微妙だし,大きな値の変化もわかりづらくなります.
グラフから数値を読み取り,$10^x=150$となる$x$の値を小数点以下2桁で求めよ
解を求める関数を使えばすぐですが,グラフを拡大するなどして確認することができます. 先ほどの和の公式を使えば,指数関数は単調増加関数なので,正ならどんな実数も表現できることがわかるでしょう.
$\log(a^x,a), \log((1/a)^x,a)$をyscale='linear'でplotせよ. 先ほどのlogplotとの違いを指摘せよ.
$\log_{10} 10^x = x \log_{10} 10 = x$と変形できますよね. だから直線になります.
さて,以上の変形,誘導をまとめて,先ほどのlogplot図の意図を解説してください.
$\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))
$\log_{10} 10^x + \log _{10} 10^y$を (x,-n,n),(y,-n,n)でplotせよ.
これらの公式から,対数を取ることによって,積の計算が和の計算に変換されることが確認できるでしょう. コンピュータが苦手とする大きな数と小さな数の掛け算が,たし算に変換できます. 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()
/Users/bob/anaconda3/lib/python3.8/site-packages/sympy/plotting/experimental_lambdify.py:233: UserWarning: The evaluation of the expression is problematic. We are trying a failback method that may still work. Please report this as a bug. warnings.warn('The evaluation of the expression is'
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]