为何R与Scipy计算特征值的结果存在差异?
为什么Python与R中相关矩阵特征值结果差异巨大?
嘿,这个问题的核心是你在两个语言里做的根本不是同一个操作,而且还有个关键前提被忽略了——咱们慢慢捋清楚:
首先,先看你用的原矩阵:[[1,1],[1,1]],这是个秩为1的奇异矩阵(行列式=0),它没有常规意义上的逆矩阵,这是一切问题的起点!
1. Python里的操作:直接计算原矩阵的特征值
你用的scipy.linalg.eigvalsh()是专门给对称矩阵算特征值的函数,结果array([0., 2.])完全正确:
- 特征值0对应矩阵秩亏的那个维度(因为矩阵秩为1,所以有一个特征值为0)
- 特征值2是矩阵的迹(迹等于所有特征值之和,原矩阵迹为1+1=2)
- 原矩阵是半正定的,特征值非负,符合预期
import numpy as np import scipy.linalg scipy.linalg.eigvalsh(np.array([[1,1],[1,1]])) # 输出:array([0., 2.])
2. R里的操作:你算的是「原矩阵伪逆」的特征值(还可能操作有误)
你写的Inverse(matrix(c(1,1,1,1), ncol=2, nrow=2)),这里的Inverse应该是MASS包的ginv()(Moore-Penrose广义逆),因为R原生的solve()函数碰到奇异矩阵会直接报错!
但问题来了:原矩阵的Moore-Penrose伪逆是[[0.25,0.25],[0.25,0.25]],它的特征值应该是[0.5, 0.](半正定),但你得到的结果里有负特征值-0.25,这说明你大概率是函数调用或矩阵输入出了问题(比如是不是误写了矩阵元素?或者用了其他非标准的逆函数?)
退一步说,就算你得到的是正确的伪逆特征值,这和Python里直接算原矩阵特征值也是完全不同的两个任务——一个是原矩阵的特征值,一个是原矩阵伪逆的特征值,根本没有可比性,自然会出现「正定性看起来不同」的错觉。
# 正确的伪逆计算示例 library(MASS) A <- matrix(c(1,1,1,1), ncol=2, nrow=2) A_pinv <- ginv(A) eigen(A_pinv) # 输出的特征值应为 [0.5, 0.],而非你得到的含负值结果
关键总结
- 你混淆了计算对象:Python算的是原矩阵的特征值,R算的是原矩阵伪逆的特征值
- 原矩阵不可逆,R中的
Inverse不是常规逆,而是广义逆 - 你得到的R结果异常(出现负特征值),大概率是操作失误导致的
内容的提问来源于stack exchange,提问作者Make42
相关产品推荐
相关产品推荐

