Python numpy.linalg.solve()和R solve()之间的差异

Python numpy.linalg.solve()和R solve()之间的差异,python,r,numpy,Python,R,Numpy,在自学GPs和高斯回归时,我偶然发现了南多关于这一主题的讲座(和)。因此,由于我在python方面的知识有限,我试图用R重写his。但是,当生成置信区间的标准偏差时,我得到了NaN。在对这个问题进行了更彻底的研究之后,我发现主要的区别在于np.linalg.solve()和R的solve()。所以问题是,对于这类操作,哪一个是合适的R解算器 编辑 在试图解决这个问题时,我发现当solve(L,kerux\ux.test)被forwardsolve(L,kerux\ux.test)替换时,两段代码

在自学GPs和高斯回归时,我偶然发现了南多关于这一主题的讲座(和)。因此,由于我在python方面的知识有限,我试图用R重写his。但是,当生成置信区间的标准偏差时,我得到了
NaN
。在对这个问题进行了更彻底的研究之后,我发现主要的区别在于
np.linalg.solve()
和R的
solve()
。所以问题是,对于这类操作,哪一个是合适的R解算器

编辑

在试图解决这个问题时,我发现当
solve(L,kerux\ux.test)
forwardsolve(L,kerux\ux.test)
替换时,两段代码的结果部分匹配。我仍然无法模仿原始脚本的结果

编辑2

我已设法与结果相符。在Python版本中,使用
np.linalg.solve()
计算矩阵
Lk
,其中在R脚本中它应该是
backsolve()
。要计算
mu
vectorì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)
#GPs Nando风格
#简单GP回归。假设之前的平均值为零。
#setwd(“您的目录”)
#rm(list=ls())
#graphics.off()
#类别(“\014”)

#不要将类似于
rm(list=ls())
的代码放入示例中-没有人希望复制和运行您的代码,并意外删除他们的工作。不太严重的是,
setwd
graphics.off
cat(“\014”)
都与您的问题无关,不值得包括在内。我将从你的问题中删除所有内容。你的第一行有意义的代码,
y现在它被修复了,但对R不太了解,我希望它们几乎是1:1(matlab、python、R;它们都在内部使用相同的代码;除了处理问题)。两人都在使用LAPACK。做一些研究(阅读文档)来解释这个假设,并确保你正确地使用它(包括对数据的假设!)。