简单的 kNN 示例

机器算法验证 机器学习 k-最近邻
2022-04-13 15:57:47

有人可以用非常简单的方式解释 kNN 算法如何预测点集的类别吗?是否有任何资源可供初学者使用图来理解算法?

2个回答

我假设您已经阅读了Wikipedia kNN 条目(它有一个图表说明它是如何在二维中工作的。)

举个简单的例子,假设您希望按“维护良好”或“维护不良好”对房屋进行分类。你有一张地图,你可以在这张地图上贴上大头针:绿色表示“维护良好”,红色表示“维护不好”。您上网并在您所在城镇的区域中找到几十所房屋的最近照片,当您查看每栋房屋时,您会在地图上的房屋位置处放置一个红色或绿色的大头针。

然后你的房地产经纪人朋友打电话给你说:“嘿,我接到一个电话,询问某某地址的房子,我听说你正在研究维护良好的房子。这栋房子可能维护得很好吗?” 因此,您在地图上找到该地址并查看最近的 10 个大头针,10 个中有 8 个是绿色的。所以你告诉你的朋友,“看起来它很有可能得到很好的维护。”

在这个例子中,k=10,距离是房屋的字面距离(基于纬度/经度)。我们假设街区、街道、社区是否维护良好,这在某种程度上是合理的,但当然总有例外。

所以,概括一下,你首先收集一组你已经知道分类的点。这些将是你的榜样。当你有一个新的点出现并且你想对它进行分类时,你会查看k最接近新点的示例和最常见的分类是您决定新点必须是什么。显然,如果所有k最接近的样本来自一个类别,您非常确定您的新分类。如果k最近的样本属于k不同的班级你真的根本无法做出决定。在这两个极端之间,你有不同程度的自信。

k=1,新点被认为与其最近的样本属于同一类,无需投票。但是由于我提到的例外情况,您更有可能犯错误。较大k允许更多的投票,通常会导致更稳定的结果,但你也会得到更远的样本投票,并且你会同质化局部变化。

在实际问题中,您不会有房屋的纬度/经度,而是每个数据点的大量事实/测量值。对于一个人来说,可能是身高、体重、年龄、吸烟者/非吸烟者等。人与人之间的距离更抽象,但你可以想出这样的距离,做同样的事情——在与事实一样多的维度上/测量。

使用R中可用的安德森鸢尾花数据集,我研究了一个临时功能(只是为了确保我明白了这个想法),以根据数据集中的不同植物测量iris {datasets}来预测三种鸢尾花

在此处输入图像描述

我们想根据萼片和花瓣的测量来预测鸢尾的实际物种(Iris setosa、Iris virginica 和 Iris versicolor )。由于物种是分类级别,这是一个 ML分类问题

如果仅测量两个维度(或变量)作为预测变量,则将很容易可视化。例如,如果我们只是测量sepal lengthand sepal width

在此处输入图像描述

每个点都可以看作是从原点开始的向量,到其他相邻点的距离可以简单地计算为,对应于从数据集中一个点到其相邻条目的向量的长度。您可以简单地说,您正在测量任何给定点与个相邻点之间的欧几里得距离,然后将 和 的数量制成表格赢家点中计数最多的物种作为预测标签。在平局的情况下,可以掷硬币来选择获胜者。coord=xcoord=y(coordicoordj)2ksetosaversicolorvirginicak

向量概念的原因是,在这种情况下,有两个以上的变量用于预测物种。它看起来像这样:

在此处输入图像描述

所以我们必须把每个点想象成 4 维超空间中的一个向量——达利可以把这个悬浮在地中海上空的超立方体上的数据云描绘出来R,不太确定... 幸运的是,线性代数并不需要太多的创造性灵感:为每个数据点测量的每个变量形成一个向量,与其他向量的距离简单地计算为向量从一个点延伸的长度到它的个相邻条目。k

我在 R 中编写了一个函数来为这个数据集做这件事,与其说是为了重新发现轮子,不如说是为了确保我必须克服将这个直观系统付诸实践的所有障碍。它是特定于数据的,但很容易适应其他数据集。代码在这里的测试集上的结果与R 中的内置函数相差不远,并且在此结果列表中看起来非常符合目标:k=13knn {class}

> print(table(predicted = data_test[,6], actual = data_test[,5]))
            actual
predicted    setosa versicolor virginica
  setosa         22          0         0
  versicolor      0         11         0
  virginica       0          4        23
> mean(data_test[,6] == data_test[,5]) # Accuracy rate
[1] 0.9333333

作为无监督 ML 中的一个相关对位点,如果我们没有标识物种的标签,我们可以运行k-means 聚类,作为概念练习,我在此处包含代码作为原始答案的说明性扩展,我没有将数据分成训练和测试。这些地块实际上与上面的地块相同,尽管没有相关的物种标签。

clusplot相反,如果我们求助于可用的 R 包,并在执行 PCA 降维后绘制集群,我们仅使用前两个组件(带有标记示例)得到以下分离:

在此处输入图像描述

颜色阴影与上面原始散点图矩阵上的virginica 和 versicolor 之间的重叠平行,setosa 更清晰可分离。