【AI概念】K均值聚类(K-Means Clustering)与K-近邻算法(KNN)是什麽?有什么区别?机器学习中担任什么角色?|算法流程与数学推导、典型代码实现、工程应用建议|聚类、回归、分类任务

新星杯·14天创作挑战营·第12期 10w+人浏览 101人参与

大家好,我是爱酱。本篇将会系统梳理K-Means聚类K-最近邻(KNN)的定义、核心思想、主要区别、机器学习中的典型应用与工程意义。内容适合初学者和进阶读者,配合公式和对比表格,帮助你一文看懂两大经典算法。

注:本文章含大量数学算式、详细例子说明及大量代码演示,大量干货,建议先收藏再慢慢观看理解。新频道发展不易,你们的每个赞、收藏跟转发都是我继续分享的动力!

注:本文章颇长超过6500字、以及大量Python代码、非常耗时制作,建议先收藏再慢慢观看。新频道发展不易,你们的每个赞、收藏跟转发都是我继续分享的动力!

爱酱也单独发过K-近邻算法(KNN)K均值聚类(K-Means Clustering)的单独文章介绍,内容非常深入,并包含大量代码演示跟范例,欢迎大家去看看,加深对这两个算法的了解!
传送门——

K-近邻算法(KNN)文章:
【AI深究】K-近邻算法(KNN)详细全流程详解与案例(附大量Python代码演示)| 回归/分类、原理与算法流程、案例与完整代码演示 |K值选择与模型表现、距离度量的选择与影响、加权KNN、工程建议-优快云博客
K均值聚类(K-Means Clustering)文章:
【AI深究】K均值聚类(K-Means Clustering)全网最详细全流程详解与案例(附Python代码演示) | 肘部法则、轮廓系数 | 优点、缺点 | 例子案例及数据-优快云博客

事不宜迟,我们正式开始。


一、K-Means与KNN分别是什么?

1. K-Means聚类

K-Means是一种无监督学习算法,用于将数据自动分为$K$簇(cluster),每个簇由一个质心(centroid)代表。算法目标是让同一簇内的数据点尽量相似不同簇之间的数据点尽量不同

  • 核心思想:反复分配与更新,最小化簇内平方误差(intra-cluster variance)。

  • 常用场景:市场细分、图像压缩、文档聚类、异常检测等。

数学表达

\text{Objective Function}:\quad J = \sum_{k=1}^K \sum_{x_i \in C_k} \|x_i - \mu_k\|^2

其中Objective Function的意思是目标函数$C_k$为第$k$个簇,$\mu_k$为第$k$个簇的质心。


2. KNN(K-最近邻)

KNN是一种有监督学习算法,常用于分类和回归。它通过比较新样本与训练集中所有样本的距离,选出最近的$K$个邻居,根据这些邻居的标签进行投票(分类)或取均值(回归)来预测新样本的输出。

  • 核心思想:相似的样本具有相似的输出,直接用邻居信息做预测。

  • 常用场景:文本分类、图像识别、推荐系统、信用评分等。

数学表达(分类)

\hat{y} = \operatorname{mode}\{y_{(1)}, y_{(2)}, ..., y_{(K)}\}

其中$y_{(i)}$为距离最近的第$i$个训练样本的标签。


二、K-Means与KNN的主要区别

维度K-Means聚类KNN最近邻
算法类型无监督学习有监督学习
任务类型聚类(clustering)分类/回归(classification/regression)
K的含义簇的数量最近邻的数量
输入数据无需标签(unlabeled)需有标签(labeled)
输出结果簇划分及质心新样本的类别/数值预测
距离度量常用欧氏距离常用欧氏/曼哈顿等距离
训练过程反复分配与更新质心无训练过程,直接记忆数据
应用场景聚类、分群、异常检测分类、回归、推荐系统

三、K-Means与KNN在机器学习中的角色

1. K-Means的角色

  • 探索数据结构:自动发现数据中的内在分组,无需人工标签。

  • 特征工程:可用聚类结果作为新特征,提升下游模型性能。

  • 数据预处理:常用于异常点检测、数据去噪、样本分群。

  • 实际案例:市场细分(将客户分为不同群体)、图像压缩(同簇像素合并)、文档主题聚类等。

2. KNN的角色

  • 基线分类/回归模型:实现简单、易于理解,常作为初学者的入门算法。

  • 推荐系统:通过找“相似用户”或“相似物品”进行内容推荐。

  • 异常检测:通过邻居分布判断样本是否为异常点。

  • 实际案例:手写数字识别、信用评分、个性化推荐、文本情感分析等。


四、K-Means与KNN的相似与不同

相似点

  • 都依赖“距离度量”来判断样本间的相似性(如欧氏距离、曼哈顿距离等)。

  • 都有“$K$”这个超参数(Hyperparameter)但含义完全不同

  • 都常用于数据探索、特征工程和实际业务建模。

不同点

  • 监督/无监督:KNN需标签,K-Means不需标签。

  • 任务目标:KNN预测新样本的输出,K-Means发现数据内在结构。

  • 训练与预测流程:KNN无训练过程,K-Means需反复训练聚类中心。

  • 应用领域:KNN偏向分类/回归,K-Means偏向聚类/分群。


五、K-Means与KNN的算法流程与数学推导

1. K-Means聚类算法流程

步骤:

  1. 随机初始化$K$个簇的质心(centroid)。

  2. 对每个样本点,计算其到所有质心的距离,将其分配给最近的质心所在的簇。

  3. 更新每个簇的质心为该簇所有样本点的均值。

  4. 重复步骤2和3,直到簇分配不再变化或达到最大迭代次数。

数学表达:

  • 每次迭代的目标是最小化总簇内平方误差:

    J = \sum_{k=1}^K \sum_{x_i \in C_k} \|x_i - \mu_k\|^2

    其中$C_k$为第$k$个簇,$\mu_k$为第$k$个簇的质心。


2. KNN算法流程

步骤:

  1. 对于待预测的新样本$x$,计算它与训练集中所有样本的距离。

  2. 选出距离最近的$K$个训练样本。

  3. 分类任务:统计这$K$个邻居的类别,采用多数投票法决定新样本的类别。

  4. 回归任务:取这$K$个邻居的目标值的均值作为预测结果。

数学表达:

  • 分类预测:

    \hat{y} = \operatorname{mode}\{y_{(1)}, y_{(2)}, ..., y_{(K)}\}

  • 回归预测:

    \hat{y} = \frac{1}{K} \sum_{i=1}^K y_{(i)}


六、K-Means与KNN的典型代码实现

如果大家对代码示例有兴趣,强烈推荐回到开场的两个传送门,去K-Means与KNN的单独介绍文章看看,里面有非常详细的例子、代码实现与可视化,十分值得去尝试!

1. K-Means聚类代码示例

import numpy as np
import matplotlib.pyplot as plt
from sklearn.cluster import KMeans

# 生成二维数据
np.random.seed(0)
X = np.vstack([
    np.random.normal(loc=[2, 2], scale=0.5, size=(50, 2)),
    np.random.normal(loc=[6, 6], scale=0.5, size=(50, 2)),
    np.random.normal(loc=[2, 6], scale=0.5, size=(50, 2))
])

# K-Means聚类
kmeans = KMeans(n_clusters=3, random_state=0)
y_pred = kmeans.fit_predict(X)

# 可视化聚类结果
plt.scatter(X[:, 0], X[:, 1], c=y_pred, cmap='viridis', marker='o', alpha=0.6, label='Samples')
plt.scatter(kmeans.cluster_centers_[:, 0], kmeans.cluster_centers_[:, 1], c='red', marker='X', s=200, label='Centroids')
plt.title('K-Means Clustering')
plt.xlabel('Feature 1')
plt.ylabel('Feature 2')
plt.legend()
plt.show()

代码说明

  • 数据生成
    np.random.normal生成三个高斯分布的二维数据簇,模拟真实聚类场景。

  • 模型训练
    KMeans(n_clusters=3)对数据进行聚类,自动寻找3个簇的中心。

  • 聚类结果
    fit_predict方法返回每个点的簇标签(y_pred)。

  • 可视化

    • 用不同颜色显示不同簇的数据点。

    • 用红色大“X”标记每个簇的质心(中心点)。

    • 图像直观展示K-Means如何将数据自动分成三组,并找到每组的中心。


2. KNN代码示例

        1. 分类代码示例
import numpy as np
import matplotlib.pyplot as plt
from sklearn.neighbors import KNeighborsClassifier

# 生成二维可分数据
np.random.seed(0)
X = np.vstack([
    np.random.normal(loc=[2, 2], scale=0.5, size=(30, 2)),
    np.random.normal(loc=[6, 6], scale=0.5, size=(30, 2))
])
y = np.array([0]*30 + [1]*30)

# KNN分类
knn = KNeighborsClassifier(n_neighbors=3)
knn.fit(X, y)

# 可视化决策边界
h = .02
x_min, x_max = X[:, 0].min() - 1, X[:, 0].max() + 1
y_min, y_max = X[:, 1].min() - 1, X[:, 1].max() + 1
xx, yy = np.meshgrid(np.arange(x_min, x_max, h), np.arange(y_min, y_max, h))
Z = knn.predict(np.c_[xx.ravel(), yy.ravel()]).reshape(xx.shape)

plt.contourf(xx, yy, Z, alpha=0.3, cmap=plt.cm.Paired)
plt.scatter(X[:, 0], X[:, 1], c=y, cmap=plt.cm.Paired, edgecolor='k')
plt.title('KNN Classification (K=3)')
plt.xlabel('Feature 1')
plt.ylabel('Feature 2')
plt.show()

代码说明

  • 数据生成
    np.random.normal生成两组二维正态分布数据,分别代表两类样本,便于分类演示。

  • 模型训练
    KNeighborsClassifier(n_neighbors=3)训练KNN分类器。

  • 决策边界可视化

    • 构建一个覆盖数据分布的网格(xx, yy),对每个网格点用KNN预测类别,形成决策区域(Z)。

    • contourf显示不同类别的决策区域。

    • 用散点图叠加真实样本点,颜色代表类别。

    • 图像直观展示KNN如何根据邻居投票划分不同类别的区域,决策边界为“分块”状。


        2. 回归代码示例
import numpy as np
import matplotlib.pyplot as plt
from sklearn.neighbors import KNeighborsRegressor

# 1. 生成一维非线性回归数据
np.random.seed(0)
X = np.sort(5 * np.random.rand(40, 1), axis=0)
y = np.sin(X).ravel() + 0.2 * np.random.randn(40)  # 正弦加噪声

# 2. KNN回归模型
knn_reg = KNeighborsRegressor(n_neighbors=5)
knn_reg.fit(X, y)

# 3. 测试点
X_test = np.linspace(0, 5, 200)[:, np.newaxis]
y_pred = knn_reg.predict(X_test)

# 4. 可视化
plt.figure(figsize=(8, 5))
plt.scatter(X, y, color='darkorange', label='Training data')
plt.plot(X_test, y_pred, color='navy', label='KNN Regression (K=5)')
plt.xlabel('X')
plt.ylabel('y')
plt.title('KNN Regression Example')
plt.legend()
plt.show()

代码说明:

  • 生成带噪声的正弦数据,模拟真实回归问题。

  • KNeighborsRegressor训练回归模型,n_neighbors=5

  • 预测200个测试点,画出回归曲线。

  • 可视化显示训练点(橙色)和KNN回归曲线(深蓝色),直观体现KNN回归的局部平均特性。


七、实际工程中的应用建议

K-Means聚类

K-Means聚类算法在实际工程中有广泛的应用,尤其适合无监督学习场景。以下是详细的应用建议:

  1. 数据探索与样本分群

    • K-Means能自动发现数据中的内在结构,将数据划分为多个簇,帮助理解数据分布和特征模式。

    • 适用于客户细分、用户行为分析、市场调研等场景。

  2. 异常检测

    • 通过聚类结果识别离群点或异常样本,异常点通常距离簇中心较远。

    • 应用于网络安全、设备故障检测、金融欺诈识别等领域。

  3. 特征工程

    • 聚类结果可作为新的特征输入到监督学习模型,提升模型性能。

    • 例如,将客户划分簇标签作为特征,辅助信用评分或推荐系统。

  4. 大规模数据初步分析

    • K-Means算法计算效率较高,适合处理大规模数据,快速获得数据结构信息。

    • 可作为后续复杂模型的预处理步骤,减少计算负担。

  5. 图像处理与压缩

    • 利用K-Means对图像像素进行聚类,实现图像压缩和颜色量化。

  6. 文档聚类与主题发现

    • 在文本挖掘中,K-Means用于文档聚类,辅助主题分析和信息检索。

工程建议

  • 选择合适的K值,结合肘部法则(Elbow Method)或轮廓系数(Silhouette Score)评估聚类效果。

  • 数据预处理(如归一化)对聚类结果影响显著。

  • 多次运行K-Means,避免局部最优,选择最优结果。


KNN算法

KNN算法在实际工程中主要用于有监督学习任务,适合小规模数据和低维特征。以下是详细的应用建议:

  1. 小数据量分类与回归

    • KNN无需训练过程,适合样本量较小、特征维度不高的场景。

    • 适用于医学诊断、信用评分、客户分类等领域。

  2. 基线模型与快速原型

    • KNN实现简单,常作为基线模型,帮助快速验证数据可分性和模型效果。

  3. 推荐系统

    • 通过计算用户或物品间的相似度,基于邻居的偏好进行推荐。

    • 适合协同过滤中的用户-用户或物品-物品推荐。

  4. 异常检测

    • 利用邻居距离判断样本是否异常,距离远的样本可能为异常点。

  5. 大数据加速技术

    • KNN计算量大,适合用KD树、球树等数据结构加速邻居搜索。

    • 适合中小规模数据,超大规模数据需结合近似邻居算法。

  6. 多样本权重与距离度量

    • 可根据距离加权邻居贡献,提升预测准确性。

    • 选择合适的距离度量(欧氏、曼哈顿、闵可夫斯基等)对结果影响显著。

工程建议

  • 特征需归一化或标准化,避免尺度差异影响距离计算。

  • 选择合适的K值,结合交叉验证调优。

  • 注意数据不平衡问题,可能影响邻居选择。

  • 对高维数据,考虑降维或特征选择,缓解“维度灾难”。


八、总结

K-Means和KNN是机器学习中最基础、最常用的“距离型”算法。K-Means作为无监督聚类工具,擅长发现数据结构、分群和异常检测,在数据探索和特征工程中扮演重要角色。KNN则作为有监督的分类/回归方法,因其直观、易实现、无需训练的特性,广泛应用于小数据量、原型验证和推荐系统等场景。

两者都依赖距离度量,但任务目标、数据需求和应用领域完全不同。理解它们的原理、优缺点和工程适用场景,有助于你在实际项目中灵活选择和高效落地。

最后,看完的伙伴如果有兴趣更深入的了解两种算法,可以到爱酱对两个算法各自深入描述的文章去看看哦~

 传送门——

K-近邻算法(KNN)文章:
【AI深究】K-近邻算法(KNN)详细全流程详解与案例(附大量Python代码演示)| 回归/分类、原理与算法流程、案例与完整代码演示 |K值选择与模型表现、距离度量的选择与影响、加权KNN、工程建议-优快云博客
K均值聚类(K-Means Clustering)文章:
【AI深究】K均值聚类(K-Means Clustering)全网最详细全流程详解与案例(附Python代码演示) | 肘部法则、轮廓系数 | 优点、缺点 | 例子案例及数据-优快云博客


谢谢你看到这里,你们的每个赞、收藏跟转发都是我继续分享的动力

如需进一步案例、代码实现或与其他聚类算法对比,欢迎留言交流!我是爱酱,我们下次再见,谢谢收看!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值