问候,
我想知道在使用最近邻均值分类器对IRIS数据集进行分类时,需要进行多少次距离计算。
我知道IRIS数据集有4个特征,每条记录根据3个不同的标签进行分类。
根据一些教科书,计算可以按照以下方式进行:
然而,我对这些不同的符号感到困惑,不知道这个方程式的含义是什么。例如,方程式中的s^2是什么?
回答:
这种符号在大多数机器学习教科书中是标准的。此处的s
是训练集的样本标准差。通常假设每个类别具有相同的标准差,这就是为什么每个类别都被分配了相同的值。
然而,你不应该关注这一点。最重要的一点是当先验概率相等时。这是合理的假设,意味着你期望数据集中每个类别的分布大致相等。通过这样做,分类器仅仅简化为寻找训练样本x
到每个其他类别(由它们的均值向量表示)的最小距离。
计算方法非常简单。在你的训练集中,你有一组训练样本,每个样本属于特定的类别。对于IRIS数据集,你有三个类别。你找到每个类别的均值特征向量,分别存储为m1, m2
和m3
。之后,要对一个新的特征向量进行分类,只需找到该向量到每个均值向量的最近距离。哪个距离最小,就将该新向量归为对应的类别。
由于你选择了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);
data
和means_p
是转换后的特征和均值向量,以3D矩阵的形式存在,具有一个单一维度。第三行代码以向量化的方式计算距离,从而最终生成一个2D矩阵,每行i
计算训练样本i
到每个均值向量的距离。我们最终为每个样本找到距离最小的类别。
为了了解准确率,我们可以简单地计算我们正确分类的总次数的分数:
>> sum(c == id) / numel(id)ans = 0.9267
使用这个简单的最近邻均值分类器,我们的准确率达到了92.67%…还不错,但你可以做得更好。最后,回答你的问题,你需要K * d
次距离计算,其中K
是样本数量,d
是类别数量。你可以通过检查上面的逻辑和代码清楚地看到这一点。