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

问候,

我想知道在使用最近邻均值分类器对IRIS数据集进行分类时,需要进行多少次距离计算。

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

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

enter image description here

然而,我对这些不同的符号感到困惑,不知道这个方程式的含义是什么。例如,方程式中的s^2是什么?


回答:

这种符号在大多数机器学习教科书中是标准的。此处的s是训练集的样本标准差。通常假设每个类别具有相同的标准差,这就是为什么每个类别都被分配了相同的值。

然而,你不应该关注这一点。最重要的一点是当先验概率相等时。这是合理的假设,意味着你期望数据集中每个类别的分布大致相等。通过这样做,分类器仅仅简化为寻找训练样本x到每个其他类别(由它们的均值向量表示)的最小距离。

计算方法非常简单。在你的训练集中,你有一组训练样本,每个样本属于特定的类别。对于IRIS数据集,你有三个类别。你找到每个类别的均值特征向量,分别存储为m1, m2m3。之后,要对一个新的特征向量进行分类,只需找到该向量到每个均值向量的最近距离。哪个距离最小,就将该新向量归为对应的类别。

由于你选择了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);

datameans_p是转换后的特征和均值向量,以3D矩阵的形式存在,具有一个单一维度。第三行代码以向量化的方式计算距离,从而最终生成一个2D矩阵,每行i计算训练样本i到每个均值向量的距离。我们最终为每个样本找到距离最小的类别。

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

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

使用这个简单的最近邻均值分类器,我们的准确率达到了92.67%…还不错,但你可以做得更好。最后,回答你的问题,你需要K * d次距离计算,其中K是样本数量,d是类别数量。你可以通过检查上面的逻辑和代码清楚地看到这一点。

Related Posts

使用LSTM在Python中预测未来值

这段代码可以预测指定股票的当前日期之前的值,但不能预测…

如何在gensim的word2vec模型中查找双词组的相似性

我有一个word2vec模型,假设我使用的是googl…

dask_xgboost.predict 可以工作但无法显示 – 数据必须是一维的

我试图使用 XGBoost 创建模型。 看起来我成功地…

ML Tuning – Cross Validation in Spark

我在https://spark.apache.org/…

如何在React JS中使用fetch从REST API获取预测

我正在开发一个应用程序,其中Flask REST AP…

如何分析ML.NET中多类分类预测得分数组?

我在ML.NET中创建了一个多类分类项目。该项目可以对…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注