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

问题描述 投票:1回答:1

问候,

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

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

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

enter image description here

但是,我迷失在这些不同的符号上,这个等式是什么意思。例如,s ^ 2是什么?

matlab machine-learning nearest-neighbor euclidean-distance centroid
1个回答
1
投票

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

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

你如何计算这个很简单。在训练集中,您有一组训练示例,每个示例都属于特定类。对于虹膜数据集的情况,您有三个类。您可以找到每个类的平均特征向量,它们将分别存储为m1, m2m3。之后,为了对新特征向量进行分类,只需找到从该向量到每个平均向量的最小距离。无论哪个距离最小,都是您指定的等级。

由于您选择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的新标签非常方便,因此很容易将每个类的训练示例隔离出来并计算它们的平均向量。这就是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是类的数量。通过检查上面的逻辑和代码,您可以清楚地看到这是必需的。

© www.soinside.com 2019 - 2024. All rights reserved.