我有一个NxN矩阵,其中所有元素的值都在- 1,1之间。我可以手动计算香农熵,但我想要像冯·诺依曼这样的熵。Numpy/Scipy中有没有内置函数?手动方法也可以。矩阵的大小通常为100x100。就像这样。
[[-0.244608 -0.71395497 -0.36534627]
[-0.44626849 -0.82385746 -0.74654582]
[ 0.38240205 -0.58970239 0.67858516]]
谢谢。
发布于 2018-08-17 23:13:02
如果只是寻找特征值呢?未经测试的伪代码
import numpy as np
from numpy import linalg as LA
M = ... # this is your matrix
e, v = LA.eig(M)
t = e * np.log(e)
return -np.sum(t)
更新
看看配套网站,你可能会对这个答案感兴趣。
https://cs.stackexchange.com/questions/56261/computing-von-neumann-entropy-efficiently
更新
如果你不想通过特征值/多项式,那么你可以使用乔丹分解来计算矩阵的对数(其他一切都是微不足道的),以获得Jordan normal form of a matrix。在python中,这可以通过SymPy,http://docs.sympy.org/0.7.1/modules/matrices.html#sympy.matrices.matrices.Matrix.jordan_form来完成,详细信息也可以查看Compute Jordan normal form of matrix in Python / NumPy。
然后,利用Gantmacher1959定理,可以从Jordan形式计算log(M),请查看本文https://www.ams.org/journals/proc/1966-017-05/S0002-9939-1966-0202740-6/S0002-9939-1966-0202740-6.pdf的简化解释,特别是公式3.4-3.8
但我敢打赌,你的矩阵的甜甜圈乔丹范式将是复杂的。
发布于 2020-05-02 07:53:07
你可以根据Nielsen & Chuang在“量子计算和量子信息”中的两种方法之一来定义von Neumann熵。它可以用矩阵的迹(负)乘以它自己的(矩阵) logarithm...or...it来定义,可以用特征值来定义。上面的例子都是以e为底的对数,但你需要以2为底。为此,你需要在计算中改变基数。以下是Python中可以使用的两个函数,每个函数对应von Neumann熵(例如密度运算符)的定义的每个版本:
对于跟踪版本
def von_neumann_entropy(rho):
import numpy as np
from scipy import linalg as la
R = rho*(la.logm(rho)/la.logm(np.matrix([[2]])))
S = -np.matrix.trace(R)
return(S)
对于本征值版本
def vn_eig_entropy(rho):
import numpy as np
from scipy import linalg as la
import math as m
EV = la.eigvals(rho)
# Drop zero eigenvalues so that log2 is defined
my_list = [x for x in EV.tolist() if x]
EV = np.array(my_list)
log2_EV = np.matrix(np.log2(EV))
EV = np.matrix(EV)
S = -np.dot(EV, log2_EV.H)
return(S)
这些函数将返回相同的值,因此您使用哪一个并不重要。只需向其中一个函数提供一个方阵,如下所示
rho = np.matrix([[5/6, 1/6],
[1/6, 1/6]])
显然,任何方阵都可以工作,而不仅仅是2x2,这只是给你举个例子。如果矩阵的特征值为零,则约定将0*log(0)项设置为零。这是由第二个函数vn_eig_entropy
负责的。所有的密度矩阵都是“非负定的”,所以这是你应该遇到的唯一的特征值问题。我知道这个反应有点晚了,但也许它会帮助其他人。
https://stackoverflow.com/questions/51898197
复制相似问题