首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >在python中计算NxN矩阵的熵

在python中计算NxN矩阵的熵
EN

Stack Overflow用户
提问于 2018-08-17 23:04:30
回答 2查看 2.6K关注 0票数 0

我有一个NxN矩阵,其中所有元素的值都在- 1,1之间。我可以手动计算香农熵,但我想要像冯·诺依曼这样的熵。Numpy/Scipy中有没有内置函数?手动方法也可以。矩阵的大小通常为100x100。就像这样。

代码语言:javascript
复制
[[-0.244608 -0.71395497 -0.36534627]  
[-0.44626849 -0.82385746 -0.74654582]
[ 0.38240205 -0.58970239  0.67858516]]

谢谢。

EN

回答 2

Stack Overflow用户

发布于 2018-08-17 23:13:02

如果只是寻找特征值呢?未经测试的伪代码

代码语言:javascript
复制
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

但我敢打赌,你的矩阵的甜甜圈乔丹范式将是复杂的。

票数 2
EN

Stack Overflow用户

发布于 2020-05-02 07:53:07

你可以根据Nielsen & Chuang在“量子计算和量子信息”中的两种方法之一来定义von Neumann熵。它可以用矩阵的迹(负)乘以它自己的(矩阵) logarithm...or...it来定义,可以用特征值来定义。上面的例子都是以e为底的对数,但你需要以2为底。为此,你需要在计算中改变基数。以下是Python中可以使用的两个函数,每个函数对应von Neumann熵(例如密度运算符)的定义的每个版本:

对于跟踪版本

代码语言:javascript
复制
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)

对于本征值版本

代码语言:javascript
复制
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)

这些函数将返回相同的值,因此您使用哪一个并不重要。只需向其中一个函数提供一个方阵,如下所示

代码语言:javascript
复制
rho = np.matrix([[5/6, 1/6],
                 [1/6, 1/6]])

显然,任何方阵都可以工作,而不仅仅是2x2,这只是给你举个例子。如果矩阵的特征值为零,则约定将0*log(0)项设置为零。这是由第二个函数vn_eig_entropy负责的。所有的密度矩阵都是“非负定的”,所以这是你应该遇到的唯一的特征值问题。我知道这个反应有点晚了,但也许它会帮助其他人。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51898197

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档