質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

1回答

2510閲覧

Pythonの数値計算の固有ベクトルがうまく求められません

yukke428

総合スコア11

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2019/09/12 10:14

イメージ説明

この画像の行列についてKLTを行いたいのですが、ρ=1.0 のときにうまく動きません。
どこが悪いのかわかる人がいたら教えていただきたいです。

Python

1#Assignment2 2import numpy as np 3import matplotlib.pyplot as plt 4from pylab import rcParams 5 6N=10 7prod_rho_list=[0.9,0.91,0.92,0.93,0.94,0.95,0.96,0.97,0.98,0.99,1.0] 8 9V_list=[] 10for prod_rho in prod_rho_list: 11 Cmodel=np.eye(N) 12 for i in range(N-1): 13 if i==0: 14 rho=prod_rho 15 else: 16 rho*=prod_rho 17 18 add_matrix=rho*np.eye(N-i-1) 19 add2_matrix=rho*np.eye(N-i-1) 20 add_matrix=np.hstack([np.zeros((N-i-1,1+i)),add_matrix]) 21 add2_matrix=np.hstack([add2_matrix,np.zeros((N-i-1,1+i))]) 22 add_matrix=np.vstack([add_matrix,np.zeros((1+i,N))]) 23 add2_matrix=np.vstack([np.zeros((1+i,N)),add2_matrix]) 24 Cmodel+=add_matrix 25 Cmodel+=add2_matrix 26 #print(Cmodel) 27 28 S, V = np.linalg.eig(Cmodel) 29 30 V_list.append(V) 31 32rcParams['figure.figsize'] = 10,10 33fig=plt.figure() 34for i in range(11): 35 fig.add_subplot(6, 2, i+1) 36 plt.imshow(V_list[i]) 37 plt.title(prod_rho_list[i]) 38plt.tight_layout() 39plt.show() 40 41 42

近似的には次のコードを実行した結果が得られるはずです。

Python

1V_COS=np.zeros((N,N)) 2for i in range(N): 3 for j in range(N): 4 if j==0: 5 V_COS[i][j]=np.sqrt(1/N)*np.cos(((2*(i+1)-1)*((j+1)-1)*np.pi)/(2*N)) 6 else: 7 V_COS[i][j]=np.sqrt(2/N)*np.cos(((2*(i+1)-1)*((j+1)-1)*np.pi)/(2*N)) 8 9rcParams['figure.figsize'] = 10,4 10plt.imshow(V_COS) 11コード

よろしくお願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

Pythonの数値計算の固有ベクトルがうまく求められません
ρ=1.0 のときにうまく動きません。

KLT がなんなのかわかりませんが、固有値自体は正しく求められています。

ρ=1 のとき、n x n の行列 C はすべての要素が1の行列になります。
その行列の固有値は重複を含めて 0, n の2つになります。

linear algebra - What are the eigenvalues of matrix that have all elements equal 1? - Mathematics Stack Exchange

実際、確認してみると、正しく求められていることがわかります。

python

1import matplotlib.pyplot as plt 2import numpy as np 3 4np.set_printoptions(precision=2) 5 6C = np.ones((10, 10)) 7w, v = np.linalg.eig(C) 8 9for i in range(len(w)): 10 eigen_val = w[i] 11 eigen_vec = v[:, i] 12 13 print(f"{i}-th eigen value: {eigen_val:.2f}") 14 print(f"{i}-th eigen vector: {eigen_vec}") 15 print(f"x1 + x2 + … xn = {eigen_vec.sum():.2f}\n") 16 17fig, ax = plt.subplots() 18ax.imshow(eigen_vecs.T) 19 20plt.show()

追記

imshowで描画したときにρ=1.0のときの図を見ておかしいと思ったのですが、やっぱりあってますよね...

imshow の結果もおかしいとは思いません。

numpy.linalg.eig は固有値の一覧 w と各列が固有ベクトルの行列 v を返します。例えば、固有値 w[i] に対応する固有ベクトルは v の第 i 列目 v[:, i] です。

すべての要素が1の n x n 行列の重複含めて n 個の固有値は0が n - 1 個と n が1個です。
固有値0に対応する固有ベクトル x は、x_1 + x_2 + … + x_n = 0 を満たすベクトル x です。(x_1, x_2, …, x_n はベクトル x の各成分)
固有値nに対応する固有ベクトル x は、x_1 = x_2 = … = x_n を満たすベクトル x です。

実際、結果を確認すると、

  • 固有値0が9個、対応する固有ベクトルの成分の和は0
  • 固有値10は1個、対応する固有ベクトルの成分はすべて同じ値

になっており、理論通りであることが確認できます。

0-th eigen value: 0.00 0-th eigen vector: [-0.95 0.11 0.11 0.11 0.11 0.11 0.11 0.11 0.11 0.11] x1 + x2 + … xn = -0.00 1-th eigen value: 10.00 1-th eigen vector: [0.32 0.32 0.32 0.32 0.32 0.32 0.32 0.32 0.32 0.32] x1 + x2 + … xn = 3.16 2-th eigen value: 0.00 2-th eigen vector: [ 0. -0.33 0.92 -0.08 -0.08 -0.08 -0.08 -0.08 -0.08 -0.08] x1 + x2 + … xn = -0.00 3-th eigen value: 0.00 3-th eigen vector: [ 0. -0.33 -0.08 0.92 -0.08 -0.08 -0.08 -0.08 -0.08 -0.08] x1 + x2 + … xn = -0.00 4-th eigen value: 0.00 4-th eigen vector: [ 0. -0.33 -0.08 -0.08 0.92 -0.08 -0.08 -0.08 -0.08 -0.08] x1 + x2 + … xn = 0.00 5-th eigen value: 0.00 5-th eigen vector: [ 0. -0.33 -0.08 -0.08 -0.08 0.92 -0.08 -0.08 -0.08 -0.08] x1 + x2 + … xn = 0.00 6-th eigen value: 0.00 6-th eigen vector: [ 0. -0.33 -0.08 -0.08 -0.08 -0.08 0.92 -0.08 -0.08 -0.08] x1 + x2 + … xn = 0.00 7-th eigen value: 0.00 7-th eigen vector: [ 0. -0.33 -0.08 -0.08 -0.08 -0.08 -0.08 0.92 -0.08 -0.08] x1 + x2 + … xn = 0.00 8-th eigen value: 0.00 8-th eigen vector: [ 0. -0.33 -0.08 -0.08 -0.08 -0.08 -0.08 -0.08 0.92 -0.08] x1 + x2 + … xn = 0.00 9-th eigen value: 0.00 9-th eigen vector: [ 0. -0.33 -0.08 -0.08 -0.08 -0.08 -0.08 -0.08 -0.08 0.92] x1 + x2 + … xn = 0.00

イメージ説明

図を見ると上から2行目の固有値10の固有ベクトルの成分はすべて同じ値なので同じ色になっています。

投稿2019/09/12 10:43

編集2019/09/12 15:38
tiitoi

総合スコア21956

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yukke428

2019/09/12 13:17

imshowで描画したときにρ=1.0のときの図を見ておかしいと思ったのですが、やっぱりあってますよね... ちょっと考察してみたいと思います。ありがとうございます。
tiitoi

2019/09/12 15:37

追記しましたが、plt.imshow(V_list[i]) で表示している固有ベクトルの図もおかしくはないです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問