K-means聚类算法的原理、应用与实例

文章目录

      • K-means 聚类算法:原理
      • K-means 聚类算法的应用
      • K-means 聚类算法的优化与改进
    • 一个使用 K-means 聚类算法进行客户细分的简单实例

K-means 聚类算法:原理

K-means 算法是一种经典的无监督学习方法,用于对未标记的数据集进行分群,即将数据集中相似的对象划分为不同的簇。以下是其基本原理:

1. 初始化:

  • 设定簇的数量(K):由用户预先指定,表示希望得到的簇的数量。
  • 选择初始聚类中心(Centroids):通常随机从数据集中选取 K 个对象作为初始的聚类中心。

2. 分配对象到簇:

  • 计算距离:对于数据集中每一个对象,计算其与 K 个聚类中心之间的距离(通常使用欧氏距离)。
  • 分配归属:将每个对象分配到与其最近的聚类中心对应的簇中。

3. 更新聚类中心:

  • 计算簇内平均值:对于每个簇,计算其包含的所有对象的特征均值,得到新的聚类中心。
  • 移动中心:将簇的聚类中心更新为这个新的计算出的均值位置。

4. 判断收敛与迭代:

  • 检查终止条件:比较当前迭代前后聚类中心的变化情况,如果变化小于某个预定阈值或达到最大迭代次数,则算法结束;否则,返回步骤2,继续进行新一轮的分配和更新。

上述过程反复进行,直到聚类中心的位置不再显著变化或达到预设的迭代次数上限。最终得到的簇即为数据集中的自然结构划分,每个簇内的对象在特征空间中较为接近,而不同簇之间的对象相对较远。

K-means 聚类算法的应用

K-means 聚类因其简单、高效的特点,在众多领域中有着广泛应用,包括但不限于:

1. 数据挖掘与分析:

  • 市场细分:对消费者数据进行聚类,识别具有相似消费习惯或偏好特征的客户群体,以便制定针对性的营销策略。
  • 文档分类:对文本数据(如新闻文章、网页等)进行聚类,自动划分主题相似的文章类别。
  • 社交网络分析:对用户行为数据进行聚类,发现用户社区、兴趣小组或用户角色。

2. 图像处理与计算机视觉:

  • 图像分割:对图像像素进行聚类,实现基于颜色、纹理等特征的图像区域划分。
  • 对象识别与跟踪:对视频帧中的对象进行聚类,辅助进行运动对象的识别与跟踪。

3. 生物医学研究:

  • 基因表达数据分析:对基因表达谱数据进行聚类,识别具有相似表达模式的基因组群,揭示潜在的生物学功能或疾病相关性。
  • 医疗影像分析:对医学影像(如MRI、CT等)进行聚类,区分正常组织与异常区域,辅助诊断与治疗规划。

4. 其他领域:

  • 地理信息系统(GIS):对地理位置数据进行聚类,发现人口分布、商业热点等空间模式。
  • 物联网(IoT):对传感器数据进行聚类,识别设备工作状态模式或异常行为。

K-means 聚类算法的优化与改进

尽管 K-means 算法简单易用,但在实际应用中可能会遇到一些挑战,为此研究人员提出了多种优化与改进策略:

1. 初始聚类中心的选择:

  • K-means++:通过概率方法选择初始聚类中心,确保它们尽可能分散且能代表数据的整体分布,从而提高算法的稳定性和收敛速度。
  • 其他策略:如基于密度的方法、基于层次的方法或使用智能优化算法(如遗传算法、模拟退火等)来确定初始聚类中心。

2. 距离度量与标准化:

  • 非欧氏距离:根据数据特性选择更适合的距离度量,如曼哈顿距离、余弦相似度、马氏距离等。
  • 特征缩放与标准化:对数据进行预处理,如归一化、标准化等,以消除特征间尺度差异对聚类结果的影响。

3. 处理不同类型数据与噪声:

  • 模糊 C 均值(FCM):允许对象属于多个簇,适用于边界模糊或含有噪声的数据。
  • DBSCANOPTICS:针对具有不同密度区域的数据,发现任意形状的簇,并能较好地处理噪声点和离群值。

4. 动态调整簇数量 K:

  • 肘部法则:通过观察轮廓系数、 inertia(簇内平方和)等指标随 K 值变化的趋势,选择“肘部”处的 K 值作为最优簇数。
  • 交叉验证或**贝叶斯信息准则(BIC)**等统计方法:用于评估不同 K 值下的聚类质量,选择最优 K。

5. 并行与分布式计算:

  • MapReduceSpark 等框架:对大规模数据集进行分布式 K-means 聚类,利用多核处理器或集群的并行计算能力加速算法执行。

6. 异质聚类:

  • 混合高斯模型(GMM):将数据视为由多个高斯分布生成,每个高斯分布对应一个簇,适用于数据内部存在异质性的场景。GMM 通过 EM 算法进行参数估计和聚类。
  • 概率潜在语义分析(PLSA):适用于处理文本数据,假设每个文档是若干隐含主题的混合,每个主题对应一个簇,通过最大化似然函数进行参数估计和聚类。

7. 高维数据聚类:

  • 子空间聚类(如 CLIQUE、SPEC、PROCLUS 等):寻找数据中具有聚类结构的低维子空间,降低维度以改善 K-means 在高维空间中的性能。
  • 稀疏编码深度学习预处理:通过学习数据的潜在表示(如自编码器、深度神经网络等),将原始高维数据映射到低维、更利于聚类的特征空间。

8. 时间序列与流数据聚类:

  • 在线 K-means增量 K-means:适应数据流的实时更新,仅对新加入的数据点或发生变化的簇进行重新分配和中心更新,无需每次都遍历整个数据集。
  • 动态聚类(如 DenStream、CluStream 等):适用于数据分布随时间变化的场景,能够持续监控数据流,发现并跟踪动态出现和消失的簇。

9. 加权 K-means 聚类:

  • 加权 K-means:为数据点赋予权重,反映其在聚类中的相对重要性,适用于处理带有不确定性的数据或含有噪声的数据集。
  • 约束 K-means:引入先验知识或用户指定的约束条件(如必须将某些对象分到同一簇、某些对象不能分到同一簇等),引导聚类过程,提高结果的实用价值。

10. 聚类后处理与评估:

  • 后处理方法:如对小簇合并、大簇分裂、边界对象重新分配等操作,以改善聚类的直观解释性和用户接受度。
  • 聚类评估指标:如轮廓系数、Calinski-Harabasz 指数、Davies-Bouldin 指数等,定量评价聚类结果的质量,为算法选择和参数调优提供依据。

综上所述,通过对 K-means 聚类算法进行适当的优化与改进,我们可以应对更广泛的数据类型、规模、特性和应用场景,提高聚类的准确性和效率,使其在实际问题中发挥更大的作用。同时,结合领域知识和具体需求,灵活运用各种策略和方法,有助于获得更为满意的聚类结果。

一个使用 K-means 聚类算法进行客户细分的简单实例

以下是一个使用 K-means 聚类算法进行客户细分的简单实例。在这个例子中,我们假设有一家电商公司收集了其部分客户的购买历史数据,包括两个主要特征:年度消费金额(Annual_Spending)和购物频次(Purchase_Frequency)。公司希望通过 K-means 聚类算法将客户分为不同的群体,以便制定更具针对性的营销策略。

数据准备:

假设我们有一个包含 n 个客户的样本数据集 dataset,其中每个客户记录由两列组成:

dataset = [[Annual_Spending_1, Purchase_Frequency_1],[Annual_Spending_2, Purchase_Frequency_2],...[Annual_Spending_n, Purchase_Frequency_n]
]

实施 K-means 聚类:

  1. 初始化聚类中心:选择 k 个初始聚类中心,这里假设 k=3,可以随机从数据集中抽取 k 个样本作为初始聚类中心。
import numpy as npk = 3
initial_centers = np.random.choice(dataset, k, replace=False)
  1. 迭代过程

    • 分配样本到最近的聚类中心:计算每个样本到各个聚类中心的距离(通常使用欧氏距离),将其分配到距离最近的聚类。
    def euclidean_distance(sample, center):return np.sqrt(np.sum((sample - center)**2))clusters = [[] for _ in range(k)]
    for sample in dataset:distances = [euclidean_distance(sample, center) for center in initial_centers]closest_cluster_index = np.argmin(distances)clusters[closest_cluster_index].append(sample)
    
    • 更新聚类中心:重新计算每个聚类内所有样本的均值,作为新的聚类中心。
    new_centers = []
    for cluster in clusters:if cluster:mean = np.mean(cluster, axis=0)new_centers.append(mean)else:# 如果某个聚类为空,可以重新随机选择一个样本作为中心,或者使用前一轮的中心new_centers.append(initial_centers[np.random.randint(k)])
    
  2. 收敛判断:比较新旧聚类中心的变化,如果变化小于某个设定阈值或达到最大迭代次数,则停止迭代;否则,用新聚类中心替换旧中心,继续下一轮迭代。

convergence_threshold = 0.01
max_iterations = 100
iteration = 0while iteration < max_iterations:old_centers = initial_centers.copy()initial_centers = new_centers# ... 重复步骤 2 中的分配样本和更新聚类中心操作# ... 计算新旧聚类中心之间的差异,并判断是否满足收敛条件# 如果未达到收敛条件,增加迭代计数器并继续下一轮iteration += 1# 当算法收敛或达到最大迭代次数时,输出最终的聚类结果

结果解释与应用:

经过 K-means 聚类后,我们得到了三个客户群体(假设 k=3)。每个群体代表一类具有相似消费行为的客户,可以根据聚类结果分析:

  • 低消费、低频次群体:可能对应价格敏感型客户,可推送优惠券或特价商品以刺激消费。
  • 中等消费、中频次群体:可能是忠诚但并不频繁购物的客户,可以通过定期促销活动保持其活跃度。
  • 高消费、高频次群体:可能为VIP客户,应提供专属客户服务、优先权益等,以维持其高价值贡献。

以上实例展示了如何使用 K-means 聚类算法对客户数据进行细分。实际应用中,可能还需要对数据进行预处理(如标准化或归一化)、选择合适的 k 值(可以通过肘部法则、轮廓系数等方法确定)、以及对聚类结果进行可视化(如使用散点图展示不同群体在特征空间中的分布)等步骤。

上述实例展示了 K-means 聚类算法的基本应用流程。接下来,我们将对实例进行补充和完善,包括数据预处理、确定 K 值、结果可视化以及对聚类结果的解释与应用。

1. 数据预处理:

在实际应用中,数据往往需要进行预处理以提高聚类效果。在这个例子中,由于年度消费金额和购物频次的量纲和数值范围可能存在较大差异,我们对其进行标准化处理:

from sklearn.preprocessing import StandardScalerscaler = StandardScaler()
scaled_dataset = scaler.fit_transform(dataset)

标准化后的数据将具有零均值和单位方差,有助于消除特征间的尺度差异,使得距离计算更加公平。

2. 确定 K 值:

K-means 聚类算法需要预先指定簇的数量 k。在这里,我们使用肘部法则来帮助确定一个合适的 k 值。肘部法则通过观察随着 k 增大,轮廓系数或簇内平方和(inertia)的变化趋势,选择拐点(即“肘部”)处的 k 值。

from sklearn.cluster import KMeans
from sklearn.metrics import silhouette_scoreinertias = []
silhouette_scores = []for k in range(2, 11):  # 测试 2 到 10 个簇kmeans = KMeans(n_clusters=k).fit(scaled_dataset)inertias.append(kmeans.inertia_)silhouette_scores.append(silhouette_score(scaled_dataset, kmeans.labels_))plt.figure(figsize=(10, 6))
plt.subplot(1, 2, 1)
plt.plot(range(2, 11), inertias, marker='o')
plt.title('Elbow Method: Inertia vs. Number of Clusters')
plt.xlabel('Number of Clusters (k)')
plt.ylabel('Inertia')plt.subplot(1, 2, 2)
plt.plot(range(2, 11), silhouette_scores, marker='o')
plt.title('Silhouette Score vs. Number of Clusters')
plt.xlabel('Number of Clusters (k)')
plt.ylabel('Silhouette Score')plt.tight_layout()
plt.show()# 根据图形判断“肘部”位置,选择合适的 k 值

3. 结果可视化:

使用散点图将聚类结果可视化,可以帮助我们直观理解不同客户群体在年度消费金额和购物频次特征空间中的分布。

def plot_clusters(dataset, labels, centers):plt.figure(figsize=(8, 6))plt.scatter(dataset[:, 0], dataset[:, 1], c=labels, cmap='viridis', alpha=0.8)plt.scatter(centers[:, 0], centers[:, 1], marker='X', s=150, color='red', label='Cluster Centers')plt.xlabel('Annual Spending (Standardized)')plt.ylabel('Purchase Frequency (Standardized)')plt.legend()plt.show()k = 3  # 假设通过肘部法则确定 k=3
kmeans = KMeans(n_clusters=k).fit(scaled_dataset)
labels = kmeans.labels_
centers = kmeans.cluster_centers_plot_clusters(scaled_dataset, labels, centers)

4. 聚类结果的解释与应用:

根据散点图和聚类结果,我们可以对三个客户群体进行如下解读和应用策略:

  • 群体 0:低年度消费金额、低购物频次的客户,可能对价格敏感。营销策略:推送优惠券、特价商品,鼓励他们增加消费。

  • 群体 1:中等年度消费金额、中购物频次的客户,具有一定忠诚度但购物频率不高。营销策略:定期发送新品推荐、促销活动通知,保持其购物活跃度。

  • 群体 2:高年度消费金额、高购物频次的客户,为公司的高价值客户。营销策略:提供 VIP 服务、优先权益,维护其满意度和忠诚度,确保长期价值贡献。

至此,我们完成了使用 K-means 聚类算法对客户数据进行细分的完整过程,包括数据预处理、确定 K 值、结果可视化以及对聚类结果的解释与应用。这些步骤有助于电商公司制定有针对性的营销策略,提升客户管理与服务效果。

python推荐学习汇总连接:
50个开发必备的Python经典脚本(1-10)

50个开发必备的Python经典脚本(11-20)

50个开发必备的Python经典脚本(21-30)

50个开发必备的Python经典脚本(31-40)

50个开发必备的Python经典脚本(41-50)
————————————————

​最后我们放松一下眼睛
在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

智慧公厕是智慧城市建设中不可或缺的一部分

智慧城市的数字化转型正在取得显著成效&#xff0c;各项基础设施的建设也在迅速发展&#xff0c;其中智慧公厕成为了智慧城市体系中不可或缺的一部分。作为社会生活中必要的设施&#xff0c;公共厕所的信息化、数字化、智慧化升级转型能够实现全区域公共厕所管理的横向打通和纵…

macOS 启动 Nacos(2),50家大厂面试万字精华总结

进来之后一定要选择支持 arm64 的版本不然会出现因为版本不支持导致无法启动 WARNING: The requested images platform (linux/amd64) does not match the detected host platform (linux/arm64/v8) and no specific platform was requested点击 copy docker pull nacos/naco…

Blender2.83 下载地址及安装教程

Blender是一款开源的3D计算机图形软件&#xff0c;广泛应用于动画制作、游戏开发、建模、渲染等领域。它提供了一套强大的工具和功能&#xff0c;让用户能够进行三维建模、动画制作和视觉效果的创作。 Blender支持多种文件格式的导入和导出&#xff0c;使用户能够与其他软件进…

Redis从入门到精通(七)Redis实战(四)库存超卖、一人一单与Redis分布式锁

↑↑↑请在文章开头处下载测试项目源代码↑↑↑ 文章目录 前言4.3 优惠券秒杀4.3.4 库存超卖问题及其解决4.3.4.1 问题分析4.3.4.2 问题解决 4.3.5 一人一单需求4.3.5.1 需求分析4.3.5.2 代码实现4.3.5.3 并发问题4.3.5.4 悲观锁解决并发问题4.3.5.5 集群环境下的并发问题 4.4 …

最新版手机软件App下载排行网站源码/App应用商店源码

内容目录 一、详细介绍二、效果展示1.部分代码2.效果图展示 三、学习资料下载 一、详细介绍 一款简洁蓝色的手机软件应用app下载排行&#xff0c;app下载平台&#xff0c;最新手机app发布网站响应式织梦模板。 主要有&#xff1a;主页、app列表页、app介绍详情页、新闻资讯列…

Linux中磁盘的分区,格式化,挂载和文件系统的修复

一.分区工具 1.分区工具介绍 fdisk 2t及以下分区 推荐 (分完区不保存不生效&#xff0c;有反悔的可能) gdisk 全支持 推荐 parted 全支持 不推荐 ( 即时生效&#xff0c;分完立即生效) 2.fdisk 分区,查看磁盘 格式:fdisk -l [磁盘设备] fdisk -l 查看…

网络协议——RSTP(快速生成树)与MSTP(多实例生成树)

一. RSTP 1. STP的不足 1、依靠计时器超时的方式进行收敛导致它的收敛时间需要30到50秒 2、端口状态和端口角色没有细致区分&#xff0c;指导数据转发依靠的不是端口状态而是端口所扮演角色。 3、如果拓扑频繁变化导致用户通信质量差&#xff0c;甚至通信中断&#xf…

排序:冒泡排序,直接插入排序,简单选择排序,希尔排序,快速排序,堆排序,二路归并排序

目录 一.冒泡排序 代码如下 冒泡排序时间复杂度分析 二.直接插入排序 直接插入排序时间复杂度分析 直接插入排序优化&#xff1a;折半插入排序 三.简单选择排序 简单选择排序优化&#xff1a;双向选择排序 选择排序时间复杂度 双向选择排序时间复杂度 四.希尔排序 希…

达梦的归档日志参数ARCH_RESERVE_TIME测试

达梦的参数ARCH_RESERVE_TIME测试 前面有提到和oracle相比&#xff0c;达梦的归档日志相关参数有个比较特别&#xff0c;可以通过设置它去规定归档日志的保留时间。 ARCH_RESERVE_TIME&#xff1a;归档日志保留时间&#xff0c;单位分钟&#xff0c;取值范围 0~2147483647。只…

黄金白银价格上涨是投资机会吗?

黄金和白银&#xff0c;作为历史悠久的贵重金属&#xff0c;一直以来都被投资者视为避险资产。近年来&#xff0c;随着全球经济环境的变动&#xff0c;我们观察到黄金与白银的价格不断攀升&#xff0c;这是否预示着投资机会的到来&#xff1f;今天&#xff0c;就让我们来深度探…

R+VIC模型融合实践技术应用及未来气候变化模型预测

在气候变化问题日益严重的今天&#xff0c;水文模型在防洪规划&#xff0c;未来预测等方面发挥着不可替代的重要作用。目前&#xff0c;无论是工程实践或是科学研究中都存在很多著名的水文模型如SWAT/HSPF/HEC-HMS等。虽然&#xff0c;这些软件有各自的优点&#xff1b;但是&am…

【软考】哈希表

目录 一、概念1.1 定义 二、哈希函数的构造方法2.1 说明2.2 特性 三、处理冲突的方法3.1 说明3.2 开放定址法3.2.1 说明3.2.2 线性探测 3.3 链地址法3.4 再哈希法3.5 建立公共溢出区 四、哈希表的查找4.1 查找过程4.2 查找特点4.3 装填因子 一、概念 1.1 定义 1.一般存储结构由…

centos7部署zabbix6.4.9

文章目录 [toc]一、环境准备1&#xff09;部署lnmp2&#xff09;修改配置文件3&#xff09;安装数据库 二、部署zabbix1&#xff09;下载zabbix2&#xff09;安装zabbix服务端3&#xff09;修改配置4&#xff09;开机启动5&#xff09;安装客户端 三、登录配置1&#xff09;访问…

在Windows电脑上上传iOS应用至App Store

引言 &#x1f4f1; 使用UniApp开发iOS应用十分便捷&#xff0c;一套代码即可兼容多个平台。然而&#xff0c;UniApp开发iOS应用需要进行证书打包和将IPA文件上传至App Store&#xff0c;这两个步骤通常需要在Mac电脑上完成。那么&#xff0c;如果我们使用的是Windows开发环境…

three.js跟着教程实现VR效果(四)

参照教程&#xff1a;https://juejin.cn/post/6973865268426571784&#xff08;作者&#xff1a;大帅老猿&#xff09; 1.WebGD3D引擎 用three.js &#xff08;1&#xff09;使用立方体6面图 camera放到 立方体的中间 like “回” 让贴图向内翻转 &#xff08;2&#xff09;使…

机器学习 —— 使用机器学习进行情感分析 详细介绍版

机器学习 —— 使用机器学习进行情感分析 详细介绍版 机器学习 —— 使用机器学习进行情感分析 演示版 目录 一、 绪论二、 数据处理1. 构建CSV文档2. 构建模型前的思考2.1. 问题2.2. 解决方法 3. 读取数据4. 用正则表达式来进行对特定符号的剔除5. 使用口袋模型进行文本处理和…

大厂面试:找出数组中第k大的数的最佳算法

一.前置条件 假如数组为a,大小为n&#xff0c;要找到数组a中第k大的数。 二.解决方案 1.使用任意一种排序算法&#xff08;例如快速排序&#xff09;将数组a进行从大到小的排序&#xff0c;则第n-k个数即为答案。 2.构造一个长度为k的数组&#xff0c;将前k个数复制过来并降序…

HarmonyOS开发实例:【状态管理】

状态管理 ArkUI开发框架提供了多维度的状态管理机制&#xff0c;和UI相关联的数据&#xff0c;不仅可以在组件内使用&#xff0c;还可以在不同组件层级间传递&#xff0c;比如父子组件之间&#xff0c;爷孙组件之间等&#xff0c;也可以是全局范围内的传递&#xff0c;还可以是…

限流的实现方式

1、tomcat 设置最大链接数 2、Nginx 漏桶算法 3、网关&#xff0c;令牌桶算法

【HTML】简单制作一个3D动态粒子效果的时空隧道

目录 前言 开始 HTML部分 CSS部分 效果图 总结 前言 无需多言&#xff0c;本文将详细介绍一段HTML&#xff0c;具体内容如下&#xff1a; 开始 首先新建文件夹&#xff0c;创建两个文本文档&#xff0c;其中HTML的文件名改为[index.html]&#xff0c;CSS的文件名改为[Bab…