sage/行列計算に挑戦
をテンプレートにして作成
[
トップ
] [
新規
|
一覧
|
単語検索
|
最終更新
|
ヘルプ
]
開始行:
[[FrontPage]]
#contents
2009/11/16からのアクセス回数 &counter;
このページで紹介したsageノートブックは、以下のURLから参照...
http://www.sagenb.org/home/pub/1049/
** リスト [#u1341581]
pythonのリストについて簡単に説明します。
pythonでリストは、項目をカンマ区切りで並べたリストをカギ...
空のリストは
[]
になります。
変数l1に1, 2, 3, 4の4個の要素をリストにセットするときは、...
sage入力:
#pre{{
# リストの処理
l1 = [1, 2, 3, 4]
}}
リストの要素およびサブリストは、以下のように取り出します...
#pre{{
要素: リスト[要素のインデックス]
指定範囲のサブリスト: リスト[開始インデックス:終了インデ...
指定以降のサブリスト: リスト[開始インデックス:]
先頭から指定までのサブリスト: リスト[:終了インデックス] ·...
}}
sage入力:
#pre{{
print l1[2]
print l1[1:3]
print l1[2:]
print l1[:2]
}}
&color(blue){3};
&color(blue){[2, 3]};
&color(blue){[3, 4]};
&color(blue){[1, 2]};
リストの連結は、+で行います。
sage入力:
#pre{{
l2 = [9, 8, 7]
l1 + l2
}}
&color(blue){[1, 2, 3, 4, 9, 8, 7]};
範囲生成関数rangeを使うと簡単に指定した範囲のリストを生成...
#pre{{
range(終了) : 0から終了の前までの整数のリストを生成します
range(開始, 終了) : 開始インデックスから終了インデックス...
range(開始, 終了, 増分) : 開始から終了の前までの値を増分...
}}
以下にrangeの例を示します。
sage入力:
#pre{{
print range(3)
print range(1, 4)
print range(-1, 7, 2)
}}
&color(blue){[0, 1, 2]};
&color(blue){[1, 2, 3]};
&color(blue){[-1, 1, 3, 5]};
リスト内包は、式とそれにつづくfor節からなり、各要素に対し...
以下の例は、リストl1の各要素の自乗を要素とするリストを返...
sage入力:
#pre{{
[s^2 for s in l1]
}}
&color(blue){[1, 4, 9, 16]};
同様の処理をfor文を使って処理スト以下のようになります。リ...
sage入力:
#pre{{
l3=[]
for s in l1:
l3.append(s^2)
print l3
}}
&color(blue){[1, 4, 9, 16]};
もう一つ、各要素のルートを取る例を示します。
+ sqrtを式のままリストに保持
+ sqrtの値を5桁の数値で保持
+ リストを整形して出力した場合
sage入力:
#pre{{
s1 = [sqrt(s) for s in l1]
print s1
print [n(s, digits=5) for s in s1]
view(s1)
}}
&color(blue){[1, sqrt(2), sqrt(3), 2]};
&color(blue){[1.0000, 1.4142, 1.7320, 2.0000]};
&color(blue){[1,√2,√3,2]};
2つのリストの各要素をリストとして結合したい場合に、zipを...
以下の例では、数値と文字のリストをzipで結合します。
sage入力:
#pre{{
t1 = ['a', 'b', 'c', 'd']
print t1
zip(l1, t1)
}}
&color(blue){['a', 'b', 'c', 'd']};
&color(blue){[(1, 'a'), (2, 'b'), (3, 'c'), (4, 'd')]};
sum関数は、リストの値の和を返します。
sage入力:
#pre{{
# l1の1文字目はLです!
sum(l1)
}}
&color(blue){10};
flattenは、入れ子になったリストのすべての要素を1個のリス...
sage入力:
#pre{{
print [l1, l2]
flatten([l1+l2])
}}
&color(blue){[[1, 2, 3, 4], [9, 8, 7]]};
&color(blue){[1, 2, 3, 4, 9, 8, 7]};
*** リストプロット [#ge5de664]
これで、ようやくリストプロットの例を説明することができま...
list_plot(プロットするリスト)
0から24までの値の自乗の値をプロットします。
sage入力:
#pre{{
list_plot([i^2 for i in range(25)], xmax=25)
}}
&ref(sage0.png);
リストの値を線で連結する場合、plotjoined=trueを指定します。
#pre{{
list_plot([i^2 for i in range(25)], xmax=25, plotjoined=t...
}}
&ref(sage0-1.png);
** ベクトルと行列 [#qe68f663]
*** ベクトルの生成 [#wb4bfdf9]
ベクトルは、vector関数で生成します。
#pre{{
vector(値のリスト)
または、
vector(環, 値のリスト)
}}
以下は、\(v=(2, 1, 3), v=(1, 1,-4)\)生成しています。環に...
sage入力:
#pre{{
# ベクトルと行列
v = vector([2,1,3]); v
}}
&color(blue){(2, 1, 3)};
#pre{{
w = vector([1,1,-4]); w
}}
&color(blue){(1, 1, -4)};
*** ベクトルの内積 [#h62c8c6d]
ベクトルの内積\(\mathbf{v}\cdot\mathbf{w}\)は、dot_produc...
よく知られているようにベクトルの内積は、
$$
\mathbf{v}\cdot\mathbf{w} = |\mathbf{v}||\mathbf{w}|cos(\...
$$
で表されます。
sage入力:
#pre{{
v.dot_product(w)
}}
&color(blue){-9};
*** ベクトルの外積 [#m2a49e83]
同様にベクトルの外積\(\mathbf{v}\times\mathbf{w}\)は、cro...
ベクトルの外積の大きさは、
$$
|\mathbf{v}\times\mathbf{w}| = |\mathbf{v}||\mathbf{w}|si...
$$
であり、その方向は、ベクトルvからベクトルwにねじを回して...
sage入力:
#pre{{
v.cross_product(w)
}}
&color(blue){(-7, 11, 1)};
*** 行列の生成 [#wede82bc]
行列は、matrix関数で生成します。
#pre{{
matrix(行列の要素のリスト)
または
matrix(環, 行列の要素のリスト)
}}
sage入力:
#pre{{
A = matrix([[1,2,3],[3,2,1],[1,2,1]]); A
}}
&color(blue){[1 2 3]};
&color(blue){[3 2 1]};
&color(blue){[1 2 1]};
行列、ベクトルの積は、*を使って表現します。
sage入力:
#pre{{
w*A
}}
&color(blue){(0, -4, 0)};
*** 行列の解 [#q12d05d4]
solve_right関数を使って行列の解を得ることができます。
$$
\mathbf{A}\mathbf{X} = \mathbf{Y}
$$
となるようなXを求めるのが、solve_right関数です。
sage入力:
#pre{{
Y = vector([0,-4,-1])
}}
#pre{{
X = A.solve_right(Y); X
}}
&color(blue){(-3/2, 0, 1/2)};
\(\mathbf{A}\mathbf{X}\)を計算して、解が正しいことを確認...
sage入力:
#pre{{
A*X
}}
&color(blue){(0, -4, -1)};
*** 転置行列 [#ma7c8f16]
転置行列は、transpose関数で取得できます。
転置行列の性質は、
- \( (\mathbf{A}^T)^T = \mathbf{A} \)
- \( (\mathbf{A}^T)^T = \mathbf{A} \)
- \( (\mathbf{A}\mathbf{B})^T = \mathbf{B}^T\mathbf{A}^T ...
最後の、転置行列の積の掛ける順序を変えるための公式には、...
sage入力:
#pre{{
A.transpose()
}}
&color(blue){[1 3 1]};
&color(blue){[2 2 2]};
&color(blue){[3 1 1]};
*** 行列式 [#jd644480]
行列式、det関数で取得できます。
行列式は、逆行列の計算に使われるので、よく逆行列が存在す...
sage入力:
#pre{{
A.det()
}}
&color(blue){8};
*** 逆行列 [#ua62d94d]
逆行列は、inverse関数で取得できます。
- \( (\mathbf{A}^{-1})^{-1} = \mathbf{A} \)
- \( (\mathbf{A}^{T})^{-1} = (\mathbf{A}^{-1})^T \)
- \( (\mathbf{A}\mathbf{B})^{-1} = \mathbf{B}^{-1}\mathbf...
です。
sage入力:
#pre{{
A.inverse()
}}
&color(blue){[ 0 1/2 -1/2]};
&color(blue){[-1/4 -1/4 1]};
&color(blue){[ 1/2 0 -1/2]};
*** 単位行列 [#g417f2cf]
単位行列は、identity_matrixで生成します。
sage入力:
#pre{{
identity_matrix(3)
}}
&color(blue){[1 0 0]};
&color(blue){[0 1 0]};
&color(blue){[0 0 1]};
*** 対角行列 [#x731d466]
対角行列は、diagonal_matrixで生成します。
#pre{{
diagonal_matrix(対角要素のリスト)
}}
sage入力:
#pre{{
D = diagonal_matrix([1, 2, 3]); D
}}
&color(blue){[1 0 0]};
&color(blue){[0 2 0]};
&color(blue){[0 0 3]};
*** 環 [#h5d357e8]
環は、数の集合を表します。
よく使われる環を以下に示します。
- 整数: ZZ
- 実数: R
- 有理数: QQ
- 複素数: CC
- 倍精度小数(real double): RDF
です。
以下に有理数の環を使って行列を生成する例を示します。
sage入力:
#pre{{
A = matrix(QQ,3,3,[[2, 4, 0],[3, 1, 0], [0, 1, 1]]); A
}}
&color(blue){[2 4 0]};
&color(blue){[3 1 0]};
&color(blue){[0 1 1]};
*** 固有値解析 [#x55f6bb1]
固有値と固有ベクトルは、
\( \mathbf{A}\mathbf{x} = \lambda\mathbf{x} \)が0ベクト...
固有値は、
$$
det(\mathbf{M} - \lambda\mathbf{E}) = 0
$$
の解です。
sageで固有値と固有ベクトルを取得するには、eigenmatrix_lef...
先に定義した\( \mathbf{A} \)の固有値と固有ベクトルをeigen...
eigenmatrix_rightは、定義とすこし違いP*self = P*DとなるD...
Dの対角成分が固有値で、Pの各列が固有値に対応する固有ベク...
固有値解析の場合、固有値の大きな順に固有ベクトルを計算し...
sage入力:
#pre{{
D, P = A.eigenmatrix_right()
print "D="
print D
print "P="
print P
}}
&color(blue){D=};
&color(blue){[ 5 0 0]};
&color(blue){[ 0 1 0]};
&color(blue){[ 0 0 -2]};
&color(blue){P=};
&color(blue){[ 1 0 1]};
&color(blue){[ 3/4 0 -1]};
&color(blue){[3/16 1 1/3]};
eigenmatrix_rightを確認するために、A*P == D*Pを確認してみ...
sage入力:
#pre{{
A*P == P*D # ~Pは、P.inverse()の省略形
}}
&color(blue){True};
主成分分析では、固有値の大きなものを使って処理するため、P...
sage入力:
#pre{{
D, P = A.eigenmatrix_left()
print "D="
print D
print "P="
print P
}}
&color(blue){D=};
&color(blue){[ 5 0 0]};
&color(blue){[ 0 1 0]};
&color(blue){[ 0 0 -2]};
&color(blue){P=};
&color(blue){[ 1 1 0]};
&color(blue){[ 1 -1/3 -4]};
&color(blue){[ 1 -4/3 0]};
元となるAは、\( \mathbf{A} = \mathbf{P}^{-1}\mathbf{D}'\m...
どの固有値までがもとになるAを表現するかを、固有値に係数を...
sage入力:
#pre{{
A == (~P)*D*P # ~Pは、Pの逆行列
}}
&color(blue){True};
求まった固有値の、絶対値の一番小さな1に対して0.5を掛けて...
sage入力:
#pre{{
D=matrix([[5,0,0],[0,1*0.5,0],[0,0,-2]]) # 第2項に0.5を掛...
}}
#pre{{
print '(~P)*D*P'
print (~P)*D*P
print 'A-(~P)*D*P'
n(A-(~P)*D*P, digits=5)
}}
&color(blue){(~P)*D*P};
&color(blue){[ 2.00000000000000 4.00000000000000 0.00000...
&color(blue){[ 3.00000000000000 1.00000000000000 0.00000...
&color(blue){[0.125000000000000 0.958333333333333 0.50000...
&color(blue){A-(~P)*D*P};
&color(blue){[4.4409e-16 4.4409e-16 0.00000]};
&color(blue){[ 0.00000 0.00000 0.00000]};
&color(blue){[ -0.12500 0.041667 0.50000]};
*** SVD分解 [#j98fb7f8]
固有値を使った主成分分析は正方行列しか使えないため、n, m...
$$
\mathbf{A} = \mathbf{U}\mathbf{S}\mathbf{V}^{T}
$$
となるU, S, Vを計算するのが、SVD関数です。
sage入力:
#pre{{
m = matrix(RDF, 2, range(6)); m
}}
&color(blue){[0.0 1.0 2.0]};
&color(blue){[3.0 4.0 5.0]};
#pre{{
U,S,V = m.SVD(algorithm='numpy')
print 'U'
print U
print 'S'
print S
print 'V'
print V
}}
&color(blue){U};
&color(blue){[-0.274721127897 -0.961523947641]};
&color(blue){[-0.961523947641 0.274721127897]};
&color(blue){S};
&color(blue){[7.34846922835 0.0 0.0]};
&color(blue){[ 0.0 1.0 0.0]};
&color(blue){V};
&color(blue){[-0.392540507864 0.824163383692 0.40824829...
&color(blue){[-0.560772154092 0.137360563949 -0.81649658...
&color(blue){[ -0.72900380032 -0.549442255795 0.40824829...
計算された\( \mathbf{U}\mathbf{S}\mathbf{V}^{T} \)もかな...
sage入力:
#pre{{
U*S*V.transpose()
}}
&color(blue){[9.99200722163e-16 1.0 ...
&color(blue){[ 3.0 4.0 ...
固有値の時と同様に、2番目の固有値に0.5を掛けてU*SS*V.tran...
sage入力:
#pre{{
SS = matrix(2, 3, [7.34846922835, 0, 0, 0, 1*0.5, 0]); SS
}}
&color(blue){[ 7.34846922835000 0.000000000000000 0.00000...
&color(blue){[0.000000000000000 0.500000000000000 0.00000...
残差も割合小さく、ある程度Aを表現していることが見て取れま...
sage入力:
#pre{{
print "A'"
print n(U*SS*V.transpose(), digits=5)
print '残差'
print n(m-U*SS*V.transpose(), digits=5)
}}
&color(blue){A};
&color(blue){[0.39623 1.0660 1.7358]};
&color(blue){[ 2.8868 3.9811 5.0755]};
&color(blue){残差};
&color(blue){[ -0.39623 -0.066038 0.26415]};
&color(blue){[ 0.11321 0.018868 -0.075472]};
** コメント [#habd2433]
#vote(おもしろかった[23],そうでもない[0],わかりずらい[0])
皆様のご意見、ご希望をお待ちしております。
#comment_kcaptcha
終了行:
[[FrontPage]]
#contents
2009/11/16からのアクセス回数 &counter;
このページで紹介したsageノートブックは、以下のURLから参照...
http://www.sagenb.org/home/pub/1049/
** リスト [#u1341581]
pythonのリストについて簡単に説明します。
pythonでリストは、項目をカンマ区切りで並べたリストをカギ...
空のリストは
[]
になります。
変数l1に1, 2, 3, 4の4個の要素をリストにセットするときは、...
sage入力:
#pre{{
# リストの処理
l1 = [1, 2, 3, 4]
}}
リストの要素およびサブリストは、以下のように取り出します...
#pre{{
要素: リスト[要素のインデックス]
指定範囲のサブリスト: リスト[開始インデックス:終了インデ...
指定以降のサブリスト: リスト[開始インデックス:]
先頭から指定までのサブリスト: リスト[:終了インデックス] ·...
}}
sage入力:
#pre{{
print l1[2]
print l1[1:3]
print l1[2:]
print l1[:2]
}}
&color(blue){3};
&color(blue){[2, 3]};
&color(blue){[3, 4]};
&color(blue){[1, 2]};
リストの連結は、+で行います。
sage入力:
#pre{{
l2 = [9, 8, 7]
l1 + l2
}}
&color(blue){[1, 2, 3, 4, 9, 8, 7]};
範囲生成関数rangeを使うと簡単に指定した範囲のリストを生成...
#pre{{
range(終了) : 0から終了の前までの整数のリストを生成します
range(開始, 終了) : 開始インデックスから終了インデックス...
range(開始, 終了, 増分) : 開始から終了の前までの値を増分...
}}
以下にrangeの例を示します。
sage入力:
#pre{{
print range(3)
print range(1, 4)
print range(-1, 7, 2)
}}
&color(blue){[0, 1, 2]};
&color(blue){[1, 2, 3]};
&color(blue){[-1, 1, 3, 5]};
リスト内包は、式とそれにつづくfor節からなり、各要素に対し...
以下の例は、リストl1の各要素の自乗を要素とするリストを返...
sage入力:
#pre{{
[s^2 for s in l1]
}}
&color(blue){[1, 4, 9, 16]};
同様の処理をfor文を使って処理スト以下のようになります。リ...
sage入力:
#pre{{
l3=[]
for s in l1:
l3.append(s^2)
print l3
}}
&color(blue){[1, 4, 9, 16]};
もう一つ、各要素のルートを取る例を示します。
+ sqrtを式のままリストに保持
+ sqrtの値を5桁の数値で保持
+ リストを整形して出力した場合
sage入力:
#pre{{
s1 = [sqrt(s) for s in l1]
print s1
print [n(s, digits=5) for s in s1]
view(s1)
}}
&color(blue){[1, sqrt(2), sqrt(3), 2]};
&color(blue){[1.0000, 1.4142, 1.7320, 2.0000]};
&color(blue){[1,√2,√3,2]};
2つのリストの各要素をリストとして結合したい場合に、zipを...
以下の例では、数値と文字のリストをzipで結合します。
sage入力:
#pre{{
t1 = ['a', 'b', 'c', 'd']
print t1
zip(l1, t1)
}}
&color(blue){['a', 'b', 'c', 'd']};
&color(blue){[(1, 'a'), (2, 'b'), (3, 'c'), (4, 'd')]};
sum関数は、リストの値の和を返します。
sage入力:
#pre{{
# l1の1文字目はLです!
sum(l1)
}}
&color(blue){10};
flattenは、入れ子になったリストのすべての要素を1個のリス...
sage入力:
#pre{{
print [l1, l2]
flatten([l1+l2])
}}
&color(blue){[[1, 2, 3, 4], [9, 8, 7]]};
&color(blue){[1, 2, 3, 4, 9, 8, 7]};
*** リストプロット [#ge5de664]
これで、ようやくリストプロットの例を説明することができま...
list_plot(プロットするリスト)
0から24までの値の自乗の値をプロットします。
sage入力:
#pre{{
list_plot([i^2 for i in range(25)], xmax=25)
}}
&ref(sage0.png);
リストの値を線で連結する場合、plotjoined=trueを指定します。
#pre{{
list_plot([i^2 for i in range(25)], xmax=25, plotjoined=t...
}}
&ref(sage0-1.png);
** ベクトルと行列 [#qe68f663]
*** ベクトルの生成 [#wb4bfdf9]
ベクトルは、vector関数で生成します。
#pre{{
vector(値のリスト)
または、
vector(環, 値のリスト)
}}
以下は、\(v=(2, 1, 3), v=(1, 1,-4)\)生成しています。環に...
sage入力:
#pre{{
# ベクトルと行列
v = vector([2,1,3]); v
}}
&color(blue){(2, 1, 3)};
#pre{{
w = vector([1,1,-4]); w
}}
&color(blue){(1, 1, -4)};
*** ベクトルの内積 [#h62c8c6d]
ベクトルの内積\(\mathbf{v}\cdot\mathbf{w}\)は、dot_produc...
よく知られているようにベクトルの内積は、
$$
\mathbf{v}\cdot\mathbf{w} = |\mathbf{v}||\mathbf{w}|cos(\...
$$
で表されます。
sage入力:
#pre{{
v.dot_product(w)
}}
&color(blue){-9};
*** ベクトルの外積 [#m2a49e83]
同様にベクトルの外積\(\mathbf{v}\times\mathbf{w}\)は、cro...
ベクトルの外積の大きさは、
$$
|\mathbf{v}\times\mathbf{w}| = |\mathbf{v}||\mathbf{w}|si...
$$
であり、その方向は、ベクトルvからベクトルwにねじを回して...
sage入力:
#pre{{
v.cross_product(w)
}}
&color(blue){(-7, 11, 1)};
*** 行列の生成 [#wede82bc]
行列は、matrix関数で生成します。
#pre{{
matrix(行列の要素のリスト)
または
matrix(環, 行列の要素のリスト)
}}
sage入力:
#pre{{
A = matrix([[1,2,3],[3,2,1],[1,2,1]]); A
}}
&color(blue){[1 2 3]};
&color(blue){[3 2 1]};
&color(blue){[1 2 1]};
行列、ベクトルの積は、*を使って表現します。
sage入力:
#pre{{
w*A
}}
&color(blue){(0, -4, 0)};
*** 行列の解 [#q12d05d4]
solve_right関数を使って行列の解を得ることができます。
$$
\mathbf{A}\mathbf{X} = \mathbf{Y}
$$
となるようなXを求めるのが、solve_right関数です。
sage入力:
#pre{{
Y = vector([0,-4,-1])
}}
#pre{{
X = A.solve_right(Y); X
}}
&color(blue){(-3/2, 0, 1/2)};
\(\mathbf{A}\mathbf{X}\)を計算して、解が正しいことを確認...
sage入力:
#pre{{
A*X
}}
&color(blue){(0, -4, -1)};
*** 転置行列 [#ma7c8f16]
転置行列は、transpose関数で取得できます。
転置行列の性質は、
- \( (\mathbf{A}^T)^T = \mathbf{A} \)
- \( (\mathbf{A}^T)^T = \mathbf{A} \)
- \( (\mathbf{A}\mathbf{B})^T = \mathbf{B}^T\mathbf{A}^T ...
最後の、転置行列の積の掛ける順序を変えるための公式には、...
sage入力:
#pre{{
A.transpose()
}}
&color(blue){[1 3 1]};
&color(blue){[2 2 2]};
&color(blue){[3 1 1]};
*** 行列式 [#jd644480]
行列式、det関数で取得できます。
行列式は、逆行列の計算に使われるので、よく逆行列が存在す...
sage入力:
#pre{{
A.det()
}}
&color(blue){8};
*** 逆行列 [#ua62d94d]
逆行列は、inverse関数で取得できます。
- \( (\mathbf{A}^{-1})^{-1} = \mathbf{A} \)
- \( (\mathbf{A}^{T})^{-1} = (\mathbf{A}^{-1})^T \)
- \( (\mathbf{A}\mathbf{B})^{-1} = \mathbf{B}^{-1}\mathbf...
です。
sage入力:
#pre{{
A.inverse()
}}
&color(blue){[ 0 1/2 -1/2]};
&color(blue){[-1/4 -1/4 1]};
&color(blue){[ 1/2 0 -1/2]};
*** 単位行列 [#g417f2cf]
単位行列は、identity_matrixで生成します。
sage入力:
#pre{{
identity_matrix(3)
}}
&color(blue){[1 0 0]};
&color(blue){[0 1 0]};
&color(blue){[0 0 1]};
*** 対角行列 [#x731d466]
対角行列は、diagonal_matrixで生成します。
#pre{{
diagonal_matrix(対角要素のリスト)
}}
sage入力:
#pre{{
D = diagonal_matrix([1, 2, 3]); D
}}
&color(blue){[1 0 0]};
&color(blue){[0 2 0]};
&color(blue){[0 0 3]};
*** 環 [#h5d357e8]
環は、数の集合を表します。
よく使われる環を以下に示します。
- 整数: ZZ
- 実数: R
- 有理数: QQ
- 複素数: CC
- 倍精度小数(real double): RDF
です。
以下に有理数の環を使って行列を生成する例を示します。
sage入力:
#pre{{
A = matrix(QQ,3,3,[[2, 4, 0],[3, 1, 0], [0, 1, 1]]); A
}}
&color(blue){[2 4 0]};
&color(blue){[3 1 0]};
&color(blue){[0 1 1]};
*** 固有値解析 [#x55f6bb1]
固有値と固有ベクトルは、
\( \mathbf{A}\mathbf{x} = \lambda\mathbf{x} \)が0ベクト...
固有値は、
$$
det(\mathbf{M} - \lambda\mathbf{E}) = 0
$$
の解です。
sageで固有値と固有ベクトルを取得するには、eigenmatrix_lef...
先に定義した\( \mathbf{A} \)の固有値と固有ベクトルをeigen...
eigenmatrix_rightは、定義とすこし違いP*self = P*DとなるD...
Dの対角成分が固有値で、Pの各列が固有値に対応する固有ベク...
固有値解析の場合、固有値の大きな順に固有ベクトルを計算し...
sage入力:
#pre{{
D, P = A.eigenmatrix_right()
print "D="
print D
print "P="
print P
}}
&color(blue){D=};
&color(blue){[ 5 0 0]};
&color(blue){[ 0 1 0]};
&color(blue){[ 0 0 -2]};
&color(blue){P=};
&color(blue){[ 1 0 1]};
&color(blue){[ 3/4 0 -1]};
&color(blue){[3/16 1 1/3]};
eigenmatrix_rightを確認するために、A*P == D*Pを確認してみ...
sage入力:
#pre{{
A*P == P*D # ~Pは、P.inverse()の省略形
}}
&color(blue){True};
主成分分析では、固有値の大きなものを使って処理するため、P...
sage入力:
#pre{{
D, P = A.eigenmatrix_left()
print "D="
print D
print "P="
print P
}}
&color(blue){D=};
&color(blue){[ 5 0 0]};
&color(blue){[ 0 1 0]};
&color(blue){[ 0 0 -2]};
&color(blue){P=};
&color(blue){[ 1 1 0]};
&color(blue){[ 1 -1/3 -4]};
&color(blue){[ 1 -4/3 0]};
元となるAは、\( \mathbf{A} = \mathbf{P}^{-1}\mathbf{D}'\m...
どの固有値までがもとになるAを表現するかを、固有値に係数を...
sage入力:
#pre{{
A == (~P)*D*P # ~Pは、Pの逆行列
}}
&color(blue){True};
求まった固有値の、絶対値の一番小さな1に対して0.5を掛けて...
sage入力:
#pre{{
D=matrix([[5,0,0],[0,1*0.5,0],[0,0,-2]]) # 第2項に0.5を掛...
}}
#pre{{
print '(~P)*D*P'
print (~P)*D*P
print 'A-(~P)*D*P'
n(A-(~P)*D*P, digits=5)
}}
&color(blue){(~P)*D*P};
&color(blue){[ 2.00000000000000 4.00000000000000 0.00000...
&color(blue){[ 3.00000000000000 1.00000000000000 0.00000...
&color(blue){[0.125000000000000 0.958333333333333 0.50000...
&color(blue){A-(~P)*D*P};
&color(blue){[4.4409e-16 4.4409e-16 0.00000]};
&color(blue){[ 0.00000 0.00000 0.00000]};
&color(blue){[ -0.12500 0.041667 0.50000]};
*** SVD分解 [#j98fb7f8]
固有値を使った主成分分析は正方行列しか使えないため、n, m...
$$
\mathbf{A} = \mathbf{U}\mathbf{S}\mathbf{V}^{T}
$$
となるU, S, Vを計算するのが、SVD関数です。
sage入力:
#pre{{
m = matrix(RDF, 2, range(6)); m
}}
&color(blue){[0.0 1.0 2.0]};
&color(blue){[3.0 4.0 5.0]};
#pre{{
U,S,V = m.SVD(algorithm='numpy')
print 'U'
print U
print 'S'
print S
print 'V'
print V
}}
&color(blue){U};
&color(blue){[-0.274721127897 -0.961523947641]};
&color(blue){[-0.961523947641 0.274721127897]};
&color(blue){S};
&color(blue){[7.34846922835 0.0 0.0]};
&color(blue){[ 0.0 1.0 0.0]};
&color(blue){V};
&color(blue){[-0.392540507864 0.824163383692 0.40824829...
&color(blue){[-0.560772154092 0.137360563949 -0.81649658...
&color(blue){[ -0.72900380032 -0.549442255795 0.40824829...
計算された\( \mathbf{U}\mathbf{S}\mathbf{V}^{T} \)もかな...
sage入力:
#pre{{
U*S*V.transpose()
}}
&color(blue){[9.99200722163e-16 1.0 ...
&color(blue){[ 3.0 4.0 ...
固有値の時と同様に、2番目の固有値に0.5を掛けてU*SS*V.tran...
sage入力:
#pre{{
SS = matrix(2, 3, [7.34846922835, 0, 0, 0, 1*0.5, 0]); SS
}}
&color(blue){[ 7.34846922835000 0.000000000000000 0.00000...
&color(blue){[0.000000000000000 0.500000000000000 0.00000...
残差も割合小さく、ある程度Aを表現していることが見て取れま...
sage入力:
#pre{{
print "A'"
print n(U*SS*V.transpose(), digits=5)
print '残差'
print n(m-U*SS*V.transpose(), digits=5)
}}
&color(blue){A};
&color(blue){[0.39623 1.0660 1.7358]};
&color(blue){[ 2.8868 3.9811 5.0755]};
&color(blue){残差};
&color(blue){[ -0.39623 -0.066038 0.26415]};
&color(blue){[ 0.11321 0.018868 -0.075472]};
** コメント [#habd2433]
#vote(おもしろかった[23],そうでもない[0],わかりずらい[0])
皆様のご意見、ご希望をお待ちしております。
#comment_kcaptcha
ページ名:
SmartDoc