使用球核的多变量 Parzen Window 贝叶斯分类
Bayes Classification with Multivariate Parzen Window using Spherical Kernel
我在使用球形(或各向同性)核的 Parzen window 算法实现贝叶斯分类器时遇到问题。
我运行使用包含 2 个维度和 3 个不同 class 的测试数据对算法进行测试(对于每个 class,我有 10 个测试点和 40 个训练点,都是二维的)。当我更改超参数的值(sigma_sq 球形高斯核)时,我发现对点的 class 化没有影响。
这是我的密度估计器。我的 self.sigma_sq 在我的数据的所有维度(2 维)
中都是相同的
for i in range(test_data.shape[0]):
log_prob_intermediate = 0
for j in range(n): #n is size of training set
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 个 class。我创建了 3 个训练集和 3 个测试集(每个 class 一个训练集和一个测试集)。对于我测试集中的每个点,我 运行 点上每个 class 的密度估计器。这给了我一个包含 3 个值的向量:我的新点在 class1、class2 或 class3 中的对数概率。然后我选择最大值并将新点分配给 class.
因为我使用的是球形高斯核,所以我的理解是我的 sigma_sq 必须对每个密度估计器都是通用的(每个 class 一个密度估计器) .这个对吗?如果我对每个维度对都有不同的 sigma_sq,这不会给我一些对角高斯内核吗?
对于我的 30 个测试点列表(每个 class 10 个),我发现 运行在这些点上使用贝叶斯 classifier 继续给我每个点完全相同的 classification,不管我使用什么 sigma。这是正常的吗?因为它是一个球形高斯核,而且我所有的维度都使用相同的核,所以增加或减少我的 sigma_sq 只是对我的对数概率产生比例影响而 class 化没有变化?或者我的密度估计器是否有某种我无法弄清楚的问题。
让我们分别解决每一件事
- 对每个维度使用相同的 sigma 会使您的内核呈径向分布,这是事实;但是,您可以(并且应该!)对每个 class 使用不同的西格玛,因为每个分布通常需要不同的密度估计器,对于简单的启发式方法,请阅读例如斯科特的经验法则对于高斯情况下的内核宽度选择或 Silverman 的后续工作。
- 很难说在你的特定情况下选择 sigma 是否应该改变 class化 - 一般来说它应该是正确的;但是每个数据集都有自己的属性。但是,您的数据只是二维的,这使得它非常适合可视化。绘制数据,然后绘制每个 KDE 并简单地直观地调查正在发生的事情。
我在使用球形(或各向同性)核的 Parzen window 算法实现贝叶斯分类器时遇到问题。
我运行使用包含 2 个维度和 3 个不同 class 的测试数据对算法进行测试(对于每个 class,我有 10 个测试点和 40 个训练点,都是二维的)。当我更改超参数的值(sigma_sq 球形高斯核)时,我发现对点的 class 化没有影响。
这是我的密度估计器。我的 self.sigma_sq 在我的数据的所有维度(2 维)
中都是相同的 for i in range(test_data.shape[0]):
log_prob_intermediate = 0
for j in range(n): #n is size of training set
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 个 class。我创建了 3 个训练集和 3 个测试集(每个 class 一个训练集和一个测试集)。对于我测试集中的每个点,我 运行 点上每个 class 的密度估计器。这给了我一个包含 3 个值的向量:我的新点在 class1、class2 或 class3 中的对数概率。然后我选择最大值并将新点分配给 class.
因为我使用的是球形高斯核,所以我的理解是我的 sigma_sq 必须对每个密度估计器都是通用的(每个 class 一个密度估计器) .这个对吗?如果我对每个维度对都有不同的 sigma_sq,这不会给我一些对角高斯内核吗?
对于我的 30 个测试点列表(每个 class 10 个),我发现 运行在这些点上使用贝叶斯 classifier 继续给我每个点完全相同的 classification,不管我使用什么 sigma。这是正常的吗?因为它是一个球形高斯核,而且我所有的维度都使用相同的核,所以增加或减少我的 sigma_sq 只是对我的对数概率产生比例影响而 class 化没有变化?或者我的密度估计器是否有某种我无法弄清楚的问题。
让我们分别解决每一件事
- 对每个维度使用相同的 sigma 会使您的内核呈径向分布,这是事实;但是,您可以(并且应该!)对每个 class 使用不同的西格玛,因为每个分布通常需要不同的密度估计器,对于简单的启发式方法,请阅读例如斯科特的经验法则对于高斯情况下的内核宽度选择或 Silverman 的后续工作。
- 很难说在你的特定情况下选择 sigma 是否应该改变 class化 - 一般来说它应该是正确的;但是每个数据集都有自己的属性。但是,您的数据只是二维的,这使得它非常适合可视化。绘制数据,然后绘制每个 KDE 并简单地直观地调查正在发生的事情。