python 中的数学错误计算 log(det(AA^T)+1)
Math error computing log(det(AA^T)+1) in python
我正在尝试估计 Python 中 log(det(AAT)+1) 的平均值。我的简单代码工作正常,直到我得到 17×17 矩阵,此时它给了我一个数学错误。这是代码:
iter = 10000
for n in xrange(1,20):
h = n
dets = []
for _ in xrange(iter):
A = (np.random.randint(2, size=(h,n)))*2-1
detA_Atranspose = np.linalg.det(np.dot(A, A.transpose()))
try:
logdetA_Atranspose = math.log(detA_Atranspose+1,2)
except ValueError:
print "Ooops!", n,detA_Atranspose
dets.append(logdetA_Atranspose)
print np.mean(dets)
A 应该是一个元素为 -1 或 1 的矩阵。
我做错了什么,如何解决? 17 有什么特别之处?
对于标题中的公式(之前是logdet(AA^T)):
det(AA^T) 对于一些随机 As 可以简单地为 0。
该函数将失败,因为计算 log(0) 无效。
请注意,理论上 det(AA^T) 不能为负,因为 AA^T 是 positive semi-definite matrix(这意味着所有特征值都是 non-negative 并且意味着 det >= 0) .
对于代码中的公式(logdet(1+AA^T))
您可能应该使用 numpy.linalg.slogdet()
并计算 slogdet(1+A.dot(A.T))
来自其documentation:
"计算数组行列式的符号和(自然)对数。
如果数组具有非常小或非常大的行列式,则对 det 的调用可能会溢出或下溢。此例程对此类问题更稳健,因为它计算行列式的对数而不是行列式本身。"
我正在尝试估计 Python 中 log(det(AAT)+1) 的平均值。我的简单代码工作正常,直到我得到 17×17 矩阵,此时它给了我一个数学错误。这是代码:
iter = 10000
for n in xrange(1,20):
h = n
dets = []
for _ in xrange(iter):
A = (np.random.randint(2, size=(h,n)))*2-1
detA_Atranspose = np.linalg.det(np.dot(A, A.transpose()))
try:
logdetA_Atranspose = math.log(detA_Atranspose+1,2)
except ValueError:
print "Ooops!", n,detA_Atranspose
dets.append(logdetA_Atranspose)
print np.mean(dets)
A 应该是一个元素为 -1 或 1 的矩阵。
我做错了什么,如何解决? 17 有什么特别之处?
对于标题中的公式(之前是logdet(AA^T)):
det(AA^T) 对于一些随机 As 可以简单地为 0。 该函数将失败,因为计算 log(0) 无效。
请注意,理论上 det(AA^T) 不能为负,因为 AA^T 是 positive semi-definite matrix(这意味着所有特征值都是 non-negative 并且意味着 det >= 0) .
对于代码中的公式(logdet(1+AA^T))
您可能应该使用 numpy.linalg.slogdet()
并计算 slogdet(1+A.dot(A.T))
来自其documentation:
"计算数组行列式的符号和(自然)对数。
如果数组具有非常小或非常大的行列式,则对 det 的调用可能会溢出或下溢。此例程对此类问题更稳健,因为它计算行列式的对数而不是行列式本身。"