我试图在
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(这意味着所有特征值都是非负的并且意味着det> = 0).
对于代码中的公式(logdet(1 AA ^ T))
您应该使用numpy.linalg.slogdet()和计算slogdet(1 A.dot(A.T))
从documentation开始:
“计算数组行列式的符号和(自然)对数.
如果数组具有非常小或非常大的行列式,则对det的调用可能会溢出或下溢.这个例程对这些问题更加强大,因为它计算行列式的对数而不是行列式本身.“