pythonを便利に使おう第四回!行列編!


初めに

 数学の歴史には表現の秀逸さを整える歴史とも言える部分が多くあります。その中で私が好きな要素を上げるとすれば、自然対数e、虚数i、そしてlogです。…行列はこの中には特に入ってなかったのですが、ビッグデータを解析したいというときには、行列の内積を使いたいなとなりましたので、今回は行列についてpythonで勉強して行こうと思います。

第8章「行列」の問題

 というわけで今回例題として使わせていただくのはこちら!

http://web.sfc.keio.ac.jp/~kawazoe/math/book/d-chap8.pdf

Google先生で数学 行列 問題で調べれば一番上に出てきました。この中から適当に問題をセレクトして解いていこうと思います。

第一問 行列の計算

3 
\left(
\begin{matrix}
1 & -3 \\ 
2 & -4 
\end{matrix}
\right)
-2
\left(
\begin{matrix} 
5 & 6 \\ 
7 & 3 
\end{matrix}
\right)

pythonのnumpyを使用した場合、使用できるメソッドはarrayとmatrixがあります。matrixは2次元の行列に適応しており、3次元以上を渡すとエラーする模様です。3次元以上も使いたいので、今回はarrayを使っていきます。

>>>import numpy as np
>>> 3*np.array([[1,-3],[2,-4]])-2*np.array([[5,6],[7,3]])
array([[ -7, -21],
       [ -8, -18]])

第二問 行列の積

\left(
\begin{matrix}
1 & 2 \\ 
3 & 1 
\end{matrix}
\right)
\left(
\begin{matrix} 
1 \\
2 
\end{matrix}
\right)
\qquad\
\left(
\begin{matrix}
1 & 3 \\ 
2 & 4 
\end{matrix}
\right)
\left(
\begin{matrix} 
4 & 1 \\
3 & 2
\end{matrix}
\right)
>>> np.array([[1,2],[3,1]])@np.array([[1,2]]).T
array([[5],
       [5]])
>>> np.array([[1,3],[2,4]])@np.array([[4,1],[3,2]])
array([[13,  7],
       [20, 10]])

 もしかしたら分からないかもしれないところもあるので、解説しましょう。まずアットマーク(@)についてですが、これは内積を表しています。np.array().Tというのは行列の転地を表しています。これらを駆使して計算しています。

第三問 次のrankを求めなさい。

A=\left(
\begin{matrix}
-1 & 1 & -1 \\ 
2 & 0 & 1  \\
1 & -3 & 2 \\
\end{matrix}
\right)

ここでいうrankというのは行列の階数ということらしいです。

行列の階数というのはある行列 に含まれる行(列)ベクトルがいくつのベクトルの1次結合でそれぞれ表されるかという意味です。他にも捉え方も色々とありますが、行列そのものが持つある種の次元に近いイメージです。
https://deepage.net/features/numpy-rank.html

 ということらしいです。こういう数学の細かい要素っておそらく勉強して いるんでしょうが、覚えていないものですね。
 兎にも角にも問題を解きましょう。

>>> np.linalg.matrix_rank(np.array([[-1,1,-1],[2,0,1],[1,-3,2]]))
2

 もはやここまで長い式になるのなら可視性のためにも、A=などして定義を分けるべきなんでしょう。次からします(めんどくさがり)

第四問 次の逆行列を求めなさい。

\left(
\begin{matrix}
1 & -1 & -2 \\ 
2 & -1 & 5  \\
1 & -1 & -1 \\
\end{matrix}
\right)
>>> A=np.array([[1,-1,-2],[2,-1,5],[1,-1,-1]])
>>> np.linalg.inv(A)
array([[ 6.,  1., -7.],
       [ 7.,  1., -9.],
       [-1.,  0.,  1.]])

第五問 次の行列式を求めなさい。

\left|
\begin{matrix}
-1 & 1 & 3 & -2 \\ 
-3 & 3 & 5 & -3  \\
3 & -2 & -5 & 3 \\
2 &-1 & -3 & 2 \\
\end{matrix}
\right|
>>> A=np.array([[-1,1,3,-2],[-3,3,5,-3],[3,-2,-5,3],[2,-1,-3,2]])
>>> np.linalg.det(A)
-0.9999999999999991

-1とはならずに-1の近似になってしまったのはコンピューターの仕方のないことでしょうか。正解…でいいのかな?

最後に

 今日はこの程度で終わりです。
 pythonの便利さというのがとてもわかりますね。そりゃコンピュータで計算するんですから、エラーはあっても間違えに到着することはそこそこないでしょうけれど、しかし、人間が計算するよりは計算制度が高いというところに意義があるので、学校でのテストでパソコンを持ち込ませてほしいですね!(´;ω;`)
 numpyでの行列の操作が理解できたので、今後は上手く使っていけそうです。