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

K-means聚类算法详细介绍

目录

🍉简介

🍈K-means聚类模型详解

🍈K-means聚类的基本原理

🍈K-means聚类的算法步骤

🍈K-means聚类的优缺点

🍍优点

🍍缺点

🍈K-means聚类的应用场景

🍈K-means的改进和变体

🍉K-means聚类算法示例

🍈问题

🍍数据准备

🍍选择K值

🍍运行K-means聚类

🍍分析聚类结果

🍈完整代码实现

🍈代码解释


🍉简介

🍈K-means聚类模型详解

  • K-means聚类是一种常见且高效的无监督学习算法,用于将数据集分成K个簇(clusters)。本文将详细介绍K-means聚类的基本原理、算法步骤、优缺点以及应用场景。

🍈K-means聚类的基本原理

  • K-means聚类通过最小化样本到其所属簇中心的距离来实现数据的分组。具体而言,K-means的目标是将数据分成K个簇,并使每个簇中的数据点到其质心(centroid)的欧氏距离平方和最小。

假设我们有一个数据集${x_1, x_2, \ldots, x_n}$,其中每个数据点$x_i$是一个d维向量。我们需要将这些数据点分成K个簇${C_1, C_2, \ldots, C_K}$。K-means的优化目标可以表示为:

其中,$\mu_k$表示簇$C_k$的质心。

🍈K-means聚类的算法步骤

K-means聚类算法主要包括以下步骤:

  1. 初始化:随机选择K个数据点作为初始质心。
  2. 分配簇:对于数据集中的每个数据点,计算其到各个质心的距离,并将其分配到距离最近的质心所在的簇。
  3. 更新质心:对于每个簇,计算所有分配到该簇的数据点的平均值,更新该簇的质心。
  4. 重复:重复步骤2和3,直到质心不再发生显著变化,或者达到预设的迭代次数。

🍈K-means聚类的优缺点

🍍优点

  1. 简单易实现:K-means算法简单且容易理解和实现。
  2. 高效:时间复杂度为$O(n \cdot K \cdot t)$,其中n是数据点数量,K是簇的数量,t是迭代次数。
  3. 适用广泛:适用于很多实际问题,如图像分割、文档聚类等。

🍍缺点

  1. 需要预设K值:必须提前确定簇的数量K,且K值的选择对结果影响较大。
  2. 对初始质心敏感:初始质心的选择会影响最终结果,可能会陷入局部最优。
  3. 对噪声和异常值敏感:噪声和异常值可能会严重影响簇的结果。

🍈K-means聚类的应用场景

K-means聚类在实际中有广泛的应用,包括但不限于:

  1. 图像处理:如图像分割、颜色量化等。
  2. 市场营销:客户分群,根据消费行为将客户分成不同的群体。
  3. 文本处理:文档聚类,将相似的文档分在一起。
  4. 生物信息学:基因表达数据分析,将具有相似表达模式的基因分在一起。

🍈K-means的改进和变体

为了克服K-means的一些缺点,研究人员提出了许多改进和变体方法:

  1. K-means++:通过改进质心初始化过程,减少算法陷入局部最优的可能性。
  2. Mini-batch K-means:使用小批量数据进行训练,适用于大规模数据集。
  3. 谱聚类:结合图论和K-means,适用于非凸形状的簇。

🍉K-means聚类算法示例

  • 为了更好地理解K-means聚类算法在现实生活中的应用,我们将以一个具体的示例来演示其使用过程和效果。我们将使用K-means聚类算法对客户进行分群,以帮助企业进行市场营销策略的制定。

🍈问题

假设我们是一家电子商务公司,希望通过分析客户的购买行为,将客户分成不同的群体,以便进行有针对性的市场营销。我们拥有以下客户数据集:

  • 客户ID
  • 年龄
  • 年收入(以美元计)
  • 年消费额(以美元计)

🍍数据准备

首先,我们需要对数据进行预处理和标准化,因为不同特征的量纲可能会影响聚类效果。

import pandas as pd
from sklearn.preprocessing import StandardScaler# 创建示例数据集
data = {'CustomerID': [1, 2, 3, 4, 5],'Age': [25, 34, 45, 23, 35],'Annual Income (k$)': [15, 20, 35, 60, 45],'Spending Score (1-100)': [39, 81, 6, 77, 40]
}
df = pd.DataFrame(data)# 标准化特征
scaler = StandardScaler()
df[['Age', 'Annual Income (k$)', 'Spending Score (1-100)']] = scaler.fit_transform(df[['Age', 'Annual Income (k$)', 'Spending Score (1-100)']])

🍍选择K值

通常情况下,选择K值可以通过“肘部法则”来确定。我们绘制不同K值下的SSE(误差平方和)曲线,选择拐点作为K值。

from sklearn.cluster import KMeans
import matplotlib.pyplot as plt# 计算不同K值下的SSE
sse = []
for k in range(1, 11):kmeans = KMeans(n_clusters=k, random_state=0)kmeans.fit(df[['Age', 'Annual Income (k$)', 'Spending Score (1-100)']])sse.append(kmeans.inertia_)# 绘制肘部法则图
plt.figure(figsize=(8, 5))
plt.plot(range(1, 11), sse, marker='o')
plt.title('Elbow Method for Optimal K')
plt.xlabel('Number of clusters')
plt.ylabel('SSE')
plt.show()

假设通过肘部法则确定K值为3。

🍍运行K-means聚类

使用K-means算法对客户进行分群。

# 运行K-means聚类
kmeans = KMeans(n_clusters=3, random_state=0)
df['Cluster'] = kmeans.fit_predict(df[['Age', 'Annual Income (k$)', 'Spending Score (1-100)']])# 查看聚类结果
print(df)

🍍分析聚类结果

通过可视化和统计分析,我们可以更好地理解每个簇的特征。

# 可视化聚类结果
plt.figure(figsize=(8, 5))
plt.scatter(df['Annual Income (k$)'], df['Spending Score (1-100)'], c=df['Cluster'], cmap='viridis')
plt.scatter(kmeans.cluster_centers_[:, 1], kmeans.cluster_centers_[:, 2], s=300, c='red')
plt.title('Customer Segments')
plt.xlabel('Annual Income (k$)')
plt.ylabel('Spending Score (1-100)')
plt.show()

此外,我们可以查看每个簇的中心和簇内数据点的分布情况:

# 查看每个簇的中心
centroids = kmeans.cluster_centers_
print("Cluster Centers:\n", centroids)# 查看每个簇的样本数量
print(df['Cluster'].value_counts())

🍈完整代码实现

import pandas as pd
import numpy as np
from sklearn.preprocessing import StandardScaler
from sklearn.cluster import KMeans
import matplotlib.pyplot as plt# 创建示例数据集
data = {'CustomerID': [1, 2, 3, 4, 5, 6, 7, 8, 9, 10],'Age': [25, 34, 45, 23, 35, 64, 24, 29, 33, 55],'Annual Income (k$)': [15, 20, 35, 60, 45, 70, 18, 24, 50, 40],'Spending Score (1-100)': [39, 81, 6, 77, 40, 80, 20, 60, 54, 50]
}
df = pd.DataFrame(data)# 标准化特征
scaler = StandardScaler()
df[['Age', 'Annual Income (k$)', 'Spending Score (1-100)']] = scaler.fit_transform(df[['Age', 'Annual Income (k$)', 'Spending Score (1-100)']])# 计算不同K值下的SSE
sse = []
for k in range(1, 11):kmeans = KMeans(n_clusters=k, random_state=0)kmeans.fit(df[['Age', 'Annual Income (k$)', 'Spending Score (1-100)']])sse.append(kmeans.inertia_)# 绘制肘部法则图
plt.figure(figsize=(8, 5))
plt.plot(range(1, 11), sse, marker='o')
plt.title('Elbow Method for Optimal K')
plt.xlabel('Number of clusters')
plt.ylabel('SSE')
plt.show()# 根据肘部法则选择K值为3
k = 3# 运行K-means聚类
kmeans = KMeans(n_clusters=k, random_state=0)
df['Cluster'] = kmeans.fit_predict(df[['Age', 'Annual Income (k$)', 'Spending Score (1-100)']])# 查看聚类结果
print(df)# 可视化聚类结果
plt.figure(figsize=(8, 5))
plt.scatter(df['Annual Income (k$)'], df['Spending Score (1-100)'], c=df['Cluster'], cmap='viridis')
plt.scatter(kmeans.cluster_centers_[:, 1], kmeans.cluster_centers_[:, 2], s=300, c='red', marker='x')
plt.title('Customer Segments')
plt.xlabel('Annual Income (k$)')
plt.ylabel('Spending Score (1-100)')
plt.show()# 查看每个簇的中心
centroids = kmeans.cluster_centers_
print("Cluster Centers:\n", centroids)# 查看每个簇的样本数量
print(df['Cluster'].value_counts())

🍈代码解释

🍍导入必要的库

  1. pandas用于数据处理。
  2. numpy用于数值计算。
  3. StandardScaler用于标准化数据。
  4. KMeans用于K-means聚类。
  5. matplotlib用于数据可视化。

🍍创建示例数据集

  • 包含客户ID、年龄、年收入和消费评分。

🍍标准化特征

  • 使用StandardScaler将特征缩放到相同的尺度,以提高聚类效果。

🍍选择K值

  1. 使用肘部法则,通过计算不同K值下的SSE(误差平方和)来确定最佳K值。
  2. 绘制SSE随K值变化的曲线,选择拐点作为最佳K值。

🍍运行K-means聚类

  1. 使用确定的K值运行K-means算法,对客户进行分群。
  2. 将分群结果添加到数据集中。

🍍可视化聚类结果

  • 绘制聚类结果的散点图,使用不同颜色表示不同的簇,并标出每个簇的质心。

🍍查看聚类结果

  • 打印每个簇的中心坐标和每个簇的样本数量,以更好地理解每个簇的特征。

 

希望这些能对刚学习算法的同学们提供些帮助哦!!!

相关文章:

  • Vue.js - 计算属性与侦听器 【0基础向 Vue 基础学习】
  • 【驱动】RS485收发控制、自动收发电路及波特率限制
  • 介绍一下Lumina-T2X在哪些领域有应用
  • elementui中 表格使用树形数据且固定一列时展开子集移入时背景色不全问题(父级和子级所展示的字段是不一样的时候)
  • Rust后台管理系统Salvo-admin源码编译
  • 基于Fluent和深度学习算法驱动的流体力学计算与应用
  • 5.27周报
  • 【MySQL精通之路】数据类型
  • [转载]同一台电脑同时使用GitHub和GitLab
  • C++:vector基础讲解
  • 【ARMv8/v9 异常模型入门及渐进 10 -- WFI 与 WFE 使用详细介绍 1】
  • linux网卡MAC地址
  • 浅谈,Java当中普通类与抽象类的区别
  • Day47 打家劫舍123
  • 【MySQL精通之路】全文搜索(3)-带查询扩展的全文搜索
  • [译] React v16.8: 含有Hooks的版本
  • 78. Subsets
  • HTML-表单
  • JS笔记四:作用域、变量(函数)提升
  • Odoo domain写法及运用
  • PyCharm搭建GO开发环境(GO语言学习第1课)
  • Python爬虫--- 1.3 BS4库的解析器
  • React+TypeScript入门
  • SOFAMosn配置模型
  • 区块链共识机制优缺点对比都是什么
  • 如何将自己的网站分享到QQ空间,微信,微博等等
  • 如何使用 JavaScript 解析 URL
  • 实现简单的正则表达式引擎
  • 一个6年java程序员的工作感悟,写给还在迷茫的你
  • 智能合约开发环境搭建及Hello World合约
  • 【云吞铺子】性能抖动剖析(二)
  • raise 与 raise ... from 的区别
  • 说说我为什么看好Spring Cloud Alibaba
  • ​​​​​​​开发面试“八股文”:助力还是阻力?
  • !!Dom4j 学习笔记
  • $.extend({},旧的,新的);合并对象,后面的覆盖前面的
  • (2)从源码角度聊聊Jetpack Navigator的工作流程
  • (javascript)再说document.body.scrollTop的使用问题
  • (Redis使用系列) Springboot 实现Redis消息的订阅与分布 四
  • (翻译)Quartz官方教程——第一课:Quartz入门
  • (仿QQ聊天消息列表加载)wp7 listbox 列表项逐一加载的一种实现方式,以及加入渐显动画...
  • (排序详解之 堆排序)
  • (三)docker:Dockerfile构建容器运行jar包
  • (十)DDRC架构组成、效率Efficiency及功能实现
  • (转)jQuery 基础
  • (转)JVM内存分配 -Xms128m -Xmx512m -XX:PermSize=128m -XX:MaxPermSize=512m
  • (转)MVC3 类型“System.Web.Mvc.ModelClientValidationRule”同时存在
  • .babyk勒索病毒解析:恶意更新如何威胁您的数据安全
  • .gitignore文件_Git:.gitignore
  • .NET 8.0 发布到 IIS
  • .NET CORE 2.0发布后没有 VIEWS视图页面文件
  • .net core webapi 大文件上传到wwwroot文件夹
  • .net framework 4.0中如何 输出 form 的name属性。
  • .net MySql
  • .net程序集学习心得