最近均值分类器的距离计算器
Distance Calculations for Nearest Mean Classifer
问候,
如何计算需要执行多少距离计算才能使用最近均值分类器对 IRIS 数据集进行分类。
我知道 IRIS 数据集有 4 个特征,每条记录根据 3 个不同的标签分类。
根据一些教科书,可以这样计算:
但是,我对这些不同的符号以及这个等式是什么意思一头雾水。例如,方程中的s^2是多少?
该符号是大多数机器学习教科书的标准符号。 s
在这种情况下是训练集的样本标准差。假设每个 class 具有相同的标准偏差是很常见的,这就是为什么每个 class 被分配相同的值。
但是你不应该关注那个。最重要的一点是先验相等。这是一个公平的假设,这意味着您期望数据集中每个 class 的分布大致相等。通过这样做,classifier 简单地归结为找到从训练样本 x
到每个其他 classes 的最小距离,由它们的平均向量表示。
您的计算方式非常简单。在您的训练集中,您有一组训练示例,每个示例都属于特定的 class。对于 iris 数据集,您有三个 classes。您找到每个 class 的平均特征向量,它们将分别存储为 m1, m2
和 m3
。之后,要 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);
data
和 means_p
是变换后的特征和均值向量,其方式是具有单维的 3D 矩阵。第三行代码计算向量化的距离,以便最终生成一个二维矩阵,每一行 i
计算从训练示例 i
到每个均值向量的距离。我们最终为每个示例找到距离最小的class。
为了了解准确性,我们可以简单地计算我们 class 正确化的总次数的分数:
>> sum(c == id) / numel(id)
ans =
0.9267
使用这个简单的最近均值 classifier,我们的准确率为 92.67%...不错,但您可以做得更好。最后,要回答您的问题,您需要 K * d
距离计算,其中 K
是示例的数量,d
是 class 的数量。通过检查上面的逻辑和代码,您可以清楚地看到这是必需的。
问候,
如何计算需要执行多少距离计算才能使用最近均值分类器对 IRIS 数据集进行分类。
我知道 IRIS 数据集有 4 个特征,每条记录根据 3 个不同的标签分类。
根据一些教科书,可以这样计算:
但是,我对这些不同的符号以及这个等式是什么意思一头雾水。例如,方程中的s^2是多少?
该符号是大多数机器学习教科书的标准符号。 s
在这种情况下是训练集的样本标准差。假设每个 class 具有相同的标准偏差是很常见的,这就是为什么每个 class 被分配相同的值。
但是你不应该关注那个。最重要的一点是先验相等。这是一个公平的假设,这意味着您期望数据集中每个 class 的分布大致相等。通过这样做,classifier 简单地归结为找到从训练样本 x
到每个其他 classes 的最小距离,由它们的平均向量表示。
您的计算方式非常简单。在您的训练集中,您有一组训练示例,每个示例都属于特定的 class。对于 iris 数据集,您有三个 classes。您找到每个 class 的平均特征向量,它们将分别存储为 m1, m2
和 m3
。之后,要 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);
data
和 means_p
是变换后的特征和均值向量,其方式是具有单维的 3D 矩阵。第三行代码计算向量化的距离,以便最终生成一个二维矩阵,每一行 i
计算从训练示例 i
到每个均值向量的距离。我们最终为每个示例找到距离最小的class。
为了了解准确性,我们可以简单地计算我们 class 正确化的总次数的分数:
>> sum(c == id) / numel(id)
ans =
0.9267
使用这个简单的最近均值 classifier,我们的准确率为 92.67%...不错,但您可以做得更好。最后,要回答您的问题,您需要 K * d
距离计算,其中 K
是示例的数量,d
是 class 的数量。通过检查上面的逻辑和代码,您可以清楚地看到这是必需的。