将独立的 sklearn GaussianMixture 对数概率分数转换为总和为 1 的概率
Convert independent sklearn GaussianMixture log probability scores to probabilities summing to 1
我已经标记了二维数据。集合中有 4 个标签,我知道每个点与其标签的对应关系。我想,给定一个新的任意数据点,找出它具有 4 个标签中的每一个的概率。它必须属于一个且仅属于一个标签,因此概率之和应为 1。
到目前为止,我所做的是在与每个标签关联的数据点上训练 4 个独立的 sklearn GMM (sklearn.mixture.GaussianMixture
)。应该注意的是,我不希望训练具有 4 个组件的单个 GMM,因为我已经知道标签,并且不想以比我已知标签更糟糕的方式重新聚类。 (似乎有一种方法可以为 fit()
函数提供 Y=
标签,但我似乎无法让它工作)。
在上图中,点按其已知标签着色,等高线表示适合这 4 组点的四个独立 GMM。
对于一个新点,我尝试通过几种方式计算其标签的概率:
GaussianMixture.predict_proba()
:由于每个独立的 GMM 只有一个分布,这简单地 returns 所有模型的概率为 1。
GaussianMixture.score_samples()
:根据文档,这一个 returns "weighted log probabilities for each sample"。我的程序是,对于一个新点,我从代表上述每个分布的四个独立训练的 GMM 中的每一个调用此函数四次。我在这里确实得到了半合理的结果——通常是正确模型的正数和三个不正确模型中每一个的负数,交叉分布边界附近的点的结果更加混乱。这是一个典型的明确结果:
2.904136, -60.881554, -20.824841, -30.658509
这个点实际上与第一个标签相关联,并且最不可能是第二个标签(离第二个分布最远)。我的问题是如何将上述分数转换为总和为 1 的概率,并准确表示给定点属于四个分布之一且仅属于其中一个的概率?鉴于这是 4 个独立的模型,这可能吗?如果没有,是否有另一种我忽略的方法可以让我根据已知标签训练 GMM,并提供总和为 1 的概率?
一般来说,如果你不知道分数是如何计算的,但知道分数和概率之间存在单调关系,你可以简单地使用softmax函数来近似一个概率,用一个可选的控制分布尖峰度的温度变量。
让 V
成为您的分数列表,tau
成为温度。那么,
p = np.exp(V/tau) / np.sum(np.exp(V/tau))
就是你的答案。
PS:幸运的是,我们知道 sklearn GMM 评分是如何工作的,tau=1
的 softmax 是您的确切答案。
我已经标记了二维数据。集合中有 4 个标签,我知道每个点与其标签的对应关系。我想,给定一个新的任意数据点,找出它具有 4 个标签中的每一个的概率。它必须属于一个且仅属于一个标签,因此概率之和应为 1。
到目前为止,我所做的是在与每个标签关联的数据点上训练 4 个独立的 sklearn GMM (sklearn.mixture.GaussianMixture
)。应该注意的是,我不希望训练具有 4 个组件的单个 GMM,因为我已经知道标签,并且不想以比我已知标签更糟糕的方式重新聚类。 (似乎有一种方法可以为 fit()
函数提供 Y=
标签,但我似乎无法让它工作)。
在上图中,点按其已知标签着色,等高线表示适合这 4 组点的四个独立 GMM。
对于一个新点,我尝试通过几种方式计算其标签的概率:
GaussianMixture.predict_proba()
:由于每个独立的 GMM 只有一个分布,这简单地 returns 所有模型的概率为 1。GaussianMixture.score_samples()
:根据文档,这一个 returns "weighted log probabilities for each sample"。我的程序是,对于一个新点,我从代表上述每个分布的四个独立训练的 GMM 中的每一个调用此函数四次。我在这里确实得到了半合理的结果——通常是正确模型的正数和三个不正确模型中每一个的负数,交叉分布边界附近的点的结果更加混乱。这是一个典型的明确结果:
2.904136, -60.881554, -20.824841, -30.658509
这个点实际上与第一个标签相关联,并且最不可能是第二个标签(离第二个分布最远)。我的问题是如何将上述分数转换为总和为 1 的概率,并准确表示给定点属于四个分布之一且仅属于其中一个的概率?鉴于这是 4 个独立的模型,这可能吗?如果没有,是否有另一种我忽略的方法可以让我根据已知标签训练 GMM,并提供总和为 1 的概率?
一般来说,如果你不知道分数是如何计算的,但知道分数和概率之间存在单调关系,你可以简单地使用softmax函数来近似一个概率,用一个可选的控制分布尖峰度的温度变量。
让 V
成为您的分数列表,tau
成为温度。那么,
p = np.exp(V/tau) / np.sum(np.exp(V/tau))
就是你的答案。
PS:幸运的是,我们知道 sklearn GMM 评分是如何工作的,tau=1
的 softmax 是您的确切答案。