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

Distance Calculations for Nearest Mean Classifer

问候,

如何计算需要执行多少距离计算才能使用最近均值分类器对 IRIS 数据集进行分类。

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

根据一些教科书,可以这样计算:

但是,我对这些不同的符号以及这个等式是什么意思一头雾水。例如,方程中的s^2是多少?

该符号是大多数机器学习教科书的标准符号。 s 在这种情况下是训练集的样本标准差。假设每个 class 具有相同的标准偏差是很常见的,这就是为什么每个 class 被分配相同的值。

但是你不应该关注那个。最重要的一点是先验相等。这是一个公平的假设,这意味着您期望数据集中每个 class 的分布大致相等。通过这样做,classifier 简单地归结为找到从训练样本 x 到每个其他 classes 的最小距离,由它们的平均向量表示。

您的计算方式非常简单。在您的训练集中,您有一组训练示例,每个示例都属于特定的 class。对于 iris 数据集,您有三个 classes。您找到每个 class 的平均特征向量,它们将分别存储为 m1, m2m3。之后,要 class 确定一个新的特征向量,只需找到从该向量到每个均值向量的最小距离。距离最小的那个就是您要分配的 class。

既然您选择了 MATLAB 作为语言,请允许我用实际的鸢尾花数据集进行演示。

load fisheriris; % Load iris dataset
[~,~,id] = unique(species); % Assign for each example a unique ID
means = zeros(3, 4); % Store the mean vectors for each class
for i = 1 : 3 % Find the mean vectors per class
    means(i,:) = mean(meas(id == i, :), 1); % Find the mean vector for class 1
end

x = meas(10, :); % Choose a random row from the dataset

% Determine which class has the smallest distance and thus figure out the class
[~,c] = min(sum(bsxfun(@minus, x, means).^2, 2));

代码相当简单。加载数据集,由于标签位于元胞数组中,因此可以方便地创建一组枚举为 1、2 和 3 的新标签,这样就可以很容易地分离出每个 class 的训练示例并进行计算他们的平均向量。这就是 for 循环中发生的事情。完成后,我从训练集中选择一个随机数据点,然后计算从该点到每个均值向量的距离。我们选择给我们最小距离的class。

如果您想对整个数据集执行此操作,您可以,但这需要对维度进行一些排列。

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 矩阵。第三行代码计算向量化的距离,以便最终生成一个二维矩阵,每一行 i 计算从训练示例 i 到每个均值向量的距离。我们最终为每个示例找到距离最小的class。

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

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

ans =

    0.9267

使用这个简单的最近均值 classifier,我们的准确率为 92.67%...不错,但您可以做得更好。最后,要回答您的问题,您需要 K * d 距离计算,其中 K 是示例的数量,d 是 class 的数量。通过检查上面的逻辑和代码,您可以清楚地看到这是必需的。