0

这是我的代码:

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

正如预期的那样,答案是肯定的。但是改变内核函数会导致:

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

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

4

2 回答 2

0

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

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

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

x <- min(eign(K)$values
if (all.equal(x, 0)) {
  x <- 0
}
于 2013-07-16T17:01:55.817 回答
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 个正特征值,其余的都为零。由于浮点错误,您应该会得到负数,而且还有很多。你可能想重新考虑你想要做什么。

于 2013-07-16T16:51:08.387 回答