我在实现使用球形(或各向同性)核的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的对数概率。然后我选择最大值并将新点分配到该类别。
-
由于我使用的是球形高斯核,我认为我的sigma_sq必须在每个密度估计器中是通用的(每个类别一个密度估计器)。这是正确的吗?如果我对每个维度对使用不同的sigma_sq,这不是某种程度上变成了对角高斯核吗?
-
对于我的30个测试点列表(每个类别10个),我发现对这些点运行贝叶斯分类器继续给我每个点相同的分类,无论我使用什么sigma。这是正常的吗?由于这是球形高斯核,并且所有维度使用相同的核,增加或减少我的sigma_sq只是对我的对数概率产生比例效应而没有改变分类吗?或者我的密度估计器有我无法解决的问题。
回答:
让我们分别处理每个问题
- 对每个维度使用相同的sigma确实使你的核成为径向核;然而,你可以(而且应该!)对每个类别使用不同的sigma,因为每个分布通常需要不同的密度估计器,关于高斯情况下的核宽度选择的简单启发式方法,可以阅读例如Scott的经验法则或Silverman的后续工作。
- 很难判断在你的特定情况下,sigma的选择是否应该改变分类 – 一般来说应该是这样的;但每个数据集都有其自身的特性。然而,你的数据是仅2D的,这使其非常适合可视化。绘制你的数据,然后,绘制每个KDE,并简单地视觉上调查发生了什么。