解锁机器学习核心算法 | K -近邻算法:机器学习的神奇钥匙

一、引言

今天我们继续学习机器学习核心算法 —— K - 近邻(K-Nearest Neighbors,简称 KNN)算法。它就像是一位经验丰富的 “老江湖”,以其简单而又强大的方式,在众多机器学习任务中占据着不可或缺的地位。

K - 近邻算法,作为机器学习中的一种基本分类与回归方法,以其独特的 “基于邻居投票” 策略而闻名。它的核心思想简单易懂,就如同我们在生活中判断一个人可能的兴趣爱好时,会参考他身边最常接触的朋友们的兴趣一样。在 K - 近邻算法中,当面对一个新的数据点需要判断其类别时,算法会在已有的训练数据集中寻找与它距离最近的 K 个邻居,然后根据这 K 个邻居的类别来决定新数据点的归属。这种直观的判断方式,使得 K - 近邻算法在许多实际应用中都展现出了强大的性能和适应性。

接下来,让我们一起深入探索 K - 近邻算法的奇妙世界,揭开它神秘的面纱,了解它的原理、实现步骤以及在不同场景下的精彩应用。

二、K - 近邻算法原理剖析

在这里插入图片描述

2.1 基本思想

K - 近邻算法遵循 “物以类聚、人以群分” 的朴素思想。简单来说,就是一个样本的类别由它最接近的 K 个邻居的类别来决定。例如,在一个水果分类的问题中,我们有一堆已经标注好类别(苹果、橙子、香蕉)的水果样本,这些样本具有一些特征,比如颜色、形状、大小等。现在来了一个新的水果,我们要判断它属于哪一类。K - 近邻算法会在已有的水果样本中,找到与这个新水果在颜色、形状、大小等特征上最相似(距离最近)的 K 个邻居。如果这 K 个邻居中,大多数是苹果,那么我们就可以认为这个新水果大概率也是苹果。

2.2 工作流程

  • 计算距离对于一个待分类的新样本,需要计算它与训练集中每个样本之间的距离。距离的计算方式有多种,常见的有欧氏距离、曼哈顿距离等,后面会详细介绍。例如,在一个二维空间中,有样本 A (1, 2) 和样本 B (4, 6),使用欧氏距离公式计算它们之间的距离为: d = ( 4 − 1 ) 2 + ( 6 − 2 ) 2 = 9 + 16 = 5 d = \sqrt{(4 - 1)^2 + (6 - 2)^2} = \sqrt{9 + 16} = 5 d=(41)2+(62)2 =9+16 =5

  • 排序将计算得到的所有距离按照从小到大的顺序进行排序。这样可以方便后续找到距离最近的 K 个样本。

  • 选 k 个最近邻从排序后的距离列表中,选取前 K 个最小距离所对应的样本,这些样本就是新样本的 K 个最近邻。

  • 统计类别频率统计这 K 个最近邻样本中每个类别出现的频率。比如在前面水果分类的例子中,如果 K = 5,这 5 个最近邻中有 3 个苹果,1 个橙子,1 个香蕉,那么苹果的频率就是 3/5,橙子的频率是 1/5,香蕉的频率是 1/5。

  • 确定预测分类将出现频率最高的类别作为新样本的预测分类。在上述例子中,因为苹果的频率最高,所以新样本被预测为苹果。

2.3 距离度量方式

  • 欧氏距离是最常见的距离度量方法,它是在多维空间中两点间的 “直线” 距离。
    二维空间中,两点 ( x 1 , y 1 ) (x_1, y_1) (x1,y1) ( x 2 , y 2 ) (x_2, y_2) (x2,y2) 之间的欧氏距离公式为: d = ( x 2 − x 1 ) 2 + ( y 2 − y 1 ) 2 d = \sqrt{(x_2 - x_1)^2 + (y_2 - y_1)^2} d=(x2x1)2+(y2y1)2 三维空间中,两点 ( x 1 , y 1 , z 1 ) (x_1, y_1, z_1) (x1,y1,z1) ( x 2 , y 2 , z 2 ) (x_2, y_2, z_2) (x2,y2,z2) 之间的欧氏距离公式为: d = ( x 2 − x 1 ) 2 + ( y 2 − y 1 ) 2 + ( z 2 − z 1 ) 2 d = \sqrt{(x_2 - x_1)^2 + (y_2 - y_1)^2 + (z_2 - z_1)^2} d=(x2x1)2+(y2y1)2+(z2z1)2 推广到 n 维空间,两点 A ( x 11 , x 12 , ⋯   , x 1 n ) A(x_{11}, x_{12}, \cdots, x_{1n}) A(x11,x12,,x1n) B ( x 21 , x 22 , ⋯   , x 2 n ) B(x_{21}, x_{22}, \cdots, x_{2n}) B(x21,x22,,x2n)之间的欧氏距离公式为: d = ∑ i = 1 n ( x 2 i − x 1 i ) 2 d = \sqrt{\sum_{i = 1}^{n}(x_{2i} - x_{1i})^2} d=i=1n(x2ix1i)2 欧氏距离适用于数据特征具有相同量纲且分布较为均匀的情况,比如在分析学生的考试成绩(成绩都在 0 - 100 分之间)时,可以使用欧氏距离来衡量学生成绩之间的相似性。

  • 曼哈顿距离也称为城市街区距离,它是通过计算两个点在标准坐标系上的绝对轴距总和来衡量的。
    二维空间中,两点 ( x 1 , y 1 ) (x_1, y_1) (x1,y1) ( x 2 , y 2 ) (x_2, y_2) (x2,y2) 之间的曼哈顿距离公式为: d = ∣ x 2 − x 1 ∣ + ∣ y 2 − y 1 ∣ d = |x_2 - x_1| + |y_2 - y_1| d=x2x1+y2y1三维空间中,两点 ( x 1 , y 1 , z 1 ) (x_1, y_1, z_1) (x1,y1,z1) ( x 2 , y 2 , z 2 ) (x_2, y_2, z_2) (x2,y2,z2) 之间的曼哈顿距离公式为: d = ∣ x 2 − x 1 ∣ + ∣ y 2 − y 1 ∣ + ∣ z 2 − z 1 ∣ d = |x_2 - x_1| + |y_2 - y_1| + |z_2 - z_1| d=x2x1+y2y1+z2z1 曼哈顿距离更适合于衡量数据在各个维度上的差异总和,例如在城市交通中,由于道路是网格状的,车辆只能沿着街道行驶,此时用曼哈顿距离来计算两个地点之间的实际行驶距离更为合适。

  • 闵可夫斯基距离它是欧氏距离和曼哈顿距离的一般化,公式为: d = ( ∑ i = 1 n ∣ x 2 i − x 1 i ∣ p ) 1 p d = (\sum_{i = 1}^{n}|x_{2i} - x_{1i}|^p)^{\frac{1}{p}} d=(i=1nx2ix1ip)p1其中 p p p 是一个变参数。 p p p = 1 时,就是曼哈顿距离;当 p p p = 2 时,就是欧氏距离;当 p p p 趋近于无穷大时,就是切比雪夫距离。闵可夫斯基距离可以根据不同的 p p p 值,灵活地适应各种数据分布和距离度量需求。例如,在某些机器学习任务中,通过调整 p p p 值,可以找到最适合数据特点的距离度量方式,从而提高模型的性能。

三、K 值的选择与影响

3.1 K 值对模型的影响

在 K - 近邻算法中,K 值的选择就像是给模型设定了一个 “视野范围”,对模型的性能有着至关重要的影响。

K 值过小时,模型的 “视野” 就会变得很狭窄,它只关注与待分类样本非常接近的少数几个邻居。这就好比一个人在判断事物时,只参考身边最亲近的几个人的意见,而忽略了更广泛的信息。在这种情况下,模型容易受到噪声和异常值的影响。因为只要这少数几个邻居中有噪声点,就可能会对最终的分类结果产生很大的干扰,导致模型出现过拟合现象。例如,在一个包含水果样本的数据集中,可能存在一些被错误标注的样本(噪声),如果 K 值取 1,那么当遇到一个新的水果样本需要分类时,只要这个新样本距离噪声点最近,就会被错误地分类。

相反,当 K 值过大时,模型的 “视野” 变得过于宽泛,它会考虑到距离较远的大量邻居。这就如同一个人在做决策时,听取了太多人的意见,其中很多人的意见可能与问题本身并不相关,从而导致决策变得模糊和不准确。在模型中,这会使得模型变得过于平滑,容易忽略掉数据中的局部特征和细节信息,进而导致欠拟合。例如,在一个数据分布不均匀的数据集里,若 K 值过大,模型可能会将新数据点错误地分类到数据量较多的类别中,而忽略了新数据点周围局部区域的真实分布情况。

3.2 如何选择 K 值

既然 K 值对模型性能的影响如此之大,那么如何选择一个合适的 K 值就成为了应用 K - 近邻算法时的关键问题。一种常用且有效的方法是交叉验证(Cross-Validation)

交叉验证的基本思想是将数据集划分为多个子集,然后在不同的子集上进行训练和验证,通过综合多个验证结果来评估模型的性能。

下面以常见的 k 折交叉验证(k-fold Cross-Validation)为例,介绍其具体实现步骤:

  1. 数据集划分将原始数据集 D 随机划分为 k 个大小相似的子集 D 1 , D 2 , ⋯   , D k D_1, D_2, \cdots, D_k D1,D2,,Dk ,每个子集都尽可能保持与原始数据集相似的分布。

  2. 训练与验证对于每个可能的 K 值,进行以下操作:

    1. 依次将其中一个子集 D i D_i Di 作为验证集,其余 k − 1 k - 1 k1 个子集合并作为训练集。

    2. 使用训练集训练 K - 近邻模型,并在验证集 D i D_i Di 上进行验证,记录模型在验证集上的性能指标,如准确率、召回率、F1 值等。

  3. 性能评估重复步骤 2,直到每个子集都作为验证集被使用一次。然后计算每个 K 值在 k 次验证中的平均性能指标。

  4. 选择最优 K 值比较不同 K 值下的平均性能指标,选择使平均性能指标最优的 K 值作为最终的 K 值。

下面是使用 Python 和 Scikit-learn 库实现 k 折交叉验证选择 K 值的代码示例:

from sklearn.datasets import load_iris

from sklearn.model_selection import train_test_split, cross_val_score

from sklearn.neighbors import KNeighborsClassifier

import numpy as np

import matplotlib.pyplot as plt

# 加载鸢尾花数据集

iris = load_iris()

X = iris.data

y = iris.target

# 划分训练集和测试集

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)

# 初始化K值范围

k_values = range(1, 31)

cv_scores = []

# 进行k折交叉验证(这里使用5折交叉验证)

for k in k_values:

   knn = KNeighborsClassifier(n_neighbors=k)

   scores = cross_val_score(knn, X_train, y_train, cv=5, scoring='accuracy')

   cv_scores.append(scores.mean())

# 找到最优K值

best_k = k_values[np.argmax(cv_scores)]

print(f"最优的K值为: {best_k}")

# 绘制K值与交叉验证得分的关系图

plt.plot(k_values, cv_scores)

plt.xlabel('K值')

plt.ylabel('交叉验证平均准确率')

plt.title('K值对交叉验证准确率的影响')

plt.show()

在上述代码中,我们首先加载了鸢尾花数据集,并将其划分为训练集和测试集。然后,我们在一个指定的 K 值范围内(这里是 1 到 30),使用 5 折交叉验证对每个 K 值进行评估,计算每个 K 值下模型在 5 次验证中的平均准确率,并将这些平均准确率存储在 cv_scores 列表中。最后,通过比较 cv_scores 中的值,找到平均准确率最高的 K 值,即为最优的 K 值。上述程序的输出结果如下所示:

最优的K值为: 1
模型的准确率为: 1.0

同时,我们还绘制了 K 值与交叉验证平均准确率的关系图(如下图所示),通过图形可以更直观地观察到 K 值对模型性能的影响,帮助我们理解 K 值选择的重要性和方法。
在这里插入图片描述

四、K - 近邻算法的优缺点

4.1 优点

  • 简单易懂,易于实现K - 近邻算法的原理非常直观,核心思想就是基于邻居的类别来判断新样本的类别,其实现过程也不涉及复杂的数学推导和模型训练过程,只需要按照计算距离、排序、选择最近邻、统计类别频率并确定分类的步骤即可完成,这使得它对于初学者和快速搭建原型来说是一个非常友好的算法。比如在简单的文本分类任务中,我们可以快速利用 K - 近邻算法对新的文本进行分类,不需要进行复杂的模型构建和参数调整。

  • 无需训练,即时推断与许多其他机器学习算法(如决策树、神经网络等)不同,K - 近邻算法不需要预先进行训练来构建模型。它是一种 “懒惰学习” 算法,只有在需要对新样本进行分类或预测时,才会根据训练数据进行计算。这种特性使得它对新数据的适应性很强,当有新的数据加入时,不需要重新训练整个模型,只需要将新数据加入到训练数据集中即可,非常适合那些数据不断更新的应用场景,如实时推荐系统,当有新的用户行为数据产生时,K - 近邻算法可以快速地利用这些新数据进行推荐。

  • 对异常值不敏感由于 K - 近邻算法是基于局部信息进行判断的,它在决策时考虑的是多个邻居的类别,而不是单个样本的特征。因此,个别异常值(离群点)对最终分类结果的影响相对较小。例如,在一个图像分类任务中,即使训练数据集中存在少量被错误标注或具有异常特征的图像样本,K - 近邻算法在分类新图像时,也不太会因为这些异常值而做出错误的判断,因为它是综合考虑多个邻近图像的类别来进行决策的。

  • 适用于多分类问题K - 近邻算法天然适用于多分类问题,不需要像一些其他算法(如逻辑回归)那样进行额外的扩展或修改。在多分类任务中,它可以直接根据 K 个最近邻中出现频率最高的类别来确定新样本的类别,实现起来非常简单直接。例如,在一个将水果分为苹果、橙子、香蕉、草莓等多种类别的分类任务中,K - 近邻算法可以轻松地处理这种多分类情况,根据邻居的类别分布来准确地对新的水果样本进行分类。

4.2 缺点

  • 计算复杂度高在进行预测时,K - 近邻算法需要计算新样本与训练集中所有样本之间的距离,这使得其计算量与训练集的大小成正比。当训练集规模非常大时,计算距离的过程会消耗大量的时间和计算资源。例如,在一个包含数百万条用户数据的推荐系统中,每有一个新用户需要推荐内容,K - 近邻算法都需要计算该新用户与数百万个已有用户之间的距离,这在实际应用中可能是非常耗时的,严重影响系统的实时性。

  • 空间复杂度高K - 近邻算法需要存储整个训练数据集,因为在预测时需要用到所有的训练样本。这对于大规模数据集来说,会占用大量的内存空间。如果训练数据集中包含大量的特征和样本,可能会导致内存不足的问题。比如在一个医学图像识别项目中,图像数据通常具有较高的分辨率和大量的像素点,每个图像样本都占据较大的存储空间,若使用 K - 近邻算法,存储这些大量的医学图像训练数据将对硬件的存储能力提出很高的要求。

  • 对不平衡数据集敏感当训练数据集中不同类别的样本数量存在较大差异时,K - 近邻算法的分类效果会受到严重影响。因为在确定 K 个最近邻时,样本数量较多的类别更容易在 K 个邻居中占据主导地位,从而导致新样本更容易被误分类到样本数量多的类别中。例如,在一个疾病诊断的数据集中,正常样本的数量远远多于患病样本的数量,那么在使用 K - 近邻算法进行诊断时,新的样本很可能会被错误地判断为正常,而忽略了患病的可能性。为了解决这个问题,可以采用一些方法,如过采样(增加少数类样本的数量)、欠采样(减少多数类样本的数量)或者调整分类决策阈值等。

  • “维度灾难” 问题随着数据特征维度的增加,样本之间的距离计算变得更加复杂,而且样本在高维空间中会变得非常稀疏,这使得距离度量的有效性降低,K - 近邻算法的性能也会随之下降。例如,在文本分类中,若将每个单词都作为一个特征,那么文本数据的维度会非常高,此时 K - 近邻算法在计算距离和分类时会遇到很大的困难,分类准确率会明显下降。为了缓解 “维度灾难” 问题,可以采用特征选择或降维技术,如主成分分析(PCA)、线性判别分析(LDA)等,去除一些冗余或不重要的特征,降低数据的维度 。

五、K - 近邻算法的应用领域

5.1 图像识别

在图像识别领域,K - 近邻算法应用广泛。如手写数字识别,以 MNIST 数据集为例,先将手写数字图像转为特征向量(如 28x28 像素图像转 784 维向量),待识别图像通过计算与数据集中图像特征向量距离,找 K 个最近邻,依其类别多数判定结果。物体识别也类似,提取图像颜色直方图等特征转向量,新图像靠 K 近邻图像类别判断自身类别。

5.2 文本分类

文本分类任务中,K - 近邻算法用于判断待分类文档类别。以新闻文章分类为例,先对文本预处理,再用词袋模型或 TF - IDF 等转特征向量。新文章通过计算与已标注数据集文章特征向量的余弦相似度找 K 近邻,按其类别频率最高者判定新文章类别。

5.3 推荐系统

电影、商品推荐场景中,K - 近邻算法基于用户或物品相似度推荐。电影推荐时,构建用户 - 电影评分矩阵,用皮尔逊相关系数算用户相似度,为目标用户推荐相似用户喜爱且其未看过的电影。商品推荐原理相同,依据用户购买历史与商品属性推荐相似商品。

5.4 医疗诊断

医疗领域,K - 近邻算法辅助疾病诊断与阶段分类。糖尿病诊断时,收集患者临床参数构成特征向量,对比大量确诊病例找 K 近邻判断新患者患病可能。癌症分期也类似,依患者检查指标找相似患者辅助判断分期,为治疗方案提供参考。

六、K - 近邻算法实战

6.1 准备数据集

我们以经典的鸢尾花数据集为例来进行 K - 近邻算法的实战。鸢尾花数据集是一个多分类数据集,由三种不同品种的鸢尾花(山鸢尾、变色鸢尾、维吉尼亚鸢尾)的测量数据组成,每个样本包含四个特征:花萼长度、花萼宽度、花瓣长度和花瓣宽度,共 150 个样本。

首先,我们需要加载鸢尾花数据集并划分训练集和测试集。在 Python 中,我们可以使用 Scikit-learn 库来完成这些操作。Scikit-learn 是一个强大的机器学习库,提供了丰富的工具和算法,使得机器学习任务变得更加简单和高效。以下是加载和划分数据集的代码:

from sklearn.datasets import load_iris

from sklearn.model_selection import train_test_split

# 加载鸢尾花数据集

iris = load_iris()

X = iris.data

y = iris.target

# 划分训练集和测试集,测试集占比30%,设置随机种子确保结果可复现

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)

在上述代码中:

  • load_iris() 函数用于加载鸢尾花数据集,Xy 分别表示数据集的特征和标签。
  • train_test_split 函数用于将数据集划分为训练集和测试集
  • test_size=0.3 表示测试集占总数据集的 30%
  • random_state=42 设置了随机种子

这样每次运行代码时,划分的结果都是相同的,便于我们进行实验和比较。

6.2 代码实现

接下来,我们使用 Python 和 Scikit-learn 库来实现 KNN 算法。具体步骤包括模型初始化、训练、预测和评估。

from sklearn.neighbors import KNeighborsClassifier

from sklearn.metrics import accuracy_score, classification_report, confusion_matrix

# 初始化KNN分类器,这里设置K值为5

knn = KNeighborsClassifier(n_neighbors=5)

# 使用训练集训练模型

knn.fit(X_train, y_train)

# 使用训练好的模型对测试集进行预测

y_pred = knn.predict(X_test)

# 计算模型在测试集上的准确率

accuracy = accuracy_score(y_test, y_pred)

print(f"模型的准确率为: {accuracy}")

# 生成分类报告,包含精确率、召回率、F1值等指标

print("分类报告:\n", classification_report(y_test, y_pred))

# 生成混淆矩阵

print("混淆矩阵:\n", confusion_matrix(y_test, y_pred))

在上述代码中:

  • KNeighborsClassifier 类用于创建 KNN 分类器
  • n_neighbors=5 表示 K 值设置为 5,即选择最近的 5 个邻居来进行分类决策。
  • fit 方法用于使用训练集数据对模型进行训练
  • predict 方法用于对测试集数据进行预测,返回预测的类别标签。
  • accuracy_score 函数用于计算预测结果的准确率,即预测正确的样本数占总样本数的比例。
  • classification_report 函数生成一个详细的分类报告,包含精确率(Precision)、召回率(Recall)、F1 值(F1-Score)等指标,这些指标可以帮助我们更全面地评估模型在不同类别上的性能。
  • confusion_matrix 函数生成混淆矩阵,它直观地展示了模型在各个类别上的预测情况
  • 矩阵的行表示真实类别,列表示预测类别,通过混淆矩阵可以清晰地看到模型在哪些类别上容易出现误判。

输出结果如下图所示:在这里插入图片描述

6.3 结果分析

通过上述代码运行后,我们可以得到模型的准确率、分类报告和混淆矩阵,从而对模型的性能进行分析。

运行结果中,模型的准确率为 1.0,这意味着在测试集中,模型正确分类的样本数占总样本数的 100%,说明模型在这个数据集上表现较好。

从分类报告中,我们可以看到不同类别的精确率、召回率和 F1 值。精确率表示预测为某一类别的样本中,实际属于该类别的比例;召回率表示实际属于某一类别的样本中,被正确预测为该类别的比例;F1 值则是精确率和召回率的调和平均数,综合考虑了两者的性能。例如,如果某一类别的精确率较低,说明模型在预测该类别时,容易将其他类别的样本误判为该类别;如果召回率较低,说明模型容易将该类别的样本漏判。

混淆矩阵可以更直观地展示模型的分类情况。上述结果中混淆矩阵如下:

[[19  0  0]
 [ 0 13  0]
 [ 0  0 13]]

第一行表示实际为第一类别的样本,模型正确预测了 19 个,没有误判为其他类别;
第二行表示实际为第二类别的样本,模型正确预测了 13 个,误判了 0 个为第三类别;
第三行表示实际为第三类别的样本,模型正确预测了 13 个,误判了 0 个为第二类别。

通过混淆矩阵,我们可以清楚地看到模型在哪些类别之间容易出现混淆,从而有针对性地进行改进。上述结果中是一个特例,准确率为 100%,所以不需要改进。实际使用中由于数据量大,准确率会比较低,这就需要我们进行改进。改进方向主要有:

  • 调整 K 值通过交叉验证等方法,尝试不同的 K 值,找到最优的 K 值,以提高模型的性能。因为不同的 K 值会影响模型的 “视野” 和对噪声的敏感度,合适的 K 值可以使模型更好地平衡偏差和方差。
  • 特征工程对数据进行特征选择或特征提取,去除一些冗余或不相关的特征,或者构造新的特征,以提高数据的质量和模型的性能。例如,可以使用主成分分析(PCA)等方法对数据进行降维,减少特征数量,降低计算复杂度,同时避免 “维度灾难” 问题。
  • 数据预处理对数据进行标准化、归一化等预处理操作,使不同特征具有相同的尺度,避免某些特征对距离计算的影响过大,从而提高模型的性能。例如,使用 MinMaxScaler 对数据进行归一化,将数据映射到 [0, 1] 区间,或者使用 StandardScaler 对数据进行标准化,使其均值为 0,标准差为 1 。

七、总结与展望

K - 近邻算法作为机器学习领域的经典算法之一,以其简洁直观的原理和广泛的应用场景,在众多机器学习任务中留下了深刻的印记。它的核心思想 —— 基于邻居的类别来判断新样本的类别,不仅通俗易懂,而且在实际应用中展现出了强大的适应性和有效性。

原理上看,K - 近邻算法通过计算距离、选择最近邻以及统计类别频率等步骤,实现了对新样本的分类或预测。这种基于局部信息的决策方式,使得它在处理一些数据分布不规则、没有明显规律的问题时具有独特的优势。同时,K 值的选择、距离度量方式以及分类决策规则等要素,也为算法的灵活应用提供了丰富的可能性,通过合理调整这些要素,可以使算法更好地适应不同的数据集和任务需求。

实际应用,K - 近邻算法已经在图像识别、文本分类、推荐系统、医疗诊断等多个领域发挥了重要作用。它帮助我们识别手写数字、分类新闻文章、为用户推荐感兴趣的电影和商品,甚至辅助医生进行疾病诊断和阶段分类,为解决实际问题提供了有效的手段,极大地推动了这些领域的发展和进步。

然而,K - 近邻算法也并非完美无缺,它存在计算复杂度高、空间复杂度高、对不平衡数据集敏感以及容易受到 “维度灾难” 影响等缺点。但随着技术的不断发展,针对这些问题已经出现了许多有效的解决方案,如降维技术、近似最近邻算法、数据预处理方法以及改进的距离度量方式等,这些技术的不断完善和应用,将进一步提升 K - 近邻算法的性能和适用范围。

未来,随着人工智能和机器学习技术的持续发展,K - 近邻算法有望在更多领域得到应用和拓展。一方面,它可能会与其他新兴技术,如深度学习、量子计算等相结合,发挥各自的优势,实现更强大的功能。例如,在深度学习中,K - 近邻算法可以作为一种后处理手段,对深度学习模型的预测结果进行进一步的优化和验证;在量子计算领域,量子 KNN 算法可能会利用量子计算的并行性优势,实现更快速的最近邻搜索,从而在大规模数据处理和高维数据场景中展现出巨大的潜力。

另一方面,随着数据量的不断增长和数据维度的不断增加,如何进一步优化 K - 近邻算法的性能,使其能够更高效地处理大数据和高维数据,将是未来研究的重要方向。同时,探索 K - 近邻算法在新领域的应用,如生物信息学、物联网、智能交通等,也将为解决这些领域的复杂问题提供新的思路和方法。


机器学习项目代码地址:【传送门】


延伸阅读

  • 机器学习核心算法系列文章
    解锁机器学习核心算法 | K-平均:揭开K-平均算法的神秘面纱
    解锁机器学习核心算法 | 决策树:机器学习中高效分类的利器
    解锁机器学习核心算法 | 逻辑回归:不是回归的“回归”
    解锁机器学习核心算法 | 线性回归:机器学习的基石

  • 深度学习框架探系列文章
    深度学习框架探秘|TensorFlow:AI 世界的万能钥匙
    深度学习框架探秘|PyTorch:AI 开发的灵动画笔
    深度学习框架探秘|TensorFlow vs PyTorch:AI 框架的巅峰对决
    深度学习框架探秘|Keras:深度学习的魔法钥匙

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/971964.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

算法分析—— 《归并排序》

《排序数组》 题目描述: 给你一个整数数组 nums,请你将该数组升序排列。 你必须在 不使用任何内置函数 的情况下解决问题,时间复杂度为 O(nlog(n)),并且空间复杂度尽可能小。 示例 1: 输入:nums [5,2…

linux云服务器部署deepseek,并通过网页访问

参考视频:https://www.douyin.com/root/search/linux%E5%AE%89%E8%A3%85%20deepseek?aid3aa2527c-e4f2-4059-b724-ab81a140fa8b&modal_id7468518885570940214&typegeneral 修改ollama配置文件 vim /etc/systemd/system/ollama.service 我的电脑硬盘只有4…

FastAdmin后端列表导入表格数据

后台添加数据的时候增加通过表格导入功能 如下图index.html页面增加导入和模板下载按钮代码如下 <div class"panel panel-default panel-intro">{:build_heading()}<div class"panel-body"><div id"myTabContent" class"ta…

可调节图片参数,解决图片模糊及尺寸过小问题的工具

软件介绍 你是否正为图片模糊、尺寸太小而烦恼&#xff1f;别担心&#xff0c;有这样一款神器能帮你轻松解决。它能精准调节图片参数&#xff0c;即便原本模糊不清的图片&#xff0c;经它处理后也能变得高清锐利&#xff0c;瞬间让图片焕然一新。而且&#xff0c;它还具备导出…

Windows网络安全基础

随着互联网的发展和普及&#xff0c;Windows网络安全问题愈发严重。在本文中&#xff0c;我们将会介绍Windows网络安全的基本概念&#xff0c;包括网络攻击类型、网络安全威胁、网络安全防御措施等等&#xff0c;帮助初学者更好地了解Windows网络安全。 一、网络攻击类型 网络…

代码补全『三重奏』:EverEdit如何用上下文识别+语法感知+智能片段重构你的编码效率!

1 代码自动完成 1.1 应用场景 在编辑文档时&#xff0c;为了提高编辑效率&#xff0c;编辑器一般都会带有自动完成功能&#xff0c;比如&#xff1a;输入括号时自动补全另一半&#xff0c;输入文字时&#xff0c;自动补全剩下的部分。 1.2 使用方法 1.2.1 自动缩进 单击主菜…

vue,vue3 keepalive没有效果,无法缓存页面include无效,keep-alive

keepalive没有效果&#xff0c;无法缓存页面&#xff1f; 问题大概是组件的name值不对应&#xff0c;vue2修改组件文件的name值&#xff0c;vue3保持组件文件名称和路由页面配置的name一致就可以了&#xff0c;如果vue3不想保持一致&#xff0c;必须手动在文件后面添加export..…

栈回溯方案

注&#xff1a;栈回溯无法很好的定位到未调优化的函数&#xff0c;需要编译前使用 -fno-optimize-sibling-calls 选项禁止尾调优化。 基于unwind的栈回溯 在 arm 架构下&#xff0c;不少32位系统用的是 unwind 形式的栈回溯&#xff0c;这种栈回溯要复杂很多。首先需要程序有一…

【存储中间件API】MySQL、Redis、MongoDB、ES常见api操作及性能比较

常见中间件api操作及性能比较 ☝️ MySQL crud操作✌️ maven依赖✌️ 配置✌️ 定义实体类✌️ 常用api ☝️ Redis crud操作✌️ maven依赖✌️ 配置✌️ 常用api ☝️ MongoDB crud操作✌️ maven依赖✌️ 配置文件✌️ 定义实体类✌️ MongoDB常用api ☝️ ES crud操作 ⭐️…

解锁D3.js与PlantUML的交互奥秘:探索知识图谱数据可视化新领域

解锁D3.js与PlantUML的交互魔法&#xff1a;数据可视化新征程 在前端开发的广袤天地里&#xff0c;数据可视化一直是一颗璀璨的明珠&#xff0c;吸引着无数开发者探索其奥秘。而当D3.js这一强大的JavaScript库&#xff0c;遇上专注于创建UML图的PlantUML&#xff0c;一场奇妙的…

DeepSeek24小时写作机器人,持续创作高质量文案

内容创作已成为企业、自媒体和创作者的核心竞争力。面对海量的内容需求&#xff0c;人工创作效率低、成本高、质量参差不齐等问题日益凸显。如何在有限时间内产出高质量内容&#xff1f;DeepSeek写作机器人&#xff0c;一款24小时持续创作的智能工具&#xff0c;为企业和个人提…

使用html css js 来实现一个服装行业的企业站源码-静态网站模板

最近在练习 前端基础&#xff0c;html css 和js 为了加强 代码的 熟悉程序&#xff0c;就使用 前端 写了一个个服装行业的企业站。把使用的技术 和 页面效果分享给大家。 应用场景 该制衣服装工厂官网前端静态网站模板主要用于前端练习和编程练习&#xff0c;适合初学者进行 HT…

使用html css js 开发一个 教育机构前端静态网站模板

这个教育机构网站模板是专为前端开发初学者设计的练习项目&#xff0c;适合正在学习前端的学生或自学者使用。网站内容包括首页、课程体系、师资力量、关于我们和联系我们等基础页面&#xff0c;帮助学习者熟悉网页布局、样式设计和交互功能的实现。 静态页面 简单截图 应用…

(蓝桥杯——10. 小郑做志愿者)洛斯里克城志愿者问题详解

题目背景 小郑是一名大学生,她决定通过做志愿者来增加自己的综合分。她的任务是帮助游客解决交通困难的问题。洛斯里克城是一个六朝古都,拥有 N 个区域和古老的地铁系统。地铁线路覆盖了树形结构上的某些路径,游客会询问两个区域是否可以通过某条地铁线路直达,以及有多少条…

React 低代码项目:网络请求与问卷基础实现

&#x1f35e;吐司问卷&#xff1a;网络请求与问卷基础实现 Date: February 10, 2025 Log 技术要点&#xff1a; HTTP协议XMLHttpRequest、fetch、axiosmock.js、postmanWebpack devServer 代理、craco.js 扩展 webpackRestful API 开发要点&#xff1a; 搭建 mock 服务 …

大流量汽(柴)油机泵,抗洪抢险的可靠选择|深圳鼎跃

近年来&#xff0c;全球范围内极端天气频发&#xff0c;洪涝灾害成为危及人民生命财产安全的重要因素。在抗洪抢险行动中&#xff0c;如何迅速、高效地排除积水&#xff0c;保障救援通道和安全区域成为关键。汽柴油机泵凭借其动力强、移动灵活、环境适应性强等特点&#xff0c;…

游戏开发微信小程序--工具箱之父

小程序工具箱之父已更新 Page({data: {score: 0,lives: 3,gameOver: false,playerVisible: true,level: 1,petType: cat,speedBuff: 1,coins: 0,friends: [],achievements: [],currentPetFrame: 0, // 当前宠物动画帧scoreMultiplier: 1, // 得分倍率gameSpeed: 1, // …

一.数据治理理论架构

1、数据治理核心思想&#xff1a; 数据治理理论架构图描绘了一个由顶层设计、管控机制、核心领域和管理系统四个主要部分组成的数据治理框架。它旨在通过系统化的方法&#xff0c;解决数据治理机制缺失引发的业务和技术问题&#xff0c;并最终提升企业的数据管理水平。 数据治…

一键安装教程

有需要的可以私信 亮点&#xff1a; 不再需要安装完去配置环境变量&#xff0c;下载完程序&#xff0c;解压后&#xff0c;右键进行管理员安装&#xff0c;安装完毕自动配置环境变量&#xff0c;即可使用 Maven 安装 右键 以管理员身份运行点击 下一步安装完成后会同步配置环境…

crud项目分析(2)

JWT令牌验证是否登录成功 简单的验证账号密码是否正确(存在) 全局异常处理器 过滤器 因为login下只有这一个网页 唯一一种操作 package com.itheima.filter;import ch.qos.logback.core.util.StringUtil; import com.alibaba.fastjson.JSONObject; import com.itheima.pojo.R…