K-最近邻(KNN)算法用于机器学习2025年1月30日 | 阅读 9 分钟 - K-最近邻是基于监督学习技术的最简单的机器学习算法之一。
- KNN算法假定新情况/数据与现有情况之间的相似性,并将新情况归入与现有类别最相似的类别。
- KNN算法存储所有可用数据,并根据相似性对新的数据点进行分类。这意味着当出现新数据时,可以使用KNN算法轻松将其归入最合适的类别。
- KNN算法可用于回归和分类,但主要用于分类问题。
- KNN是非参数算法,这意味着它不对底层数据做出任何假设。
- 它也被称为懒惰学习算法,因为它不会立即从训练集中学习,而是存储数据集,并在分类时对数据集执行操作。
- KNN算法在训练阶段只是存储数据集,当获得新数据时,它会将该数据分类到与新数据更相似的类别中。
- 示例:假设我们有一张看起来像猫和狗的生物图像,但我们想知道它是猫还是狗。为了进行这种识别,我们可以使用KNN算法,因为它基于相似性度量。我们的KNN模型将找到新数据集与猫和狗图像的相似特征,并根据最相似的特征将其归入猫或狗类别。
 为什么我们需要KNN算法?假设有两个类别,即A类和B类,我们有一个新的数据点x1,那么这个数据点会属于哪个类别?为了解决这类问题,我们需要KNN算法。借助KNN,我们可以轻松识别特定数据集的类别。请看下图  KNN如何工作?KNN的工作可以根据以下算法进行解释 - 步骤 1:选择邻居的数量K
- 步骤 2:计算K个邻居的欧氏距离
- 步骤 3:根据计算出的欧氏距离,选取K个最近的邻居。
- 步骤 4:在这k个邻居中,计算每个类别的数据点数量。
- 步骤 5:将新的数据点分配给邻居数量最多的那个类别。
- 步骤 6:我们的模型就准备好了。
假设我们有一个新的数据点,需要将其放入所需的类别。请看下图  - 首先,我们将选择邻居的数量,因此我们将选择k=5。
- 接下来,我们将计算数据点之间的欧氏距离。欧氏距离是两点之间的距离,我们在几何学中已经学习过。计算方法如下
 - 通过计算欧氏距离,我们得到了最近的邻居,其中A类中有三个最近的邻居,B类中有两个最近的邻居。请看下图
 - 可以看到,3个最近的邻居来自A类,因此这个新的数据点必须属于A类。
如何在KNN算法中选择K值?以下是在KNN算法中选择K值时需要记住的一些要点 - 没有特定方法可以确定“K”的最佳值,因此我们需要尝试一些值来找到最佳值。最推荐的K值是5。
- K值非常小,例如K=1或K=2,可能会产生噪声,并导致模型受到异常值的影响。
- 较大的K值是好的,但可能会遇到一些困难。
KNN算法的优点- 易于实现。
- 它对带有噪声的训练数据具有鲁棒性
- 如果训练数据量大,效果可能更好。
KNN算法的缺点- 总是需要确定K的值,这有时可能很复杂。
- 由于需要计算数据点与所有训练样本之间的距离,因此计算成本很高。
KNN算法的Python实现为了实现KNN算法的Python版本,我们将使用与逻辑回归相同的问题和数据集。但在这里,我们将提高模型的性能。以下是问题描述 KNN算法问题:有一家汽车制造商公司制造了一款新的SUV汽车。公司希望向对购买该SUV感兴趣的用户投放广告。因此,对于这个问题,我们有一个包含社交网络中多个用户信息的数据库。数据库包含大量信息,但我们将估计薪资和年龄作为自变量,将购买变量作为因变量。以下是数据库  实现KNN算法的步骤 - 数据预处理步骤
- 将KNN算法拟合到训练集
- 预测测试结果
- 测试结果的准确性(创建混淆矩阵)
- 可视化测试集结果。
数据预处理步骤 数据预处理步骤将与逻辑回归完全相同。以下是其代码 通过执行上述代码,我们的数据库将被导入到程序中并得到很好的预处理。特征缩放后,我们的测试数据库将显示如下  从上面的输出图像可以看出,我们的数据已成功缩放。 - 将KNN分类器拟合到训练数据
现在我们将KNN分类器拟合到训练数据。为此,我们将导入Sklearn Neighbors库的KNeighborsClassifier类。导入类后,我们将创建该类的Classifier对象。该类的参数将是- n_neighbors:定义算法所需的邻居数量。通常取5。
- metric='minkowski':这是默认参数,它决定了点之间的距离。
- p=2:这等同于标准的欧氏度量。
然后我们将分类器拟合到训练数据。以下是其代码
输出:执行上述代码后,我们将得到如下输出 Out[10]:
KNeighborsClassifier(algorithm='auto', leaf_size=30, metric='minkowski',
metric_params=None, n_jobs=None, n_neighbors=5, p=2,
weights='uniform')
- 预测测试结果:为了预测测试集结果,我们将创建一个y_pred向量,就像我们在逻辑回归中所做的那样。以下是其代码
输出 以上代码的输出将是  - 创建混淆矩阵
现在我们将为我们的KNN模型创建混淆矩阵,以查看分类器的准确性。以下是其代码
在上面的代码中,我们导入了confusion_matrix函数并使用变量cm调用了它。 输出:执行上述代码后,我们将得到如下矩阵  在上面的图像中,我们可以看到有64+29=93个正确预测,3+4=7个错误预测。而在逻辑回归中,有11个错误预测。因此,我们可以说使用KNN算法提高了模型的性能。 - 可视化训练集结果
现在,我们将可视化KNN模型的训练集结果。代码将与我们在逻辑回归中所做的相同,只是图表的名称不同。以下是其代码
输出 执行上述代码后,我们将得到下图  输出图与我们在逻辑回归中获得的图不同。可以通过以下几点来理解 - 正如我们所看到的,图表显示了红点和绿点。绿点代表购买(1),红点代表未购买(0)变量。
- 图表显示的是不规则的边界,而不是直线或曲线,因为这是KNN算法,即查找最近的邻居。
- 图表已将用户正确分类,因为大多数未购买SUV的用户都在红色区域,而购买了SUV的用户都在绿色区域。
- 图表显示了良好的结果,但仍有一些绿点在红色区域,红点在绿色区域。但这不是什么大问题,因为这可以防止模型出现过拟合问题。
- 因此,我们的模型已经很好地训练好了。
- 可视化测试集结果
在模型训练后,我们将通过输入新数据,即测试数据来测试结果。代码保持不变,只有一些小的更改:例如,x_train和y_train将替换为x_test和y_test。 以下是其代码
输出  上图显示了测试数据集的输出。正如我们在图中所看到的,预测输出非常好,因为大多数红点都在红色区域,而大多数绿点都在绿色区域。 然而,红色区域中有一些绿点,绿色区域中有一些红点。所以这些是我们混淆矩阵中观察到的不正确结果(7个错误输出)。
机器学习K-最近邻(KNN)算法选择题练习1. K-最近邻(KNN)算法应用于大型数据集时,主要的计算挑战是什么? - 高方差
- 高偏差
- 高维度
- 高计算成本
答案 D) 高计算成本 说明 KNN在预测阶段有很高的计算成本,因为它需要计算测试实例与所有训练实例之间的距离。
2. KNN中'k'值的选择如何影响偏差-方差权衡? - 较低的'k'会增加偏差并降低方差
- 较高的'k'会增加方差并降低偏差
- 较低的'k'会降低偏差并增加方差
- 较高的'k'会增加偏差并降低方差
答案 D) 较高的'k'会增加偏差并降低方差 说明 较高的'k'值使模型更简单(偏差更高),但对噪声的敏感度较低(方差更低)。
3. 在KNN算法中,哪种距离度量最常用于连续数据? - 曼哈顿距离
- 闵可夫斯基距离
- 欧氏距离
- 汉明距离
答案 C) 欧氏距离 说明 欧氏距离常用于连续数据的KNN,因为它计算欧氏空间中两点之间的直线距离。
4. 在KNN的上下文中,使用较小的'k'值对算法对噪声的敏感性有什么影响? - 降低对噪声的敏感性
- 增加对噪声的敏感性
- 对噪声敏感性无影响
- 使噪声敏感性正常化
答案 B) 增加对噪声的敏感性 说明 较小的'k'值会使算法对数据集中的噪声和异常值更加敏感,因为在分类决策中考虑的邻居数量较少。
5. 对于高维数据,哪种技术可用于加速KNN算法中的最近邻搜索? - 降维
- 增加'k'的值
- 规范化
- 使用曼哈顿距离
答案 A) 降维 说明 降维技术,如PCA,可用于减少特征数量,从而通过降低计算成本来加速最近邻搜索。
|