python - GPflow分类: interpretation of posterior variance

标签 python machine-learning classification gpflow

tutorial on multiclass classification on the GPflow website ,稀疏变分高斯过程 (SVGP) 用于一维玩具示例。就像 all other GPflow models 的情况一样,SVGP 模型有一个方法 predict_y(self, Xnew),它返回 Xnew 点处保留数据的均值和方差。

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


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


我稍微修改了教程的代码,在下图中添加了一个附加面板:第三个面板以黑色显示最大标准差(从 predict_y 获得的方差的平方根)。显然,它是衡量不确定性的一个很好的指标,而且最高可能值为 0.5 也可能并非巧合,但我找不到它的计算方式及其代表的含义。

Black line: highest variance of three

包含所有代码的完整笔记本 here .

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)

最佳答案

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

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

但是,您说得对,方差是衡量不确定性的一个很好的指标,方差越高意味着不确定性越大。熵作为 p 的函数看起来非常相似(尽管两者在边缘附近的行为不同):

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')

[1] https://github.com/GPflow/GPflow/blob/b8ed8332549a375da8658a1117470ac86d823e7f/gpflow/likelihoods.py#L76

关于python - GPflow分类: interpretation of posterior variance,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57673607/

相关文章:

machine-learning - 如何根据另一个向量将一个矩阵拆分为多个矩阵

machine-learning - 将训练数据转换到另一个空间,以便我们可以找到超平面

tensorflow - 像在 Keras 中一样显示 Tensorflow 模型摘要

python - 如何在我的代码中传递全局调试标志变量;我应该使用 argparse 吗?

Python子进程不返回

python - 使用 scipy 发行版运行 RandomizedSearchCV 时出现 "OverflowError: Python int too large to convert to C long"

matlab - 聚类和贝叶斯分类器 Matlab

python - 名称实体识别NLTK回顾

java - 精细文本分类 - 什么算法?

machine-learning - 使用 SvmPerf 或 LibLinear 训练的模型