这是我的代码:
> 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分解和二次规划)是半正定的
答案 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
}