繁体   English   中英

python中的特征向量给出看似随机的元素符号

[英]Eigen vectors in python giving seemingly random element-wise signs

我正在运行以下代码:

import numpy as np
import matplotlib
matplotlib.use("TkAgg")
import matplotlib.pyplot as plt

N = 100
t = 1

a1 = np.full((N-1,), -t)
a2 = np.full((N,), 2*t)
Hamiltonian = np.diag(a1, -1) +  np.diag(a2) + np.diag(a1, 1)

eval, evec = np.linalg.eig(Hamiltonian)
idx = eval.argsort()[::-1]
eval, evec = eval[idx], evec[:,idx]

wave2 = evec[2] / np.sum(abs(evec[2]))
prob2 = evec[2]**2 / np.sum(evec[2]**2)

_ = plt.plot(wave2)
_ = plt.plot(prob2)
plt.show()

而出现的情节是这样的: 在此输入图像描述

但是我希望蓝线也是一个海人。 这让我感到困惑,我无法找到导致突然改变标志的原因。 绘制函数绝对显示与每个x相关的值都很好,但符号被搞砸了。

关于可能导致此问题或如何解决问题的任何想法?

这是您脚本的修改版本,可以满足您的期望。 变化是:

  • 修正了特征向量的索引; 它们是evec的专栏。
  • 使用np.linalg.eigh而不是np.linalg.eig 这不是绝对必要的,但您也可以使用更高效的代码。
  • 不要颠倒已排序的特征值的顺序。 我保持特征值从最低到最高排序。 因为eigh以递增的顺序返回特征值,所以我只是注释掉了对特征值进行排序的代码。

(只有第一个更改是必需的更正。)


import numpy as np
import matplotlib
import matplotlib.pyplot as plt

N = 100
t = 1

a1 = np.full((N-1,), -t)
a2 = np.full((N,), 2*t)
Hamiltonian = np.diag(a1, -1) +  np.diag(a2) + np.diag(a1, 1)

eval, evec = np.linalg.eigh(Hamiltonian)
#idx = eval.argsort()[::-1]
#eval, evec = eval[idx], evec[:,idx]

k = 2
wave2 = evec[:, k] / np.sum(abs(evec[:, k]))
prob2 = evec[:, k]**2 / np.sum(evec[:, k]**2)

_ = plt.plot(wave2)
_ = plt.plot(prob2)
plt.show()

剧情:

情节

我可能错了,但它们都不是有效的特征向量/值吗? 符号无关紧要,因为特征向量的定义是:

在线性代数中,线性变换的特征向量或特征向量是非零向量,其仅在对其应用线性变换时通过整体尺度改变。

仅仅因为比例是负的并不意味着它无效。

看到这篇文章关于Matlab的eig有类似的问题

解决这个问题的一种方法是简单地为开始选择一个符号,并将everthing乘以不符合该符号的-1(或者取每个元素的abs并乘以预期的符号)。 对于你的结果,这应该工作(没有什么交叉0)。

无论是matlab还是numpy都不关心你要解决的问题,它的简单数学表明两个有符号的特征向量/值组合都是有效的,你的值是正弦的,它只是存在两组有效的特征向量/值(负面和正面) )

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM