我有,维向量,我正在使用以下公式
然而,维向量中的值介于 0 和 1 之间,因为它是一个归一化向量,并且可能很大,这导致具有相当小的元素。
我正在尝试计算协方差矩阵的行列式以确定基础多元高斯的微分熵。但是,由于数字很小,行列式实际上是 0(实际上在计算中四舍五入为 0)。
有什么方法可以避免这种情况吗?也许我可以避免除以?
我有,维向量,我正在使用以下公式
然而,维向量中的值介于 0 和 1 之间,因为它是一个归一化向量,并且可能很大,这导致具有相当小的元素。
我正在尝试计算协方差矩阵的行列式以确定基础多元高斯的微分熵。但是,由于数字很小,行列式实际上是 0(实际上在计算中四舍五入为 0)。
有什么方法可以避免这种情况吗?也许我可以避免除以?
几件事。
行列式是比例等变的,所以在不失一般性的情况下,您可以重新调整您的(比如将它们乘以 10),然后在执行完所有中间操作后将比例重新分解,如以下 R 代码所示:
p <- 10
n <- 100
a1 <- matrix(runif(n*p),n,p)
a1 <- sweep(a1,1,sqrt(rowSums(a1*a1)),FUN="/")
a2 <- a1*10 #you can re-scale your data
log(det(cov(a1[1:(p+1),])))
log(det(cov(a2[1:(p+1),])))-log(10^(2*(p))) #and compensate for the rescaling 'at the end'
您应该使用重新调整为以数据集的原始单位表示的行列式(例如,如果是您的协方差矩阵并且它的等级,请使用)。这类似于标准偏差以原始单位表示的方式,但方差以原始单位的平方表示。
数值稳定性对你来说是个问题。
一种使计算更稳定的方法 - 将值的均值校正矩阵,我认为形成矩阵的 QR 分解或失败的 Choleski 分解是有意义的矩阵,并使用的对角线(或 Choleski 因子)的乘积,这将是行列式的平方根。
还有其他方法(其中一些可能比计算 QR 更好)。
不过,您仍然需要针对进行缩放。