使用多变量Parzen窗口和球形核的贝叶斯分类

我在实现使用球形(或各向同性)核的Parzen窗口算法的贝叶斯分类器时遇到了问题。

我使用包含2个维度和3个不同类别的测试数据运行算法(每个类别有10个测试点和40个训练点,全部在2个维度上)。当我改变超参数的值(球形高斯核的sigma_sq)时,我发现这对点的分类没有影响。

这是我的密度估计器。我的self.sigma_sq在我的数据的所有维度上(2个维度)都是相同的

 for i in range(test_data.shape[0]):     log_prob_intermediate = 0      for j in range(n): #n是训练集的大小         c = -self.n_dims * np.log(2*np.pi)/2.0 - self.n_dims*np.log(self.sigma_sq)/2.0         log_prob_intermediate += (c - np.sum((test_data[i,:] -  self.train_data[j,:])**2.0) / (2.0 * self.sigma_sq))     log_prob.append(log_prob_intermediate / n)

我如何实现我的贝叶斯分类器:我的贝叶斯分类器必须区分3个类别。我创建了3个训练集和3个测试集(每个类别一个训练集和测试集)。对于测试集中的每个点,我对该点运行每个类别的密度估计器。这给我一个包含3个值的向量:新点属于类别1、类别2或类别3的对数概率。然后我选择最大值并将新点分配到该类别。

  1. 由于我使用的是球形高斯核,我认为我的sigma_sq必须在每个密度估计器中是通用的(每个类别一个密度估计器)。这是正确的吗?如果我对每个维度对使用不同的sigma_sq,这不是某种程度上变成了对角高斯核吗?

  2. 对于我的30个测试点列表(每个类别10个),我发现对这些点运行贝叶斯分类器继续给我每个点相同的分类,无论我使用什么sigma。这是正常的吗?由于这是球形高斯核,并且所有维度使用相同的核,增加或减少我的sigma_sq只是对我的对数概率产生比例效应而没有改变分类吗?或者我的密度估计器有我无法解决的问题。


回答:

让我们分别处理每个问题

  1. 对每个维度使用相同的sigma确实使你的核成为径向核;然而,你可以(而且应该!)对每个类别使用不同的sigma,因为每个分布通常需要不同的密度估计器,关于高斯情况下的核宽度选择的简单启发式方法,可以阅读例如Scott的经验法则或Silverman的后续工作。
  2. 很难判断在你的特定情况下,sigma的选择是否应该改变分类 – 一般来说应该是这样的;但每个数据集都有其自身的特性。然而,你的数据是仅2D的,这使其非常适合可视化。绘制你的数据,然后,绘制每个KDE,并简单地视觉上调查发生了什么

Related Posts

L1-L2正则化的不同系数

我想对网络的权重同时应用L1和L2正则化。然而,我找不…

使用scikit-learn的无监督方法将列表分类成不同组别,有没有办法?

我有一系列实例,每个实例都有一份列表,代表它所遵循的不…

f1_score metric in lightgbm

我想使用自定义指标f1_score来训练一个lgb模型…

通过相关系数矩阵进行特征选择

我在测试不同的算法时,如逻辑回归、高斯朴素贝叶斯、随机…

可以将机器学习库用于流式输入和输出吗?

已关闭。此问题需要更加聚焦。目前不接受回答。 想要改进…

在TensorFlow中,queue.dequeue_up_to()方法的用途是什么?

我对这个方法感到非常困惑,特别是当我发现这个令人费解的…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注