2

我正在尝试使用 GPy 包将一些随机数据拟合到带有 RBF 内核的 GP 中。当我更改活动尺寸时,LinAlgError: not positive definite, even with jitter出现错误。此错误在 conda 环境中生成。当我使用 pip 时,我从来没有遇到过这个错误。有没有人遇到过这个?

import numpy as np
import GPy
import random

def func(x):
      return np.sum(np.power(x, 5) - np.power(x, 3))
    
# 20 random data with 10 dimensions
random.seed(2)
random_sample = [[random.uniform(0,3.4) for i in range(10)] for j in range(20)]

# get the first random sample as an observed data 
y = np.array([func(random_sample[0])])
X = np.array([random_sample[0]])
y.shape = (1, 1)
X.shape = (1, 10)

# different set of dimensions
set_dim = [[np.array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])],
           [np.array([0, 1]), np.array([2, 3]), np.array([4, 5]), np.array([6, 7]), np.array([8, 9])],
           [np.array([0, 1, 2, 3, 4]), np.array([5, 6, 7, 8, 9])],
           [np.array([0, 1, 2, 3]), np.array([4, 5, 6]), np.array([7, 8, 9])]]


for i in range(len(set_dim)):
    # new kernel based on active dims
    k = GPy.kern.Add([GPy.kern.RBF(input_dim=len(set_dim[i][x]), active_dims=set_dim[i][x]) for x in range(len(set_dim[i]))])
    
    # increase data set with the next random sample
    y = np.concatenate((y, np.array([[func(random_sample[i+1])]])))
    X = np.concatenate((X, np.array([random_sample[i+1]])))

    model = GPy.models.GPRegression(X, y, k)
    model.optimize()

gpy、scipy 和 numpy 的 conda list 的输出。 输出 gpy、scipy 和 numpy 的 conda 列表

上述包的路径。 路径

4

1 回答 1

0

可能的频道混合问题

有时来自不同渠道的包构建(例如,anacondaconda-forge)是不兼容的。我遇到这种情况的时候,它发生在跨包引用编译符号时,通道上使用的不同构建堆栈使用不同的符号名称,导致混合时丢失符号。

我可以报告说,使用与 OP 完全相同的包版本,但优先考虑 Conda Forge 通道构建,给了我可靠的行为。虽然不是决定性的,但这与 Conda Forge 构建GPy与其他 Anaconda 依赖项构建(例如 , numpy)混合产生的问题是一致的scipy。特别值得一提的是,我拥有完全相同的 GPy 版本,并且该模块是错误的来源。同时,错误中没有任何内容可以立即表明这是一个通道混合问题。

解决方法

在实践中,我通过始终使用 YAML 定义来创建我的环境来避免通道混合问题。这是一种有用的做法,因为它鼓励人们将通道优先级明确声明为定义的一部分,并使 Conda 从一开始就知道您的偏好。以下环境定义对我有用:

gpy_cf.yaml

name: gpy_cf
channels:
  - conda-forge
  - defaults
dependencies:
  - python=3.6
  - gpy=1.9.6
  - numpy=1.16.2
  - scipy=1.2.1

并使用

conda env create -f gpy_cf.yaml
conda activate gpy_cf

除非你真的需要这些确切的版本,否则我会删除任何不必要的版本限制(至少删除补丁)。


破解版

作为记录,这是我可以复制错误的版本:

gpy_mixed.yaml

name: gpy_mixed
channels:
  - defaults
  - conda-forge
dependencies:
  - python=3.6
  - conda-forge::gpy=1.9.6
  - numpy=1.16.2
  - scipy=1.2.1

在这种情况下,我们强制gpy来自 Conda Forge 并让其他所有内容都来自 Anaconda(默认值)通道,类似于 OP 中的配置。

于 2021-01-26T06:15:45.497 回答