最近邻均值分类器的距离计算

问候,

我想知道在使用最近邻均值分类器对IRIS数据集进行分类时,需要进行多少次距离计算。

我知道IRIS数据集有4个特征,每条记录根据3个不同的标签进行分类。

根据一些教科书,计算可以按照以下方式进行:

enter image description here

然而,我对这些不同的符号感到困惑,不知道这个方程式的含义是什么。例如,方程式中的s^2是什么?


回答:

这种符号在大多数机器学习教科书中是标准的。此处的s是训练集的样本标准差。通常假设每个类别具有相同的标准差,这就是为什么每个类别都被分配了相同的值。

然而,你不应该关注这一点。最重要的一点是当先验概率相等时。这是合理的假设,意味着你期望数据集中每个类别的分布大致相等。通过这样做,分类器仅仅简化为寻找训练样本x到每个其他类别(由它们的均值向量表示)的最小距离。

计算方法非常简单。在你的训练集中,你有一组训练样本,每个样本属于特定的类别。对于IRIS数据集,你有三个类别。你找到每个类别的均值特征向量,分别存储为m1, m2m3。之后,要对一个新的特征向量进行分类,只需找到该向量到每个均值向量的最近距离。哪个距离最小,就将该新向量归为对应的类别。

由于你选择了MATLAB作为编程语言,让我用实际的IRIS数据集来演示一下。

load fisheriris; % 加载IRIS数据集[~,~,id] = unique(species); % 为每个样本分配一个唯一的IDmeans = zeros(3, 4); % 存储每个类别的均值向量for i = 1 : 3 % 按类别查找均值向量    means(i,:) = mean(meas(id == i, :), 1); % 查找类别1的均值向量endx = meas(10, :); % 从数据集中随机选择一行% 确定哪个类别的距离最小,从而找出类别[~,c] = min(sum(bsxfun(@minus, x, means).^2, 2));

这段代码相当简单。加载数据集,并由于标签在单元数组中,所以创建一组新的标签,将其枚举为1、2和3,以便于隔离出每个类别的训练样本并计算它们的均值向量。这就是for循环中所做的。一旦完成,我从训练集中随机选择一个数据点,然后计算这个点到每个均值向量的距离。我们选择给出最小距离的类别。

如果你想对整个数据集这样做,你可以,但这需要对维度进行一些排列组合。

data = permute(meas, [1 3 2]);means_p = permute(means, [3 1 2]);P = sum(bsxfun(@minus, data, means_p).^2, 3);[~,c] = min(P, [], 2);

datameans_p是转换后的特征和均值向量,以3D矩阵的形式存在,具有一个单一维度。第三行代码以向量化的方式计算距离,从而最终生成一个2D矩阵,每行i计算训练样本i到每个均值向量的距离。我们最终为每个样本找到距离最小的类别。

为了了解准确率,我们可以简单地计算我们正确分类的总次数的分数:

>> sum(c == id) / numel(id)ans =    0.9267

使用这个简单的最近邻均值分类器,我们的准确率达到了92.67%…还不错,但你可以做得更好。最后,回答你的问题,你需要K * d次距离计算,其中K是样本数量,d是类别数量。你可以通过检查上面的逻辑和代码清楚地看到这一点。

Related Posts

为什么我们在K-means聚类方法中使用kmeans.fit函数?

我在一个视频中使用K-means聚类技术,但我不明白为…

如何获取Keras中ImageDataGenerator的.flow_from_directory函数扫描的类名?

我想制作一个用户友好的GUI图像分类器,用户只需指向数…

如何查看每个词的tf-idf得分

我试图了解文档中每个词的tf-idf得分。然而,它只返…

如何修复 ‘ValueError: Found input variables with inconsistent numbers of samples: [32979, 21602]’?

我在制作一个用于情感分析的逻辑回归模型时遇到了这个问题…

如何向神经网络输入两个不同大小的输入?

我想向神经网络输入两个数据集。第一个数据集(元素)具有…

逻辑回归与机器学习有何关联

我们正在开会讨论聘请一位我们信任的顾问来做机器学习。一…

发表回复

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