2016-05-23 6 views
2

Я тестирую регрессию Gaussian Process с библиотекой scikit-learn и недовольна доверительными интервалами, которые она дает мне. Это заставило меня понять, что они не являются инвариантами по шкале: если функция масштабируется (пропорционально на каждой оси), доверительные интервалы становятся больше.scikit-learn/Gaussian Process не является инвариантом шкалы

Может быть фотографии будут объяснить это лучше: (SAMPLED точек в синих точках, истинная функция зеленый цвета, приближение синее, доверительные интервалы = среднее +/- 2SD = серая область)

Функции Чешуйчатой ​​х 1: Function scaled x1

Функция масштабируется х 100: Function scaled x100

Наглядно эти доверительные интервалы должны быть масштабно-инвариантного право? Получаем ли мы то же самое с другими библиотеками?

Заранее благодарен!

PS: код

# -*- coding: utf-8 -*- 
""" 
Created on Thu May 12 16:12:38 2016 

@author: pierre 
""" 

import numpy as np 
from sklearn import gaussian_process 
import matplotlib.pyplot as plt 
from mpl_toolkits.mplot3d import Axes3D 
pi=3.14 

#Figure 
fig = plt.figure() 
ax = fig.add_subplot(111) 

#Function definition 
def f(x): 
    return 3*((x-0.5)**2)*((np.cos(pi*x))**2)+0.2*np.sin(5*x) 

# Coefficient of scale 
nn=100 

#Real function points 
x_real=np.linspace(0,nn,100) 
y_real=nn*f(x_real/nn).ravel() 

#Four points sampled 
X = nn*np.atleast_2d([0.,.2,.5,1.]).T 
y = nn*f(X/nn).ravel() 

#For the approximation 
x = np.atleast_2d(np.linspace(0, nn, 200)).T 

#GP call 
gp = gaussian_process.GaussianProcess() 
gp.fit(X, y) 
y_pred, sigma2_pred = gp.predict(x, eval_MSE=True) 

#Plots 
ax.scatter(X,y,s=400) #Sampled points 
ax.plot(x,y_pred) #Approximation 
ax.fill_between(x.ravel(),y_pred-10*sigma2_pred,y_pred+10*sigma2_pred,color='black',alpha=0.1) #Confidence intervals 
ax.plot(x_real,y_real) #True function 
+1

Можете ли вы включить код, который вы используете, чтобы получить свой результат? Можете ли вы также включить код, который вы используете, для построения графиков? –

+0

Конечно! просто сделал – hyperc54

+0

Вам нужно взять квадратный корень из 'sigma2_pred'. Это средняя квадратная ошибка, поэтому, если вы просто используете ее напрямую, она не будет масштабироваться линейно. Я отправлю ответ ниже. –

ответ

1

Вам нужно взять квадратный корень из sigma2_pred, потому что это MSE, или среднее значение квадрат ошибку. Доверительный интервал должен быть основан на его квадратный корень, как показано ниже:

#GP call 
gp = gaussian_process.GaussianProcess() 
gp.fit(X, y) 
y_pred, sigma2_pred = gp.predict(x, eval_MSE=True) 
sd_pred = np.sqrt(sigma2_pred) 

#Plots 
ax.scatter(X,y,s=400) #Sampled points 
ax.plot(x,y_pred) #Approximation 
ax.fill_between(x.ravel(),y_pred-10*sd_pred,y_pred+10*sd_pred,color='black',alpha=0.1) #Confidence intervals 
ax.plot(x_real,y_real) #True function 

См here для примера на scikit узнать-Страница документации. Они также принимают квадратный корень.

+0

Wow спасибо большое, я чувствую себя глупо сейчас ahah (: – hyperc54