当前位置: 首页 > news >正文

别再傻傻分不清了!用Python代码实战演示KNN分类和K-means聚类的核心区别

用Python代码实战解析KNN分类与K-means聚类的本质差异

第一次接触机器学习时,很多开发者都会被KNN和K-means这两个名称相似的算法搞糊涂。它们都带着"K"这个字母,都涉及距离计算,甚至在某些场景下会产生看似相似的结果。但当我们真正开始动手实现时,就会发现它们从设计理念到代码实现都存在着根本性的区别。本文将通过Python代码实战,带你从数据准备、算法调用到结果可视化,全方位感受这两种算法的核心差异。

1. 环境准备与数据加载

在开始之前,我们需要准备好Python环境和必要的数据集。这里推荐使用Jupyter Notebook进行交互式开发,它能让我们更直观地观察每一步的结果变化。

首先安装必要的库(如果尚未安装):

pip install numpy pandas matplotlib scikit-learn

接下来导入所需的Python模块:

import numpy as np import pandas as pd import matplotlib.pyplot as plt from sklearn.datasets import load_iris from sklearn.neighbors import KNeighborsClassifier from sklearn.cluster import KMeans from sklearn.model_selection import train_test_split from sklearn.metrics import accuracy_score

加载经典的鸢尾花数据集:

iris = load_iris() X = iris.data[:, :2] # 我们只取前两个特征方便可视化 y = iris.target

提示:在实际项目中,我们通常会使用所有特征以获得更好的模型性能。这里为了可视化方便,我们仅使用前两个特征(花萼长度和宽度)。

2. KNN分类实战:监督学习的典型代表

K最近邻(K-Nearest Neighbors,KNN)是一种懒惰学习(lazy learning)算法,它不会从训练数据中学习一个明确的模型,而是直接存储训练数据,并在预测时通过查找最近的邻居来进行分类。

2.1 数据划分与模型训练

首先,我们需要将数据划分为训练集和测试集:

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

创建并训练KNN分类器:

knn = KNeighborsClassifier(n_neighbors=5) # 设置k=5 knn.fit(X_train, y_train)

2.2 模型评估与可视化

评估模型在测试集上的表现:

y_pred = knn.predict(X_test) print(f"测试集准确率: {accuracy_score(y_test, y_pred):.2f}")

为了更直观地理解KNN的工作原理,我们可以绘制决策边界:

# 创建网格点 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, 0.02), np.arange(y_min, y_max, 0.02)) # 预测每个网格点的类别 Z = knn.predict(np.c_[xx.ravel(), yy.ravel()]) Z = Z.reshape(xx.shape) # 绘制决策边界 plt.figure(figsize=(10, 6)) plt.contourf(xx, yy, Z, alpha=0.4) plt.scatter(X[:, 0], X[:, 1], c=y, s=20, edgecolor='k') plt.title('KNN分类决策边界') plt.xlabel('花萼长度') plt.ylabel('花萼宽度') plt.show()

从可视化结果中,我们可以看到KNN如何基于邻近样本的多数投票来划分决策区域。每个点的类别由其最近的k个邻居决定,这导致了决策边界通常是不规则的曲线。

3. K-means聚类实战:无监督学习的经典算法

与KNN不同,K-means是一种无监督学习算法,它的目标是将数据划分为k个簇,使得同一簇内的数据点尽可能相似,而不同簇的数据点尽可能不同。

3.1 模型训练与簇中心

创建并训练K-means模型:

kmeans = KMeans(n_clusters=3, random_state=42) kmeans.fit(X)

获取聚类结果和簇中心:

labels = kmeans.labels_ centers = kmeans.cluster_centers_

3.2 结果可视化

绘制聚类结果和簇中心:

plt.figure(figsize=(10, 6)) plt.scatter(X[:, 0], X[:, 1], c=labels, s=20, cmap='viridis') plt.scatter(centers[:, 0], centers[:, 1], c='red', s=200, alpha=0.8, marker='X') plt.title('K-means聚类结果') plt.xlabel('花萼长度') plt.ylabel('花萼宽度') plt.show()

K-means的聚类结果与原始数据的真实类别分布可能有差异,因为它完全不知道数据的真实标签,只是根据数据的空间分布特征进行划分。图中的红色"X"标记表示每个簇的中心点。

4. 核心差异深度解析

通过前面的代码实现,我们已经直观感受到了KNN和K-means的不同。现在让我们从多个维度深入分析它们的本质区别。

4.1 监督学习 vs 无监督学习

特性KNNK-means
学习类型监督学习(需要标签)无监督学习(不需要标签)
目标分类或回归聚类
训练过程无显式训练,直接存储数据迭代优化簇中心
对新数据的处理实时计算距离并预测需要重新训练或使用预测接口

4.2 算法原理对比

KNN的工作原理

  1. 存储所有训练数据
  2. 对于新样本,计算它与训练数据中所有样本的距离
  3. 找出距离最近的k个邻居
  4. 根据这k个邻居的类别进行多数投票(分类)或平均值(回归)

K-means的工作原理

  1. 随机初始化k个簇中心
  2. 将每个样本分配到最近的簇中心
  3. 重新计算每个簇的中心(取簇内样本的平均值)
  4. 重复步骤2-3直到簇中心不再变化或达到最大迭代次数

4.3 代码实现差异

在scikit-learn中,两种算法的API调用方式也反映了它们的本质差异:

# KNN的典型使用流程 knn = KNeighborsClassifier(n_neighbors=5) knn.fit(X_train, y_train) # 需要传入特征和标签 predictions = knn.predict(X_test) # K-means的典型使用流程 kmeans = KMeans(n_clusters=3) kmeans.fit(X) # 只需要传入特征,没有标签参数 labels = kmeans.labels_

4.4 应用场景选择指南

选择KNN当

  • 你有标注数据且需要分类/回归任务
  • 数据量不大(因为预测时需要计算所有距离)
  • 需要解释预测结果(可以展示邻居样本)

选择K-means当

  • 你没有标注数据但想发现数据中的自然分组
  • 需要数据压缩或摘要(用簇中心代表一组数据)
  • 进行异常检测(远离所有簇中心的点可能是异常)

5. 进阶讨论与常见误区

5.1 K值选择的艺术

虽然KNN和K-means都需要指定K值,但它们的含义和选择策略有所不同:

KNN中的K

  • 控制邻居数量,影响模型的平滑程度
  • 太小容易过拟合,太大容易欠拟合
  • 通常通过交叉验证选择最佳K值

K-means中的K

  • 控制簇的数量,影响聚类的粒度
  • 没有绝对正确的K值,需要结合业务理解
  • 可以使用肘部法则或轮廓系数辅助选择

5.2 距离度量的影响

两种算法都依赖距离度量,但实际应用中需要注意:

  • KNN对距离度量更敏感,直接影响分类结果
  • K-means通常使用欧氏距离,要求数据各维度尺度相似
  • 对于高维数据,可能需要考虑其他距离度量或降维

5.3 性能考量

KNN的优缺点

  • 优点:简单直观、无需训练阶段、适合多分类
  • 缺点:预测速度慢、对不平衡数据敏感、需要特征缩放

K-means的优缺点

  • 优点:计算高效、适合大数据集、结果可解释
  • 缺点:需要指定K值、对初始中心敏感、假设簇是凸形

6. 实战技巧与最佳实践

6.1 数据预处理的重要性

对于这两种算法,适当的数据预处理都能显著提升效果:

from sklearn.preprocessing import StandardScaler scaler = StandardScaler() X_scaled = scaler.fit_transform(X) # 对缩放后的数据重新运行KNN和K-means

6.2 处理类别不平衡

对于KNN,类别不平衡可能导致预测偏向多数类:

# 使用加权KNN knn = KNeighborsClassifier(n_neighbors=5, weights='distance')

6.3 评估聚类质量

对于K-means,我们可以使用轮廓系数评估聚类效果:

from sklearn.metrics import silhouette_score score = silhouette_score(X, labels) print(f"轮廓系数: {score:.2f}")

6.4 可视化高维数据

当数据维度超过2维时,我们可以使用PCA降维后再可视化:

from sklearn.decomposition import PCA pca = PCA(n_components=2) X_pca = pca.fit_transform(iris.data) # 在降维后的数据上运行K-means并可视化
http://www.jsqmd.com/news/931923/

相关文章:

  • 2026学生降AIGC软件盘点:省时省力+高分适配哪家强?
  • 从AI决策到万物互联:技术趋势的商业落地与个人应对策略
  • Qt5.15项目里QWebEngine加载网页慢到超时?别急着改源码,先试试这个Windows证书策略
  • 【Sora 2展厅制作倒计时72小时】:错过本次RTX 6000 Ada驱动更新窗口,将永久丧失光线追踪反射层级支持
  • RoundedTB:解锁Windows任务栏现代化美学的终极实战手册
  • 5个技巧让你用Black-Litterman模型构建更稳健的投资组合 [特殊字符]
  • Arduino互动幽灵盒子:从传感器到状态机的机电一体化实践
  • 2026日喀则卫生间免砸砖防水、外墙、地下室、楼顶渗漏+彩钢瓦、阳光房漏水 本地专业防水公司TOP5权威推荐(2026年6月本地最新深度调研) - 企业资讯
  • 从URDF反推DH参数:在ROS中为你的六轴机械臂快速配置MoveIt!
  • 别再只盯着手机了!聊聊HarmonyOS的微内核和Android的宏内核,到底谁更适合你的IoT项目?
  • Core ML与Watson混合AI架构:打造智能移动应用的新范式
  • 如何通过e1547打造个性化的数字艺术浏览体验
  • 用Python给视频帧“藏”点小秘密:一个CTF出题人的实战脚本分享(附完整代码)
  • 别再忍受‘假外观’了!手把手教你用Blender调整Livox Mid-360在Gazebo中的3D模型尺寸
  • 终极暗黑破坏神2存档编辑器:可视化编辑解放你的游戏体验
  • 口碑最好的AI论文网站推荐(从开题选题到定稿排版全流程)适合全体毕业生
  • 告别动画重复K帧!用UE5的IK重定向器,5分钟让女武神动作套用到任意人形角色
  • 传统送礼讲究投其所好,编写自我喜欢分享送礼程序,分享自己热爱好物,打破刻意讨好送礼。
  • 告别复制粘贴:用Terraform管理多云与混合云资源的实战配置指南
  • 传统睡眠必须早睡早起,编写睡眠质量检测程序,重睡眠质量,不重时间点,颠覆固定作息时间论。
  • 允许一切发生
  • 【Sora 2家具设计视频实战指南】:20年AI+家居工程师亲授5大避坑法则与3类高转化脚本模板
  • 从一次HTTPS拦截调试说起:深度解读浏览器SSL证书验证逻辑与ERR_CERT_COMMON_NAME_INVALID的根源
  • 5分钟免费打造AI象棋教练:Vin象棋让你的棋艺飞跃提升
  • 基于Arduino与树莓派的室内空气质量监测系统全栈开发指南
  • FPGA加速神经网络推理:SNL框架与Auto-SNL工具链解析
  • UVtools 3D打印校准神器:5步精准调优曝光时间与层高参数
  • Redis学习第二篇
  • MobileNetV3配置优化指南:如何调整YAML参数获得最佳训练效果
  • Git小白入门教程