大家好,我是爱酱。本篇将会系统梳理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是一种无监督学习算法,用于将数据自动分为个簇(cluster),每个簇由一个质心(centroid)代表。算法目标是让同一簇内的数据点尽量相似,不同簇之间的数据点尽量不同。
-
核心思想:反复分配与更新,最小化簇内平方误差(intra-cluster variance)。
-
常用场景:市场细分、图像压缩、文档聚类、异常检测等。
数学表达:
其中Objective Function的意思是目标函数,为第
个簇,
为第
个簇的质心。
2. KNN(K-最近邻)
KNN是一种有监督学习算法,常用于分类和回归。它通过比较新样本与训练集中所有样本的距离,选出最近的个邻居,根据这些邻居的标签进行投票(分类)或取均值(回归)来预测新样本的输出。
-
核心思想:相似的样本具有相似的输出,直接用邻居信息做预测。
-
常用场景:文本分类、图像识别、推荐系统、信用评分等。
数学表达(分类):
其中为距离最近的第
个训练样本的标签。
二、K-Means与KNN的主要区别
维度 | K-Means聚类 | KNN最近邻 |
---|---|---|
算法类型 | 无监督学习 | 有监督学习 |
任务类型 | 聚类(clustering) | 分类/回归(classification/regression) |
K的含义 | 簇的数量 | 最近邻的数量 |
输入数据 | 无需标签(unlabeled) | 需有标签(labeled) |
输出结果 | 簇划分及质心 | 新样本的类别/数值预测 |
距离度量 | 常用欧氏距离 | 常用欧氏/曼哈顿等距离 |
训练过程 | 反复分配与更新质心 | 无训练过程,直接记忆数据 |
应用场景 | 聚类、分群、异常检测 | 分类、回归、推荐系统 |
三、K-Means与KNN在机器学习中的角色
1. K-Means的角色
-
探索数据结构:自动发现数据中的内在分组,无需人工标签。
-
特征工程:可用聚类结果作为新特征,提升下游模型性能。
-
数据预处理:常用于异常点检测、数据去噪、样本分群。
-
实际案例:市场细分(将客户分为不同群体)、图像压缩(同簇像素合并)、文档主题聚类等。
2. KNN的角色
-
基线分类/回归模型:实现简单、易于理解,常作为初学者的入门算法。
-
推荐系统:通过找“相似用户”或“相似物品”进行内容推荐。
-
异常检测:通过邻居分布判断样本是否为异常点。
-
实际案例:手写数字识别、信用评分、个性化推荐、文本情感分析等。
四、K-Means与KNN的相似与不同
相似点
-
都依赖“距离度量”来判断样本间的相似性(如欧氏距离、曼哈顿距离等)。
-
都有“
”这个超参数(Hyperparameter),但含义完全不同。
-
都常用于数据探索、特征工程和实际业务建模。
不同点
-
监督/无监督:KNN需标签,K-Means不需标签。
-
任务目标:KNN预测新样本的输出,K-Means发现数据内在结构。
-
训练与预测流程:KNN无训练过程,K-Means需反复训练聚类中心。
-
应用领域:KNN偏向分类/回归,K-Means偏向聚类/分群。
五、K-Means与KNN的算法流程与数学推导
1. K-Means聚类算法流程
步骤:
-
随机初始化
个簇的质心(centroid)。
-
对每个样本点,计算其到所有质心的距离,将其分配给最近的质心所在的簇。
-
更新每个簇的质心为该簇所有样本点的均值。
-
重复步骤2和3,直到簇分配不再变化或达到最大迭代次数。
数学表达:
-
每次迭代的目标是最小化总簇内平方误差:
其中
为第
个簇,
为第
个簇的质心。
2. KNN算法流程
步骤:
-
对于待预测的新样本
,计算它与训练集中所有样本的距离。
-
选出距离最近的
个训练样本。
-
分类任务:统计这
个邻居的类别,采用多数投票法决定新样本的类别。
-
回归任务:取这
个邻居的目标值的均值作为预测结果。
数学表达:
-
分类预测:
-
回归预测:
六、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聚类算法在实际工程中有广泛的应用,尤其适合无监督学习场景。以下是详细的应用建议:
-
数据探索与样本分群
-
K-Means能自动发现数据中的内在结构,将数据划分为多个簇,帮助理解数据分布和特征模式。
-
适用于客户细分、用户行为分析、市场调研等场景。
-
-
异常检测
-
通过聚类结果识别离群点或异常样本,异常点通常距离簇中心较远。
-
应用于网络安全、设备故障检测、金融欺诈识别等领域。
-
-
特征工程
-
聚类结果可作为新的特征输入到监督学习模型,提升模型性能。
-
例如,将客户划分簇标签作为特征,辅助信用评分或推荐系统。
-
-
大规模数据初步分析
-
K-Means算法计算效率较高,适合处理大规模数据,快速获得数据结构信息。
-
可作为后续复杂模型的预处理步骤,减少计算负担。
-
-
图像处理与压缩
-
利用K-Means对图像像素进行聚类,实现图像压缩和颜色量化。
-
-
文档聚类与主题发现
-
在文本挖掘中,K-Means用于文档聚类,辅助主题分析和信息检索。
-
工程建议:
-
选择合适的K值,结合肘部法则(Elbow Method)或轮廓系数(Silhouette Score)评估聚类效果。
-
数据预处理(如归一化)对聚类结果影响显著。
-
多次运行K-Means,避免局部最优,选择最优结果。
KNN算法
KNN算法在实际工程中主要用于有监督学习任务,适合小规模数据和低维特征。以下是详细的应用建议:
-
小数据量分类与回归
-
KNN无需训练过程,适合样本量较小、特征维度不高的场景。
-
适用于医学诊断、信用评分、客户分类等领域。
-
-
基线模型与快速原型
-
KNN实现简单,常作为基线模型,帮助快速验证数据可分性和模型效果。
-
-
推荐系统
-
通过计算用户或物品间的相似度,基于邻居的偏好进行推荐。
-
适合协同过滤中的用户-用户或物品-物品推荐。
-
-
异常检测
-
利用邻居距离判断样本是否异常,距离远的样本可能为异常点。
-
-
大数据加速技术
-
KNN计算量大,适合用KD树、球树等数据结构加速邻居搜索。
-
适合中小规模数据,超大规模数据需结合近似邻居算法。
-
-
多样本权重与距离度量
-
可根据距离加权邻居贡献,提升预测准确性。
-
选择合适的距离度量(欧氏、曼哈顿、闵可夫斯基等)对结果影响显著。
-
工程建议:
-
特征需归一化或标准化,避免尺度差异影响距离计算。
-
选择合适的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代码演示) | 肘部法则、轮廓系数 | 优点、缺点 | 例子案例及数据-优快云博客
谢谢你看到这里,你们的每个赞、收藏跟转发都是我继续分享的动力。
如需进一步案例、代码实现或与其他聚类算法对比,欢迎留言交流!我是爱酱,我们下次再见,谢谢收看!