如何处理核矩阵中的负特征值?

时间:2013-07-16 16:42:25

标签: r math

这是我的代码:

> toy=cbind(rnorm(50), rnorm(50))
> K=kernelMatrix(x=toy, rbfdot()) 
> min(eigen(K)$values)

正如所料,答案是积极的。但更改内核函数do vanilladot导致:

> K=kernelMatrix(x=toy, vanilladot()) ; min(eigen(K)$values)
[1] -3.528788e-15

如果我理解正确的话,这必须是positif或零(线性内核的正定性),这个很小,可以解决浮点数的计算问题,应该为零。 我该怎么做才能克服这个问题?我需要这个矩阵对于脚本的其余部分(Cholesky分解和二次规划)是半正定的

2 个答案:

答案 0 :(得分:0)

对于您的特定(玩具)示例,您可以将整个过程包装在一个循环中,直到您的数据没有此问题。

repeat {
    # you don't need 2 rnorm calls
    toy <- matrix(rnorm(100), ncol=2)
    K <- kernelMatrix(x=toy, vanilladot())
    if(min(eigen(K)$values) > 0) break
}

请注意,在这种情况下,kernelMatrix会返回一个X %*% t(X)的矩阵,其中X是您的原始输入数据。这样的矩阵将只有2个正特征值,其余的都是数值零。由于浮点错误,你应该期望得到负数,而且还有很多。你可能想重新考虑你想要做的事情。

答案 1 :(得分:0)

-3e-15足够接近零,我认为可以安全地假设你遇到浮动错误。

的结果
all.equal(min(eign(K)$values), 0)  

您也可以使用快速检查将此数字固定为零。

x <- min(eign(K)$values
if (all.equal(x, 0)) {
  x <- 0
}