scikit-learn - 置信区间的高斯过程回归估计

标签 scikit-learn statistics regression gaussian gpflow

这可能是一个奇怪的问题,但是当高斯过程回归看到一堆没有太多信号的噪声数据时,它们会做什么?下面我获取了一堆噪声数据并运行了两种不同的探地雷达实现,它们都产生了超小的置信区间。出现这种情况有充分的理由吗?我的直觉告诉我置信区间应该更大。探地雷达对平均值的估计真的那么有信心吗?此外,除了添加白噪声核之外,是否还有适当的方法来填充方差估计?

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()

Gpflow estimates

[Scipy estimates[2]

最佳答案

查看模型超参数的实际优化值通常很有帮助 - 在本例中为噪声方差、内核方差和内核长度比例:

                             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”(我更喜欢平方指数 - 每个平稳核描述径向基函数......)核对上做出非常强的平滑度假设你先前的函数(而且这仅使用超参数的最大似然点估计),因此从这个意义上说,没有太多灵活性 - 一旦你解释了所有数据,GP在某种意义上就“说”了没有信号,因此您得到先前的数据 - 其均值为零。这有一点帮助吗?

关于scikit-learn - 置信区间的高斯过程回归估计,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54953992/

相关文章:

python - 我如何使用 scikit learn 迭代 python 中的 'list' 模型?

python - scikit learn 中的预测和评分如何工作

python - 如何评价均方误差(MSE)是否合理?

scikit-learn - 如何在 sklearn model.predict 中用单个样本进行预测?

python - 如何将 KerasClassifier、Hyperopt 和 Sklearn 交叉验证结合在一起

php - 全文搜索得分相关性分析

asp.net - 确定 ASP.NET 站点的 'active' 用户计数

python - 在 scikit-learn LinearRegression 中查找 p 值(显着性)

machine-learning - 到底什么时候使用逻辑回归而不是线性回归?

python - 使用 tflearn python 将数据输入 lstm