線形代数のパッケージ〜言語別
0.線形代数のパッケージ
線形代数は、データサイエンスや科学、数学の研究にとても使われます。
もちろん、微分・積分とともに使われることが多いのですが、
1からプログラミングするのは車輪の発明といって、何回もやるものではありません。
線形代数の関数群のパッケージはすでに用意されていることがあります。
これからは、パッケージの特徴を言語ごとに知ることで、
データサイエンスなどに活用する基礎にしましょう。
1.Julia
<線形代数専用のパッケージがあるよ>
juliaはpython風にかけて、Cよりも速いことをめざして作られたとも言われている。
これから成長が見込まれる言語だね。
juliaには、LinearAlgebraが標準で入っている。
これを使えば良いね。
関数が英語そのままで、パッケージ名とかもいらないから書きやすい。
<ベクトルの内積・外積・ノルム・正規化>
#ベクトルの内積と外積
using LinearAlgebra
a = [1,2,3]
b = [4,5,6]
nai = dot(a,b)
gai = cross(a,b)
println(a,"と",b,"の内積は",nai,",外積は",gai)
println(a,"のノルムは",norm(a))
println(b,"を正規化すると",normalize(b))
#================================
[1, 2, 3]と[4, 5, 6]の内積は32,外積は[-3, 6, -3]
[1, 2, 3]のノルムは3.7416573867739413
[4, 5, 6]を正規化すると[0.4558423058385518, 0.5698028822981898, 0.6837634587578276]
<積と逆行列>
# 行列の積と逆行列(行列はカンマ不要で、行末記号;で区切るだけで入力できる)
using LinearAlgebra
A = [ 1 2 3; 7 5 3; 3 9 8 ]
B = [ 3 2 1; 4 3 2; 5 4 3 ]
t = tr(A)
d = det(A)
println(A,"のトレースは",t,"行列式は",d)
C=A*B
#================================
[1 2 3; 7 5 3; 3 9 8]のトレースは14行列式は63.0
3×3 Matrix{Int64}:
26 20 14
56 41 26
85 65 45
inv(A)
#================================3×3 Matrix{Float64}:
0.206349 0.174603 -0.142857
-0.746032 -0.015873 0.285714
0.761905 -0.047619 -0.142857
<固有値、固有ベクトル、行列分解>
# 特異値分解
using LinearAlgebra
A=[-4 0 6;-3 2 3;-3 0 5]
eigvals(A)
#============================
3-element Vector{Float64}:
-1.0
2.0
2.0
eigvecs(A)
#============================
3×3 Matrix{Float64}:
-0.816497 0.0 -0.707107
-0.408248 1.0 0.0
-0.408248 0.0 -0.707107
#2行目の固有値2に対応する固有ベクトルが2列目に表示される。
A = rand(Float32,4,3) #乱数行列4*3
F = svd(A) # U S Vの順に表示される。UVは直交行列、Sは特異値行列
#============================
SVD{Float32, Float32, Matrix{Float32}, Vector{Float32}}
U factor:
4×3 Matrix{Float32}:
-0.434323 0.897233 0.0440645
-0.652363 -0.342484 0.670799
-0.433118 -0.242276 -0.451391
-0.44519 -0.137765 -0.5868
singular values:
3-element Vector{Float32}:
1.5456771
0.42548516
0.1660293
Vt factor:
3×3 Matrix{Float32}:
-0.221336 -0.807729 -0.546428
0.955425 -0.06735 -0.287448
-0.195378 0.585694 -0.786632
2.Python
pythonはインストールするとコマンドラインから起動して対話型の実行ができる。
でも、VScodeやjupyter-notebookを使って、複数行のプログラムをかいて
実行することが普通だね。
<パイソンのモジュールは豊富>
Pythonはユーザーが多くさまざまなモジュールがある。
pip install Numpyでinstallするか、anacondaでjupyter-notebookを使うと標準で入っている。
Numpyがベクトル、その中のlinalgが線形代数だ。
ベクトルだけならimport Numpy as np
でよいけど、線形代数をするなら、
from Numpy.linalg import 使う関数名
の宣言をしておくと、記述が簡便になるね。
<ベクトルの内積・外積・ノルム・正規化>
#ベクトルの内積と外積
import numpy as np
from numpy.linalg import norm
a = np.array([1,2,3])
b = np.array([4,5,6])
nai = np.dot(a,b)
gai = np.cross(a,b)
print(a,",",b,"の内積は",nai,",外積は",gai)
print(a,"のノルムは",norm(a))
print(b,"を正規化すると",b/norm(b))
#================================
[1, 2, 3]と[4, 5, 6]の内積は32,外積は[-3, 6, -3]
[1, 2, 3]のノルムは3.7416573867739413
[4, 5, 6]を正規化すると[0.4558423058385518, 0.5698028822981898, 0.6837634587578276]
<積と逆行列>
# 行列の積と逆行列
import numpy as np
from numpy.linalg import det
A = np.array([[1,2,3],[7,5,3],[3,9,8]])
B = np.array([[3,2,1],[4,3,2],[5,4,3]])
t = np.trace(A)
d = det(A)
print(A,"のトレースは",t,"行列式は",d)
#================================
[[1 2 3]
[7 5 3]
[3 9 8]] のトレースは 14 行列式は 62.99999999999999
C=A@B #numpyのAB行列の積はA*Bではだめ、np.dot(A,B)か、np,mutmul(A.B)か A@B
#================================
array([[26, 20, 14],
[56, 41, 26],
[85, 65, 45]])
from numpy.linalg import inv
inv(A)
#================================3×3 Matrix{Float64}:
array([[ 0.20634921, 0.17460317, -0.14285714],
[-0.74603175, -0.01587302, 0.28571429],
[ 0.76190476, -0.04761905, -0.14285714]])
<固有値、固有ベクトル、行列分解>
rng = np.random.default_rng()
from numpy.linalg import svd
A=np.array([[-4,0,6],[-3,2,3],[-3,0,5]])
eigenvalues, eigenvectors = np.linalg.eig(A)
eigenvalues
#============================
array([ 2., -1., 2.])
eigenvectors
#============================
array([[ 0. , -0.81649658, -0.70710678],
[ 1. , -0.40824829, 0. ],
[ 0. , -0.40824829, -0.70710678]])
#1列目の固有値2に対応する固有ベクトルが1列目に表示される。
A = rng.random((4,3))
u, s, vh = svd(A)
print(u)
print(s)
print(vh)
#============================
[[-0.31705863 0.88152479 0.25995548 -0.23411755]
[-0.54422354 -0.46231621 0.63109361 -0.30299392]
[-0.55920751 -0.08749309 -0.730123 -0.38282152]
[-0.53905614 0.03902213 -0.03262528 0.84073262]]
[2.46049634 0.75237379 0.19095343]
[[-0.63868398 -0.53655931 -0.5515314 ]
[-0.5434571 0.821975 -0.17032756]
[-0.54473586 -0.19094817 0.81657923]]
3.geogebra
vector, matrix, algebra
などに線形代数は拡散して入っている。豊富ではない。
標準で入っているので、命名が選びやすいが、ヘルプが使いにくい。
<ベクトルの内積・外積・ノルム・正規化>
# ベクトルはVector((点の座標))で入力できる。
a = Vectror((1,2,3))
b = Vector((4,5,6))
nai = dot(a,b) #Enterを押すと、a bになる。
gai = cross(a,b) #Enterを押すと、ab
text1=a+","+b+"の内積は"+nai+",外積は"+gai
text2=a+"のノルムは"+Length(a) #Normというコマンドはないので注意。何でもLength
text3=b+"を正規化すると"+b/Length(b)入力結果1
<積と逆行列>
# 行列の積と逆行列
A = {{1,2,3},{7,5,3},{3,9,8}}
t = trace(A)
d = Determinant(A)
text1=A+":行列式は"+d
Invert(A)
text2=FormulaText(A) #行列らしく表示するにはこのコマンドを使う。
B = {{3,2,1},{4,3,2},{5,4,3}}
C=A*B
入力結果2
<行列分解、固有値、固有ベクトル>
A = Sequence(Sequence(random(), j, 1,4),k, 1,3) #4列3行の乱数行列
text1=FormulaText(A)
Ms=SVD(A) #3つの行列まとめて返すから、1,2,3番と番号をつけて表示してみる。
text2=FormulaText(Ms(1))
text3=FormulaText(Ms(2))
text4=FormulaText(Ms(3))
B={{-4,0,6},{-3,2,3},{-3,0,5}}
Eigenvalues(B) #CASでだけ使えます。近似値ではなく根号で表示されるのがよいね。
Eigenvectors(B) #CASでのみ有効。。。