java特征向量计算_用Java和Python计算特征向量的差异

本文探讨了在Java的Apache Commons Math 3库和Python的numpy库中计算特征向量的区别。尽管两者都能处理非对称矩阵,但结果的规范化和表示方式存在差异。Java的特征向量需要通过特定的标量乘法转换才能匹配numpy的结果,这主要是由于特征向量的非唯一性和不同库的规范化标准。文章通过具体的计算示例展示了如何调整Java的特征向量以与numpy保持一致。
摘要由CSDN通过智能技术生成

在Apache Commons Math 3中,EigenDecomposition接受非对称矩阵,但它使用RealVector和RealMatrix类返回结果.要获得实际的复杂结果,您必须将适当的实际结果组合成复杂的共轭对.

在特征向量的情况下,您得到:

eigenvector[0] = {-0.8660254038; 0}

eigenvector[1] = {0.5; 1}

这两个向量都与复合共轭特征值对相关联getRealEigenvalue(0)getImagEigenvalue(0)* i和getRealEigenvalue(1)getImagEigenvalue(1)* i,但这些向量不是实际的特征向量.实际的特征向量是复共轭对

特征向量[0]特征向量[1] * i和特征向量[0] – 特征向量[1] * i.

那些向量仍然不匹配numpy返回的结果,但这是因为这两个库没有使用相同的规范化.特征向量不是唯一的;特征向量乘以任何非零标量(包括复数标量)仍然是特征向量. Java结果和numpy结果之间的唯一区别是标量乘数.

为方便起见,我将浮点值转换为它们的确切值.也就是说,-0.8660254038是-sqrt(3)/ 2的浮点近似. Java数学库提供以下特征向量:

[-sqrt(3)/2 + (1/2)*i] and [-sqrt(3)/2 - (1/2)*i]

[ 0 + 1*i] [ 0 - 1*i]

如果你将第一个特征向量乘以 – (sqrt(2)/ 2)* i和第二个乘以(sqrt(2)/ 2)* i,你将得到numpy返回的特征向量.

这是一个带有该计算的ipython会话. v1和v2是上面显示的向量.

In [20]: v1 = np.array([-np.sqrt(3)/2 + 0.5j, 1j])

In [21]: v1

Out[21]: array([-0.8660254+0.5j, 0.0000000+1.j ])

In [22]: v2 = np.array([-np.sqrt(3)/2 - 0.5j, -1j])

In [23]: v2

Out[23]: array([-0.8660254-0.5j, 0.0000000-1.j ])

将v1乘以 – (sqrt(2)/ 2)* i得到numpy.linalg.eig返回的第一个特征向量:

In [24]: v1*(-np.sqrt(2)/2*1j)

Out[24]: array([ 0.35355339+0.61237244j, 0.70710678-0.j ])

将v2乘以(sqrt(2)/ 2)* i得到numpy.linalg.eig返回的第二个特征向量:

In [25]: v2*(np.sqrt(2)/2*1j)

Out[25]: array([ 0.35355339-0.61237244j, 0.70710678+0.j ])

为方便起见,这里是numpy计算的重复. evecs列是特征向量.

In [28]: evals, evecs = np.linalg.eig(a)

In [29]: evecs

Out[29]:

array([[ 0.35355339+0.61237244j, 0.35355339-0.61237244j],

[ 0.70710678+0.j , 0.70710678-0.j ]])

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值