Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/347.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
用python计算NxN矩阵的熵_Python_Numpy_Matrix_Sympy_Entropy - Fatal编程技术网

用python计算NxN矩阵的熵

用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

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

[[-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()
,然后是复数