能否丢弃scipy.linalg.logm计算结果的虚部?相关技术咨询
矩阵对数计算的复结果相关问题
我有如下形式的方阵(最大为1000×1000),元素值介于0到1之间:
data = np.array([[0.0308, 0.07919, 0.05694, 0.00662, 0.00927], [0.07919, 0.00757, 0.00720, 0.00526, 0.00709], [0.05694, 0.00720, 0.00518, 0.00707, 0.00413], [0.00662, 0.00526, 0.00707, 0.01612, 0.00359], [0.00927, 0.00709, 0.00413, 0.00359, 0.00870]])
使用scipy.linalg.logm计算该矩阵的自然对数时,得到了含虚部的结果:
print(logm(data)) >> [[-2.3492917 +1.42962407j 0.15360003-1.26717846j 0.15382223-0.91631624j 0.15673496+0.0443927j 0.20636448-0.01113953j] [ 0.15360003-1.26717846j -3.75764578+2.16378501j 1.92614937-0.60836013j -0.13584605+0.27652444j 0.27819383-0.25190565j] [ 0.15382223-0.91631624j 1.92614937-0.60836013j -5.08018989+2.52657239j 0.37036433-0.45966441j -0.03892575+0.36450564j] [ 0.15673496+0.0443927j -0.13584605+0.27652444j 0.37036433-0.45966441j -4.22733838+0.09726189j 0.26291385-0.07980921j] [ 0.20636448-0.01113953j 0.27819383-0.25190565j -0.03892575+0.36450564j 0.26291385-0.07980921j -4.91972246+0.06594195j]]
据相关资料推测,这是浮点误差导致的截断和舍入问题。现咨询:
- 能否使用
numpy.real()丢弃结果的虚部?该操作是否具备数学/科学严谨性? - 使用tensorflow.linalg.logm也得到相同复结果,是否属于预期行为?
问题解答
1. 丢弃虚部的可行性与严谨性
- 可以使用
numpy.real()丢弃虚部,但需先确认虚部来源:你的矩阵是对称实矩阵,若其所有特征值均为正(正定矩阵),理论上它的矩阵对数应为实对称矩阵,此时出现的虚部完全是数值计算过程中舍入误差引入的。 - 严谨性层面:如果原矩阵确实是正定实矩阵,丢弃虚部具备数学合理性,相当于修正浮点误差带来的虚部噪声;但如果原矩阵存在负特征值或非对称结构,矩阵对数本身就可能包含非零虚部,此时丢弃虚部会破坏结果的正确性,必须先验证原矩阵的正定性。
2. TensorFlow logm返回复结果的合理性
这属于预期行为:
- 无论是SciPy还是TensorFlow的矩阵对数实现,底层都依赖矩阵分解(如Schur分解),数值计算中浮点误差可能导致原本为正的特征值被计算出微小的负实部或虚部,进而在对数计算中引入虚部。
- 两个库的实现逻辑虽有差异,但面对浮点误差时都会出现类似的复结果,这是数值线性代数计算中的常见现象,并非库的bug。
内容的提问来源于stack exchange,提问作者Paul
相关产品推荐
相关产品推荐

