高斯过程异常



我想使用高斯过程来解决回归任务。我的数据如下:每个X向量的长度为37,每个Y向量的长度是8。

我在Python中使用sklearn包,但尝试使用高斯过程会导致Exception:

from sklearn import gaussian_process
print "x :", x__
print "y :", y__
gp = gaussian_process.GaussianProcess(theta0=1e-2, thetaL=1e-4, thetaU=1e-1)
gp.fit(x__, y__) 

x:[[136。137.137。132.130。130.132。133.134.
135135.134。134.1139。1019。0。0。0。0。0。0。0。70.24。55.0。9。0.][136。137.137。132.130。130.132。133.134。135135.134。134.1139。1019。0。0。0。0。0。0。0。70.24。55.0。9。0.][82。76.80。103.135。155.159。156.145。138130.122。122.689。569.0。0。0。0。0。0。0。0。0。0。0。0.][156。145.138。130.122。118.113。111。10198.95。95.759。639.0。0。0。0。0。0。0。0。0。0。0。0.][112。111。114.114。113.114。114.112。111109.109。109.1109。989。0。0。0。0。0。0。0。0。0。0。0.][133。130.125。124.124。123.103。87.96。121122.123。123.399。279.0。0。0。0。0。0。0。0。0。0。0。0][104。109.111。106.91。86.117。123.123。120121.115。115.549。429.0。0。0。0。0。0。0。0。0。0。0。0.][144。138.126。122.119。118.116。114.107。105106.119。119.479。359.0。0。0。0。0。0。0。0。0。0。0。0.]]

y:[[7。9.13。30.34。3736.41.][7。9.13。30.34。3736.41.][-4-9-17-21.-27-28.-28-20.][-1-1.-4-5.20。2831.23.][-1-2.-3-1.-4-7.8.58。][-1-2.-14.33333333-14-13.6666667-32-26.66666667-1.][1。3.33333333 0-0.666666673。6.22.54.][-2-8.11-17.-17-16.-16-23.]]

---------------------------------------------------------------------------异常追溯(最近的调用最后)在()11 gp=高斯过程。高斯过程(theta0=1e-2,thetaL=1e-4,thetaU=1e-1)12--->13总装配(x_,y_)

/usr/local/lib/python2.7/site-packages/sklarn/gaussian_process/gaussian-process.pyc合身(self,X,y)300如果(np.min(np.sum(D,轴=1))==0。301和self-crr!=correlation.pure_nugget):-->302引发异常("多个输入功能不能相同"303"目标值。")304

异常:多个输入功能不能具有相同的目标值。

我发现了一些与scikit-learn问题有关的主题,但我的版本是最新的。

这是一个已知的问题,但实际上仍未解决。

这是发生的,因为若你们有相同的点,你们的矩阵是不可逆的(奇异的)。(这意味着你不能计算A^-1-这是GP解决方案的一部分)。

为了解决这个问题,只需在示例中添加一些小的高斯噪声,或者使用其他GP库。

你总是可以尝试实现它,其实并没有那么难。GP中最重要的是你的核函数,例如高斯核:

exponential_kernel = lambda x, y, params: params[0] * 
    np.exp( -0.5 * params[1] * np.sum((x - y)**2) )

现在,我们需要构建协方差矩阵,如下所示:

covariance = lambda kernel, x, y, params: 
    np.array([[kernel(xi, yi, params) for xi in x] for yi in y])

因此,当你想预测新的点x时,计算它的协方差:

sigma1 = covariance(exponential_kernel, x, x, theta)

并应用以下内容:

def predict(x, data, kernel, params, sigma, t):
    k = [kernel(x, y, params) for y in data]
    Sinv = np.linalg.inv(sigma)
    y_pred = np.dot(k, Sinv).dot(t)
    sigma_new = kernel(x, x, params) - np.dot(k, Sinv).dot(k)
    return y_pred, sigma_new

这是一个非常幼稚的实现,对于高维度的数据,运行时会很高。这里最难计算的是Sinv = np.linalg.inv(sigma),它取O(N^3)

相关内容

  • 没有找到相关文章

最新更新