用python计算NxN矩阵的熵
我有一个NxN矩阵,其中所有元素的值都在[-1,1]之间。我可以手动计算香农熵,但我想要类似冯·诺依曼熵的东西。Numpy/Scipy中是否有内置函数? 手动方法也可以。 矩阵的尺寸通常为100x100。像这样的用python计算NxN矩阵的熵,python,numpy,matrix,sympy,entropy,Python,Numpy,Matrix,Sympy,Entropy,我有一个NxN矩阵,其中所有元素的值都在[-1,1]之间。我可以手动计算香农熵,但我想要类似冯·诺依曼熵的东西。Numpy/Scipy中是否有内置函数? 手动方法也可以。 矩阵的尺寸通常为100x100。像这样的 [[-0.244608 -0.71395497 -0.36534627] [-0.44626849 -0.82385746 -0.74654582] [ 0.38240205 -0.58970239 0.67858516]] 谢谢。只找特征值怎么样? 未经测试的伪代码 impo
[[-0.244608 -0.71395497 -0.36534627]
[-0.44626849 -0.82385746 -0.74654582]
[ 0.38240205 -0.58970239 0.67858516]]
谢谢。只找特征值怎么样? 未经测试的伪代码
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)
更新
看看同伴网站,这个答案可能会让你感兴趣
更新
若你们不想通过特征值/多项式,那个么你们可以使用乔丹分解来计算矩阵的对数(其他一切都是琐碎的)。在python中,可以通过Symphy完成,也可以查看详细信息
然后使用Gantmacher 1959定理从Jordan形式计算log(M),检查本文的简化解释,特别是方程3.4-3.8
但我敢打赌,矩阵的正常形式会很复杂 只找特征值怎么样? 未经测试的伪代码
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)
更新
看看同伴网站,这个答案可能会让你感兴趣
更新
若你们不想通过特征值/多项式,那个么你们可以使用乔丹分解来计算矩阵的对数(其他一切都是琐碎的)。在python中,可以通过Symphy完成,也可以查看详细信息
然后使用Gantmacher 1959定理从Jordan形式计算log(M),检查本文的简化解释,特别是方程3.4-3.8
但我敢打赌,矩阵的正常形式会很复杂 根据Nielsen&Chuang在《量子计算与量子信息》中的观点,可以用两种方法之一定义冯·诺依曼熵。它可以用矩阵的轨迹乘以它自己的(矩阵)对数来定义……或者……它可以用特征值来定义。上面的例子都是以e为底的对数,但需要以2为底。为了做到这一点,你需要在计算中做一个基本的改变。这里有两个Python函数可供使用,一个用于定义von Neumann熵(例如密度运算符)的每个版本: 对于跟踪版本
def von_neumann_熵(rho):
将numpy作为np导入
从scipy进口linalg作为la
R=rho*(la.logm(rho)/la.logm(np.matrix([[2]]))
S=-np.matrix.trace(R)
报税表
对于特征值版本
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.矩阵([5/6,1/6],
[1/6, 1/6]])
显然,任何平方矩阵都可以工作,而不仅仅是2x2,这只是给你一个例子。如果矩阵的特征值为零,则惯例是将0*log(0)项设置为零。这由第二个函数
vn\u eig\u entropy
处理。所有的密度矩阵都是“非负定的”,所以这是你应该遇到的特征值的唯一问题。我知道这个反应有点晚,但也许它会帮助其他人 根据Nielsen&Chuang在《量子计算与量子信息》中的观点,可以用两种方法之一定义冯·诺依曼熵。它可以用矩阵的轨迹乘以它自己的(矩阵)对数来定义……或者……它可以用特征值来定义。上面的例子都是以e为底的对数,但需要以2为底。为了做到这一点,你需要在计算中做一个基本的改变。这里有两个Python函数可供使用,一个用于定义von Neumann熵(例如密度运算符)的每个版本:
对于跟踪版本
def von_neumann_熵(rho):
将numpy作为np导入
从scipy进口linalg作为la
R=rho*(la.logm(rho)/la.logm(np.matrix([[2]]))
S=-np.matrix.trace(R)
报税表
对于特征值版本
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.矩阵([5/6,1/6],
[1/6, 1/6]])
显然,任何平方矩阵都可以工作,而不仅仅是2x2,这只是给你一个例子。如果矩阵的特征值为零,则惯例是将0*log(0)项设置为零。这由第二个函数
vn\u eig\u entropy
处理。所有的密度矩阵都是“非负定的”,所以这是你应该遇到的特征值的唯一问题。我知道这个反应有点晚,但也许它会帮助其他人 你真的应该在你的帖子中发布一个小样本矩阵,以及你解决问题的尝试,以及你的预期输出。但我确实尝试过,我不能为一个非自伴矩阵生成真实的特征值,所以从特征值的对数计算熵是不可能的。我告诉过你我确实计算了香农熵。提供了一个矩阵样本。你应该在你的帖子中发布一个小样本矩阵,以及你解决问题的尝试,以及你的预期结果。但我确实尝试过,我不能为一个非自伴矩阵生成真实的特征值,所以从特征值的对数计算熵是不可能的。我告诉过你们我计算过香农熵。提供了一个矩阵样本。谢谢你们,我也试过做类似的事情。但问题是,我不能为非自伴矩阵生成实特征值,所以从特征值对数计算熵是不可能的。我不得不在物理学者面前为这个答案辩护,称之为“熵”。你对此有什么想法吗?@MohakShukla好吧,如果没有实特征值,那么就没有实的log(M)
,这是一对一的对应。不管物理学家怎么说,非自伴矩阵都会有复数特征值,复数log()
,然后是复数