在自学 GP 和高斯回归时,我偶然发现了 Nando 关于该主题的讲座(第 1 部分和第 2 部分)。因此,由于我对 python 的了解有限,我尝试用 R 重写他的脚本NaN。但是,在生成置信区间的标准差时,我得到了结果。经过对问题进行更彻底的检查后,我发现主要区别在于np.linalg.solve()和 R's solve()。那么问题是,哪一个 R 求解器适合此类操作?
编辑
\n\n在尝试解决这个问题时,我发现当solve(L, ker_x_x.test)替换为时,两段代码的结果部分匹配forwardsolve(L, ker_x_x.test)。我仍然无法模仿原始脚本的结果。
编辑2
\n\n我已经设法匹配结果。在 Python 版本中,矩阵Lk是使用np.linalg.solve()R 脚本中的 where 应该是 来计算的backsolve()。要计算mu向量 \xc3\xacn R,您应该使用forwardsolve().
文档链接:
\n\n\n\n我提供我的代码以供更多评论:
\n\n# GPs Nando Style\n# Simple GP Regression. Assumes a zero mean GP Prior.\n# setwd("your directory")\n# rm(list=ls())\n# graphics.off()\n# cat("\\014")\n# y <- 0.25*(x^2)\n\nkernel <- function(sigma_f, l, x_i, x_j){\n val <- (sigma_f^2)*exp((-1*(t(x_i - x_j)%*%(x_i - x_j)))/(2*l^2))\n return(val)\n}\n\nN <- 10 # Number of training points\nn <- 50 # Number of test points\ns <- 10^(-5)\n\nx <- runif(N, -5, 5)\ny <- sin(0.9*x) + s*rnorm(N, mean = 0, sd = 1) # f(X) is sin(0.9*x)\n\n\nker_x_x <- matrix(0, nrow = length(x), ncol = length(x))\n\nfor (i in 1:length(x)) {\n for (j in 1:length(x)) {\n ker_x_x[i, j] <- kernel(1, 0.1, x[i], x[j])\n }\n}\n\nL <- chol(ker_x_x + s*diag(N))\n\n# points we are going to make predictions on\nx_testSet <- seq(-5, 5, length.out = n)\n\n# compute kernel\nker_x_x.test <- matrix(0, nrow = length(x), ncol = length(x_testSet))\nfor (i in 1:length(x)) {\n for (j in 1:length(x_testSet)) {\n ker_x_x.test[i, j] <- kernel(1, 0.1, x[i], x_testSet[j])\n }\n}\n\n# compute the mean at our test points\n# Lk <- solve(L, ker_x_x.test) # Issue was HERE!\nLk <- backsolve(L, ker_x_x.test, transpose = TRUE)\n# mu <- t(Lk)%*%solve(L, y) # Issue was here\nmu <- t(Lk)%*%forwardsolve(L, y)\n\n# compute variance at our test points\n# compute kernel\nker_x.test_x.test <- matrix(0, nrow = length(x_testSet), ncol = \nlength(x_testSet))\nfor (i in 1:length(x_testSet)) {\n for (j in 1:length(x_testSet)) {\n ker_x.test_x.test[i, j] <- kernel(1, 0.1, x_testSet[i], x_testSet[j])\n }\n}\n\ns2 <- diag(ker_x.test_x.test) - colSums(Lk^2)\ns <- sqrt(s2)\nRun Code Online (Sandbox Code Playgroud)\n