【问题标题】:Calculating the Entropy of a NxN matrix in python在python中计算NxN矩阵的熵
【发布时间】:2023-03-20 04:57:02
【问题描述】:

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

[[-0.244608 -0.71395497 -0.36534627]  
[-0.44626849 -0.82385746 -0.74654582]
[ 0.38240205 -0.58970239  0.67858516]]

谢谢。

【问题讨论】:

  • 你真的应该在你的帖子中发布一个小样本矩阵,以及你尝试解决问题的方法,以及你的预期输出。
  • 但我确实尝试过,我无法为非自伴矩阵生成真正的特征值,因此无法从特征值的对数计算熵。我告诉过你我确实计算了香农的熵。
  • 提供了一个矩阵样本。

标签: python numpy matrix sympy entropy


【解决方案1】:

只求特征值呢? 未经测试的伪代码

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 分解来计算矩阵的对数(其他一切都是微不足道的)以获得 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

然后可以使用 Gantmacher 1959 定理从 Jordan 形式计算 log(M),查看这篇论文 https://www.ams.org/journals/proc/1966-017-05/S0002-9939-1966-0202740-6/S0002-9939-1966-0202740-6.pdf 以获得简化解释,尤其是 eqns 3.4-3.8

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

【讨论】:

  • 谢谢,我已经尝试过做类似的事情。但问题是,我无法为非自伴矩阵生成真正的特征值,因此无法从特征值的对数计算熵。我必须在物理学家面前为这个答案辩护为“熵”。你对此有什么想法吗?
  • @MohakShukla 好吧,如果没有真正的特征值,那么就没有真正的log(M),是一一对应的。不管物理学家怎么说,非自伴矩阵将具有复特征值、复 log() 和复复熵值。我想说的是,在您的情况下,无论您采用何种方法,复杂值都是不可避免的。
  • @MohakShukla 搜索该链接后:maths.manchester.ac.uk/~higham/talks/ecm12_log.pdf 看起来信息量很大,但目前我不知道
  • 谢谢。是的,我知道一个非自伴矩阵总是有复杂的特征值,所以我想我必须在我的教授面前证明复杂的熵是正确的。再次感谢您的回答和链接。
【解决方案2】:

您可以根据 Nielsen & Chuang 在“量子计算和量子信息”中的两种方法之一来定义冯诺依曼熵。它可以用矩阵的迹乘以它自己的(矩阵)对数的(负数)来定义......或者......它可以用特征值来定义。上面的例子都取以 e 为底的对数,但您需要以 2 为底。为此,您需要在计算中更改底数。以下是 Python 中可以使用的两个函数,一个用于 von Neumann entropy(密度算子)定义的每个版本:

对于跟踪版本

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 处理。所有密度矩阵都是“非负定的”,因此这是您应该遇到的唯一特征值问题。我知道这个回复有点晚了,但也许它会帮助别人。

【讨论】:

  • 非常感谢。
  • 我不熟悉量子力学和冯诺依曼熵。我在几个矩阵上运行代码并注意到我得到了复值熵;复值熵是什么意思?
猜你喜欢
  • 2011-02-24
  • 2018-07-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-12-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多