4

我正在使用 Python 2.7 中的GPy库来执行高斯过程回归。我首先遵循 GitHub 页面中提供的教程笔记本。

示例代码:

import numpy as np
import matplotlib.pyplot as plt

f = lambda x : np.sin(x**2)

kernel = GPy.kern.RBF(input_dim=1, variance=1., lengthscale=1.)

X=np.random.rand(2,1)
Y=f(X)

m = GPy.models.GPRegression(X,Y,kernel)
m.optimize_restarts(num_restarts = 10,verbose=False)

fig=m.plot()
plt.show()

我目睹的奇怪的事情是,在GPRegression类(好吧,它只是GP的一个小子类)中,在它的超类(GP)中,在它的超超类中都没有实现绘图函数(模型)...全部位于GPy.core中。

当我调用m.plot()时执行的绘图函数在GPy.plotting.gpy_plot中(它不包含任何类,但仍然使用“self”关键字作为函数参数 - 但也许它只是一个“坏”名称对于函数参数?)。

我看不到GPy.core.GP对象如何访问这个绘图函数(乍一看,两个 python 文件之间没有任何链接 - GPy/core/gp.py中的 Ctrl+F“绘图”没有给出任何示例)。

当我打电话

vars(GPy.models.gp_regression.GP).keys()

,绘图功能确实存在,虽然没有直接在GPy.core.GP中实现。

同样的事情:(最小的可重现示例)

import GPy.core.gp
import GPy.likelihoods
import GPy.kern
import matplotlib.pyplot as plt

GPy.core.gp.GP.__dict__.keys()

知道GP如何 调用gpy_plot中的绘图函数,以及为什么要这样编码吗?

4

1 回答 1

2

绘图库在 GPy/GPy/plotting/__init__.py's 中“注入” inject_plotting()。这里的行plot()

    from ..core import GP
    ...
    GP.plot = gpy_plot.gp_plots.plot

我认为这种设计的原因是它允许通过change_plotting_library().

于 2016-07-16T22:17:25.000 回答