两者之间的区别numpy.linalg.求解()和R solve()

2024-10-01 13:29:02 发布

您现在位置:Python中文网/ 问答频道 /正文

在自学GPs和高斯回归时,我偶然发现了Nando关于这个主题的讲座(part 1part 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)

Tags: intestformeankernellengthpointscompute