Python GPflow分类:后验方差的解释

Python GPflow分类:后验方差的解释,python,machine-learning,classification,gpflow,Python,Machine Learning,Classification,Gpflow,在本文中,一个稀疏变分高斯过程(SVGP)被用于一维玩具的例子。与的情况一样,SVGP模型有一种方法predict_y(self,Xnew),该方法返回Xnew点处保留数据的平均值和方差 从本教程中可以清楚地看出,从predict_y中解包的第一个参数是三个类别(单元格[7]和[8])的后验预测概率,如下图第二个面板中的彩色线所示。然而,作者没有详细说明可以从predict_y中解包的第二个参数,即预测的方差。在回归设置中,其解释对我来说很清楚,因为在这种情况下,后验预测分布将是高斯分布 但我

在本文中,一个稀疏变分高斯过程(SVGP)被用于一维玩具的例子。与的情况一样,SVGP模型有一种方法
predict_y(self,Xnew)
,该方法返回
Xnew
点处保留数据的平均值和方差

从本教程中可以清楚地看出,从
predict_y
中解包的第一个参数是三个类别(单元格
[7]
[8]
)的后验预测概率,如下图第二个面板中的彩色线所示。然而,作者没有详细说明可以从
predict_y
中解包的第二个参数,即预测的方差。在回归设置中,其解释对我来说很清楚,因为在这种情况下,后验预测分布将是高斯分布


但我不明白这里的解释是什么。特别是,我想知道如何使用这个度量来构建误差条,表示任何新数据点的类预测的不确定性


我稍微修改了教程的代码,在下图中添加了一个额外的面板:第三个面板以黑色显示最大标准偏差(从
predict\y
获得的方差的平方根)。这显然是一个很好的测量不确定性的方法,最高可能值为0.5也可能不是巧合,但我找不到它是如何计算的以及它代表什么

用所有代码完成笔记本

Model.predict\u y()
调用
可能性。predict\u mean\u和\u var()
。如果您查看后一个函数[1]的文档,您会发现它所做的只是计算预测分布的均值和方差。即,我们首先计算边际预测分布
q(y)=\int p(y | f)q(f)df
,然后计算
q(y)
的均值和方差

对于高斯分布,均值和方差可以相互独立地指定,它们可以解释为点预测和不确定性。对于伯努利似然,均值和方差都完全由单个参数
p
确定。分布的平均值是事件的概率,这已经告诉我们不确定性!方差没有给出更多

然而,你是对的,方差是一个很好的不确定性度量,越高意味着更多的不确定性。熵作为
p
的函数看起来非常相似(尽管两者在边缘附近的行为不同):

[1]

这不是一个编程问题,因此可以说是离题的;更适合于。
def plot(m):
f = plt.figure(figsize=(12,8))
a1 = f.add_axes([0.05, 0.05, 0.9, 0.5])
av = f.add_axes([0.05, 0.6, 0.9, 0.1])
a2 = f.add_axes([0.05, 0.75, 0.9, 0.1])
a3 = f.add_axes([0.05, 0.9, 0.9, 0.1])


xx = np.linspace(m.X.read_value().min()-0.3, m.X.read_value().max()+0.3, 200).reshape(-1,1)
mu, var = m.predict_f(xx)
mu, var = mu.copy(), var.copy()
p, v = m.predict_y(xx)

a3.set_xticks([])
a3.set_yticks([])

av.set_xticks([])

lty = ['-', '--', ':']

for i in range(m.likelihood.num_classes):
    x = m.X.read_value()[m.Y.read_value().flatten()==i]
    points, = a3.plot(x, x*0, '.')
    color=points.get_color()
    a1.fill_between(xx[:,0], mu[:,i] + 2*np.sqrt(var[:,i]), mu[:,i] - 2*np.sqrt(var[:,i]), alpha = 0.2)
    a1.plot(xx, mu[:,i], color=color, lw=2)

    a2.plot(xx, p[:,i], '-', color=color, lw=2)

av.plot(xx, np.sqrt(np.max(v[:,:], axis = 1)), c = "black", lw=2)

for ax in [a1, av, a2, a3]:
  ax.set_xlim(xx.min(), xx.max())

a2.set_ylim(-0.1, 1.1)
a2.set_yticks([0, 1])
a2.set_xticks([])

plot(m)
p = np.linspace(0.001, 1 - 0.001, 1000)[:, None]
q = 1 - p
plt.plot(p, -p * np.log(p) - q * np.log(q), label='entropy')
plt.plot(p, p * q, label='variance')
plt.legend()
plt.xlabel('probability')