- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在使用 scipy.sparse.linalg.eigsh()
来解决广义特征值问题。我想使用 eigsh()
因为我正在操作一些大型稀疏矩阵。问题是我无法得到正确的答案,并且 eigsh()
输出的特征值和特征向量与我从 Matlab 的 eigs()
得到的完全不同。
它看起来像这样:数据:
a:
304.7179 103.1667 36.9583 61.3478 11.5724
35.5242 111.4789 -9.8928 8.2586 -4.7405
10.8358 4.3433 145.6586 26.5153 13.1871
-1.1924 -2.5430 0.4322 43.1886 -0.6098
-18.7751 -8.8031 -4.3962 -5.8791 17.6588
b:
736.9822 615.7946 587.6828 595.7169 545.1878
615.7946 678.2142 575.7579 587.3469 524.7201
587.6828 575.7579 698.6223 593.5402 534.3675
595.7169 587.3469 593.5402 646.0410 530.1114
545.1878 524.7201 534.3675 530.1114 590.1373
在Python中:a,b 是 numpy.ndarray
In [11]: import scipy.sparse.linalg as lg
In [14]: x,y=lg.eigsh(a,M=b,k=2,which='SM')
In [15]: x
Out[15]: array([ 0.01456738, 0.22578463])
In [16]: y
Out[16]:
array([[ 0.00052614, 0.00807034],
[ 0.00514091, -0.01593113],
[ 0.00233622, -0.00429671],
[ 0.01877451, -0.06259276],
[ 0.01491696, 0.08002341]])
In [18]: a.dot(y[:,0])-x[0]*b.dot(y[:,0])
Out[18]: array([ 1.74827445, 0.30325634, 0.71299604, 0.42842245, -0.24724681])
In [19]: a.dot(y[:,1])-x[1]*b.dot(y[:,1])
Out[19]: array([-2.2463206 , -1.64704567, -0.80086734, -1.56796329, 0.03027861])
可以看出,特征值和特征向量不足以重构原始矩阵。
但是,在 MATLAB 中它运行良好:
[y,x] = eigs(a,b,2,'sm');
y =
0.0037 -0.0141
-0.0056 0.0151
0.0015 0.0079
-0.0117 0.0666
-0.0298 -0.0753
x =
0.0202 0
0 0.3499
a*x(:,1)-y(1,1)*b*x(:,1)
ans =
1.0e-14 *
-0.3775
0.0777
0.0777
0.0555
0.0666
另外,数据 b 是正定的:
In [24]: np.linalg.eigvals(b)
Out[24]:
array([ 2951.07297125, 137.81545217, 90.40223937, 107.04818229,
63.65818086])
有人可以解释为什么我无法在 python 中得到正确的答案吗?
<小时/>使用 lg.eigs()
我们确实得到了与 MATLAB 中相同的输出。但是......当矩阵变得像这样大时就会出现问题:
在 MATLAB 中我们有这样的东西:
>> [x,y] = eigs(A,B,4,'sm');
y =
0.0001 0 0 0
0 0.0543 0 0
0 0 0.1177 0
0 0 0 0.1350
在 python(python3.5.2,scipy1.0.0) 中使用 lg.eigs(A,M=B,k=4,which='SM')
时,其特征值如下:
array([ 4.43277284e+51 +0.00000000e+00j,
1.04797857e+48 +8.30096152e+47j,
1.04797857e+48 -8.30096152e+47j, -1.45582240e+31 +0.00000000e+00j])
最佳答案
正如 Paul Panzer 所说,“eigsh”中的“h”代表 Hermitian ,你的矩阵 A 不是。 (此外,具有正特征值并不意味着是正定的;只有当矩阵一开始就是埃尔米特矩阵时,这才是正确的。)方法 eigsh
不会检查输入是否为埃尔米特矩阵;而是会检查输入是否为埃尔米特矩阵。它只是遵循一个假设的过程;所以当假设失败时,输出是不正确的。
使用 eigs 方法产生与 Matlab 相同的结果:
x, y = lg.eigs(a,M=b,k=2,which='SM')
np.real(x), np.real(y) # x and y have tiny imaginary parts due to float math errors
(array([ 0.02022333, 0.34993346]),
array([[-0.00368007, -0.0140898 ],
[ 0.0056435 , 0.01509067],
[-0.00154725, 0.00790518],
[ 0.01170563, 0.06664118],
[ 0.02981777, -0.07528778]]))
当然,eigs
的运行时间比 eigsh
要长得多。
您的第二个示例是一个 34 x 34 密集 矩阵,它根本没有零。在其上使用稀疏线性代数是不合理的;并且有一个警告说该方法没有收敛。常规线性代数模块运行良好。
import scipy.linalg as la
sorted_eigenvals = np.sort(np.real(la.eigvals(Am, Bm)))
这会返回
5.90947734e-05, 5.42521180e-02, 1.17669899e-01, 1.34952286e-01, ...
与您引用的 MATLAB 输出一致(Matlab 对数字进行四舍五入除外)
0.0001, 0.0543, 0.1177, 0.1350
关于python - scipy.sparse.linalg.eigsh() 不会给出与 Matlab 的 eigs() 相同的结果,为什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47854967/
我正在处理一组标记为 160 个组的 173k 点。我想通过合并最接近的(到 9 或 10 个组)来减少组/集群的数量。我搜索过 sklearn 或类似的库,但没有成功。 我猜它只是通过 knn 聚类
我有一个扁平数字列表,这些数字逻辑上以 3 为一组,其中每个三元组是 (number, __ignored, flag[0 or 1]),例如: [7,56,1, 8,0,0, 2,0,0, 6,1,
我正在使用 pipenv 来管理我的包。我想编写一个 python 脚本来调用另一个使用不同虚拟环境(VE)的 python 脚本。 如何运行使用 VE1 的 python 脚本 1 并调用另一个 p
假设我有一个文件 script.py 位于 path = "foo/bar/script.py"。我正在寻找一种在 Python 中通过函数 execute_script() 从我的主要 Python
这听起来像是谜语或笑话,但实际上我还没有找到这个问题的答案。 问题到底是什么? 我想运行 2 个脚本。在第一个脚本中,我调用另一个脚本,但我希望它们继续并行,而不是在两个单独的线程中。主要是我不希望第
我有一个带有 python 2.5.5 的软件。我想发送一个命令,该命令将在 python 2.7.5 中启动一个脚本,然后继续执行该脚本。 我试过用 #!python2.7.5 和http://re
我在 python 命令行(使用 python 2.7)中,并尝试运行 Python 脚本。我的操作系统是 Windows 7。我已将我的目录设置为包含我所有脚本的文件夹,使用: os.chdir("
剧透:部分解决(见最后)。 以下是使用 Python 嵌入的代码示例: #include int main(int argc, char** argv) { Py_SetPythonHome
假设我有以下列表,对应于及时的股票价格: prices = [1, 3, 7, 10, 9, 8, 5, 3, 6, 8, 12, 9, 6, 10, 13, 8, 4, 11] 我想确定以下总体上最
所以我试图在选择某个单选按钮时更改此框架的背景。 我的框架位于一个类中,并且单选按钮的功能位于该类之外。 (这样我就可以在所有其他框架上调用它们。) 问题是每当我选择单选按钮时都会出现以下错误: co
我正在尝试将字符串与 python 中的正则表达式进行比较,如下所示, #!/usr/bin/env python3 import re str1 = "Expecting property name
考虑以下原型(prototype) Boost.Python 模块,该模块从单独的 C++ 头文件中引入类“D”。 /* file: a/b.cpp */ BOOST_PYTHON_MODULE(c)
如何编写一个程序来“识别函数调用的行号?” python 检查模块提供了定位行号的选项,但是, def di(): return inspect.currentframe().f_back.f_l
我已经使用 macports 安装了 Python 2.7,并且由于我的 $PATH 变量,这就是我输入 $ python 时得到的变量。然而,virtualenv 默认使用 Python 2.6,除
我只想问如何加快 python 上的 re.search 速度。 我有一个很长的字符串行,长度为 176861(即带有一些符号的字母数字字符),我使用此函数测试了该行以进行研究: def getExe
list1= [u'%app%%General%%Council%', u'%people%', u'%people%%Regional%%Council%%Mandate%', u'%ppp%%Ge
这个问题在这里已经有了答案: Is it Pythonic to use list comprehensions for just side effects? (7 个答案) 关闭 4 个月前。 告
我想用 Python 将两个列表组合成一个列表,方法如下: a = [1,1,1,2,2,2,3,3,3,3] b= ["Sun", "is", "bright", "June","and" ,"Ju
我正在运行带有最新 Boost 发行版 (1.55.0) 的 Mac OS X 10.8.4 (Darwin 12.4.0)。我正在按照说明 here构建包含在我的发行版中的教程 Boost-Pyth
学习 Python,我正在尝试制作一个没有任何第 3 方库的网络抓取工具,这样过程对我来说并没有简化,而且我知道我在做什么。我浏览了一些在线资源,但所有这些都让我对某些事情感到困惑。 html 看起来
我是一名优秀的程序员,十分优秀!