Googleクラスルーム
GeoGebraGeoGebra Classroom

線形代数のパッケージ〜言語別

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でのみ有効。。。

入力結果3