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