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

时间:2019-03-23 05:25:10

标签: matlab machine-learning nearest-neighbor euclidean-distance centroid

植物蛋白

如何使用“最近平均分类器”来计算将IRIS数据集分类所需的距离计算。

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

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

enter image description here

但是,我迷失于这些不同的表示法以及该方程式的含义。例如,方程中的s ^ 2是什么?

1 个答案:

答案 0 :(得分: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是类数。通过检查上面的逻辑和代码,您可以清楚地看到这是必需的。