Scikit learn 高斯过程回归置信区间估计
这可能是一个奇怪的问题,但当高斯过程回归看到一堆噪声数据而没有多少信号时,它们会做什么?下面,我收集了一堆嘈杂的数据,运行了两种不同的GPR实现,它们都产生了极小的置信区间。这是为什么呢?我的直觉告诉我,置信区间应该更大。探地雷达对平均值的估计真的那么有信心吗?此外,除了添加白噪声内核外,还有没有合适的方法来填充方差估计Scikit learn 高斯过程回归置信区间估计,scikit-learn,statistics,regression,gaussian,gpflow,Scikit Learn,Statistics,Regression,Gaussian,Gpflow,这可能是一个奇怪的问题,但当高斯过程回归看到一堆噪声数据而没有多少信号时,它们会做什么?下面,我收集了一堆嘈杂的数据,运行了两种不同的GPR实现,它们都产生了极小的置信区间。这是为什么呢?我的直觉告诉我,置信区间应该更大。探地雷达对平均值的估计真的那么有信心吗?此外,除了添加白噪声内核外,还有没有合适的方法来填充方差估计 import numpy as np import gpflow as gpflow from sklearn.gaussian_process import Gaussian
import numpy as np
import gpflow as gpflow
from sklearn.gaussian_process import GaussianProcessRegressor
from sklearn.gaussian_process.kernels import DotProduct, WhiteKernel, Matern, RBF
## some data
X1 = np.array([ 2., 2., 3., 4., 5., 5., 5., 6., 6., 6., 7., 7., 7.,
8., 8., 8., 8., 8., 9., 9., 9., 9., 10., 11., 11., 12.,
12., 12., 13., 13., 14., 14., 15., 15., 15., 16.])
Y1 = np.array([-0.70007257, -0.69388464, -0.63062014, -0.72834303, -0.67526754,
1.00259286, -0.96141351, -0.08295884, 1.0727982 , -2.29816347,
-0.61594418, 1.13696593, -2.18716473, -0.35037363, 1.96273672,
1.31621059, -1.88566144, 1.80466116, -0.79665828, 2.40720146,
1.83116473, -1.67224082, -0.96766061, -0.67430408, 1.79624005,
-1.41192248, 1.01754167, 0.37327703, -1.1195072 , 0.71855107,
-1.16906878, 0.99336417, 1.12563488, -0.36836713, 0.12574823,
0.23294988])
## gpflow
model = gpflow.models.GPR(X=X1[:,None],
Y= Y1[:,None], kern=gpflow.kernels.RBF(1))
gpflow.train.ScipyOptimizer().minimize(model)
## scikit
kernel = RBF()
gpr = GaussianProcessRegressor(kernel=kernel,
random_state=0).fit(X= X1[:,None], y= Y1[:, None])
# plot function
def plot(m, gpflow =True):
plt.figure(figsize=(8, 4))
xtest = np.linspace(np.min(X1),np.max(X1), 20)[:,None]
line, = plt.plot(X1, Y1, 'x', mew=2)
if gpflow:
mu, var = m.predict_f(np.hstack((xtest, np.zeros_like(xtest))))
plt.plot(xtest, mu, color="green", lw=2, label="GPflow")
plt.fill_between(xtest[:, 0],
(mu - 2*np.sqrt(var))[:, 0],
(mu + 2*np.sqrt(var))[:, 0],
color="lightgreen", alpha=0.4)
else:
mu, se = m.predict(xtest, return_std=True)
plt.plot(xtest, mu, color="red", lw=2, label="Scipy")
plt.fill_between(xtest[:, 0],
(mu - 2*se)[:, 0],
(mu + 2*se)[:, 0],
color="red", alpha=0.4)
plt.legend()
[查看模型超参数的实际优化值通常很有帮助-在这种情况下,噪声方差、内核方差和内核长度比例:
class ... value
GPR/kern/lengthscales Parameter ... 3.7149993613788737
GPR/kern/variance Parameter ... 2.0572871322469534e-06
GPR/likelihood/variance Parameter ... 1.5461369937869296
因此,GP将一切解释为噪声(在本例中,长度尺度的实际值是任意的,重要的是微小的核方差)。(如果使用predict_y而不是predict_f,则应获得覆盖大部分观测值的置信区间。)“RBF”(我更喜欢平方指数-每个平稳核描述径向基函数…)核对先验中的函数进行非常强的平滑性假设(而且这只使用超参数的最大似然点估计)因此,从这个意义上讲,没有太多的灵活性——一旦你把所有的数据都解释清楚了,全科医生在某种意义上就是在“说”因为没有信号,所以你得到了前一个返回值,它的平均值为零。这有帮助吗?是的,这有帮助,而且我认为似然方差吸收了一切。我不太确定是否只使用predict_y而不是predict_f,因为这是一个不同的解释,对吗?第二个问题是是否有nyway避免这种情况(即最佳实践)以确保探地雷达实际拾取信号(例如限制似然方差)?@rprog是的,predict_y和predict_f有非常不同的解释-在这种情况下,它们具有相同的平均值(尽管不必如此,只有在似然分布对称的情况下),而predict_f的方差是该均值中的不确定性,而predict_y返回的方差描述了数据的不确定性(在这种情况下,predict_f方差+似然(噪声)方差)取决于你想要什么。对于非高斯似然,考虑分布的分位数比仅均值和VAR(可能是不明确的)可能更明智。@rprog第二个问题:那么,在这个玩具示例中,你希望找到什么样的信号?如果你想用无限可微函数来描述这些数据点,那么我认为平线是很有意义的!如果你使用不同的内核,你会得到不同的答案-例如,比较你得到的Mater12的结果(连续不可微函数)、Matern32(一次可微)、Matern52(二次可微)…我明白你的观点和理由,我有点被迫接受,但我不喜欢接受。12、32和52号材料都给了我相同的答案,这让我重新思考我最初使用探地雷达的决定。我确实认为GP是一种非常有用的方法,可以对此类数据建模,同时避免过度拟合和合理确认但是,它确实需要你思考你想从中得到什么。首先,你(作为一个人)会发出什么信号你的置信区间是多少?另一个想法:也许高斯噪声不是正确的假设-你可以尝试,例如,一个学生的s-t概率来解释异常值。但这对普通GPR不起作用,你需要一个VGP模型,或者做MCMC。