在自学GPs和高斯回归时,我偶然发现了Nando关于这个主题的讲座(part 1和part 2)。因此,由于我对python的了解有限,我试图在R中重写他的script。但是,当产生置信区间的标准偏差时,我得到了NaN
。在一些比较彻底的检查之后,发现了主要的问题。所以问题是,哪种R解算器适用于这类运算?在
编辑
在试图解决这个问题时,我发现当solve(L, ker_x_x.test)
被forwardsolve(L, ker_x_x.test)
替换时,两段代码的结果部分匹配。我仍然无法模仿原始脚本的结果。在
编辑2
我设法使结果相符。在Python版本中,矩阵Lk
是使用np.linalg.solve()
计算的,在R脚本中它应该是backsolve()
。要计算mu
向量ìnr,应该使用forwardsolve()
。在
文档链接:
我提供代码以获取更多注释:
# GPs Nando Style
# Simple GP Regression. Assumes a zero mean GP Prior.
# setwd("your directory")
# rm(list=ls())
# graphics.off()
# cat("\014")
# y <- 0.25*(x^2)
kernel <- function(sigma_f, l, x_i, x_j){
val <- (sigma_f^2)*exp((-1*(t(x_i - x_j)%*%(x_i - x_j)))/(2*l^2))
return(val)
}
N <- 10 # Number of training points
n <- 50 # Number of test points
s <- 10^(-5)
x <- runif(N, -5, 5)
y <- sin(0.9*x) + s*rnorm(N, mean = 0, sd = 1) # f(X) is sin(0.9*x)
ker_x_x <- matrix(0, nrow = length(x), ncol = length(x))
for (i in 1:length(x)) {
for (j in 1:length(x)) {
ker_x_x[i, j] <- kernel(1, 0.1, x[i], x[j])
}
}
L <- chol(ker_x_x + s*diag(N))
# points we are going to make predictions on
x_testSet <- seq(-5, 5, length.out = n)
# compute kernel
ker_x_x.test <- matrix(0, nrow = length(x), ncol = length(x_testSet))
for (i in 1:length(x)) {
for (j in 1:length(x_testSet)) {
ker_x_x.test[i, j] <- kernel(1, 0.1, x[i], x_testSet[j])
}
}
# compute the mean at our test points
# Lk <- solve(L, ker_x_x.test) # Issue was HERE!
Lk <- backsolve(L, ker_x_x.test, transpose = TRUE)
# mu <- t(Lk)%*%solve(L, y) # Issue was here
mu <- t(Lk)%*%forwardsolve(L, y)
# compute variance at our test points
# compute kernel
ker_x.test_x.test <- matrix(0, nrow = length(x_testSet), ncol =
length(x_testSet))
for (i in 1:length(x_testSet)) {
for (j in 1:length(x_testSet)) {
ker_x.test_x.test[i, j] <- kernel(1, 0.1, x_testSet[i], x_testSet[j])
}
}
s2 <- diag(ker_x.test_x.test) - colSums(Lk^2)
s <- sqrt(s2)
目前没有回答
相关问题 更多 >
编程相关推荐