はじめに
機械学習を始めるにも、算数や数学がわからないと、入門書すら読めない。ただそこまで、ちゃんと解説してあるものもない。ということで最低限必要な数学基礎をこの記事で書けたらいいなと思っています。
環境
ほぼ影響ないですが、python3系を利用。
前提
四則演算や累乗(2乗とか3乗とか)がわかっていること。
関数
一次関数(一次方程式)
こういうやつのこと。aとかbを係数と言います。
$y=ax+b$
以下で適当に$y=4x+3$の関数を作ってみます。
import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline
x = np.arange(0,11)
y = 4*x+3
plt.plot(x,y)
plt.grid()
この方程式は、xが1進むときにyは4進んでいる。つまり
$
\frac{yの変化量}{xの変化量}
$
$
\frac{4}{1}=4
$
つまり$4x+3$の4は傾きを表している。またxが0の時はyは3になり、これを切片と呼ぶ。
二次関数(二次方程式)
こういうやつのこと。同様にaとかbを係数と言います。
$ax^2+bx+c$
この中では最高次数が2次になっています(xの二乗のこと)。
※bxとかcとかがない場合も当然あります。
一番シンプルな$y=x^2$を書いてみます。
x = np.arange(-1.0,1.01,0.01)
y = x**2
plt.plot(x,y)
plt.grid()
ついでに三次関数(三次方程式)
こういうやつのこと。
$ax^3+bx^2+cx+d$
この中では最高次数が3次になっています(xの三乗のこと)。
一番シンプルな$y=x^3$を書いてみます。
後々微分のところの例でたくさん出てくる図。
x = np.arange(-1.0,1.01,0.01)
y = x**3
plt.plot(x,y)
plt.grid()
連立方程式
人によってはご無沙汰な連立方程式。
例えば、下記グラフ上の赤い2点(3,6)(4,12)を通る直線を求めるときにどうすればいいでしょうか。
考え方は簡単です。
・ x=3の時にy=6
・ x=4の時にy=12
なので
$6=3a+b$
$12=4a+b$
の共通のa,bを見つければいいだけです。
計算
まずはbを消したいので、上の式から下の式を引きます。するとaが残ります。
$ 6=3a+b$
-)$12=4a+b$
ーーーーーーーー
$-6=-a$ → $ a =6$
あとはa=6を$6=3a+b$に代入すれば、b=-12ということが求められます。
つまり2点を通る直線は$y=6x-12$ということがわかりました。
コードで書く
from sympy import Symbol,solve
a = Symbol("a")#aを記号として扱う(通常int型とstr型は一緒に計算できない)
b = Symbol("b")#bを記号として扱う(通常int型とstr型は一緒に計算できない)
ex1 = 3*a + b - 6
ex2 = 4*a + b - 12
ans = solve((ex1,ex2))
print(ans[a],ans[b]) # -> 6 -12
グラフで書くとこうなる。
x = np.arange(-1,10,1)
y = 6*x-12
plt.plot(x,y)
plt.plot(4,12,marker="x",color="red")
plt.plot(3,6,marker="x",color="red")
plt.grid()
plt.show()
ちなみに並行する線
切片をずらせば並行する線になる
x = np.arange(-1,10,1)
y = 6*x-12
y_pal = 6*x-7
plt.plot(x,y)
plt.plot(x,y_pal)
plt.plot(3,6,marker="x",color="red")
plt.plot(4,12,marker="x",color="red")
plt.grid()
plt.show()
ちなみに直交する線
傾きに掛けて−1になる数値を求める。(3,6)の位置を通る線だとすると(ここはなんでもいいけど、もともと指定されている点を使う。)
$a \times {a_{new}} = -1$
$6 \times {a_{new}} = -1$
$6 \times {a_{new}}\div6 = -1\div6$
${a_{new}} = -\frac{1}{6}$
さらに切片も求める。(3,6)の位置で交わるので
$6 = 3\times{-\frac{1}{6}} + b$
$b = \frac{13}{2} $
つまり
$y = -\frac{1}{6}+\frac{13}{2}$
が(3,6)の位置を通る直交する線ということになります。
x = np.arange(-10,10,1)
y = 6*x-12
y_orth = -1/6*x+13/2
plt.plot(x,y_orth)
plt.plot(x,y)
plt.plot(3,6,marker="x",color="red")
plt.plot(4,12,marker="x",color="red")
plt.axis('equal')
plt.grid()
plt.show()
※plt.axis('equal')をつけないと自動調整されて、直交にならないので注意
ちなみに2つの線の交わる点を求めるには
さっきの(3,6)を求めるのは、2つの線の連立方程式を解くだけです。
x = np.arange(-1,10,1)
y1 = 6*x-12
y2 = -1/6*x+13/2
plt.plot(x,y1)
plt.plot(x,y2)
plt.axis('equal')
plt.grid()
plt.show()
x = Symbol("x")
y = Symbol("y")
ex1 = 6*x-12 - y
ex2 = -1/6*x+13/2 - y
solve((ex1,ex2))
追記)比例
比例式とはとは $1:60=5:x$ みたいなやつです。
外項(一番左と一番右)を掛けたものと内項(内側の二つ)を掛けたものが等しくなります。
つまり
$ 1\times x = 60 \times 5 $
$ x = 300 $
みたいになります。
なぜ比例式をここに追記したのかでいうと、「線分」という考え方があるからです。
線分とは
2点を結ぶ直線のことを「線分」と言い、どこまでも伸びるものは「直線」と言います。その線分をm:nの長さに分けるものを「内分点」と言います。
例えば、
ある点をx1,もう一つをx2とする線分の中に、線分をm:nに分割するxという内分点を作ったとすると、
$x-x1:x2-x = m:n$
となり、上記の性質に従うと
$(x-x1)n = (x2-x)m$
と変形をし、これをxについて解くと
$x = \frac{mx2+nx1}{m+n}$
というようになります。
そしてm:nが同じ、つまり線分を半分ずつに分ける点を「中点」と言います。※当然yも同様に計算できます。
$x = \frac{x2+x1}{2}$
$y = \frac{y2+y1}{2}$
これに実際の座標を入れるだけで、中点を求めることができます。
さらに中点を通る直交する線を「垂直二等分線」と言います。
以下で垂直二等分線の式を求めてみます。
例題は(3,6),(4,12)という線分にします。
#1.まずは2つの点を通過する線分の式を求める
a = Symbol("a")
b = Symbol("b")
ex1 = 3*a + b -6
ex2 = 4*a +b - 12
ans = solve((ex1,ex2))
print(ans) ->#{a: 6, b: -12}
#2.次にこの線分の中点を求める
from fractions import Fraction#分数を使う
x_center = Fraction(3+4,2)-> 7/2
y_center = Fraction(6+12,2)-> 9
#3.これに直交する線の傾きを計算する
a_new = Fraction(-1,6)
print(a_new) -> -1/6
#3.ついでに切片を計算する
b_new = y_center-a_new*x_center
がっちゃんこすると
$y_2 = -\frac{1}{6}x+\frac{115}{12}$
となります。
ここまで
線形代数でもありますが、「写像fによるxの像はy」みたいな言い方するらしいです。よくわかりませんが。
次回は平方根や指数・対数について投稿していきます。