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

K-Means 聚类:数据挖掘的瑞士军刀

引言

在数据科学领域,聚类算法是一种非常重要的无监督学习方法,它能够帮助我们发现数据中的自然分组或模式。其中,K-Means 聚类算法因其简单高效而成为最常用的聚类算法之一。无论是市场细分、社交网络分析,还是图像分割等领域,K-Means 的身影无处不在。本文将带你深入了解 K-Means 聚类算法的原理与应用,从基础到实战,让你全面掌握这一强大的工具。

基础语法介绍

K-Means 聚类的核心概念

K-Means 是一种迭代的聚类算法,其目标是将数据集划分成 K 个簇(cluster),使得每个簇内部的数据点尽可能相似,而不同簇之间的数据点差异尽可能大。算法的主要步骤如下:

  1. 初始化:随机选择 K 个数据点作为初始的质心(centroid)。
  2. 分配:根据当前的质心,将每个数据点分配给最近的质心所在的簇。
  3. 更新:重新计算每个簇的质心,新的质心是该簇内所有数据点的平均值。
  4. 重复:重复执行第 2 步和第 3 步,直到质心不再发生变化或达到最大迭代次数。

基本语法规则

在 Python 中,我们可以使用 scikit-learn 库来实现 K-Means 聚类。以下是基本的语法结构:

from sklearn.cluster import KMeans# 创建 KMeans 模型
kmeans = KMeans(n_clusters=3)  # n_clusters 表示要划分的簇的数量# 拟合模型
kmeans.fit(X)  # X 是一个 (n_samples, n_features) 的数组# 预测簇标签
labels = kmeans.predict(X)# 获取质心
centroids = kmeans.cluster_centers_

基础实例

问题描述

假设我们有一个二维数据集,数据点分布如下图所示。我们的任务是使用 K-Means 算法将这些数据点分为 3 个簇。

代码示例

首先,我们需要导入必要的库并生成一些示例数据:

import numpy as np
import matplotlib.pyplot as plt
from sklearn.datasets import make_blobs# 生成示例数据
X, _ = make_blobs(n_samples=300, centers=3, cluster_std=0.60, random_state=0)# 绘制数据点
plt.scatter(X[:, 0], X[:, 1])
plt.show()

接下来,我们使用 K-Means 算法对数据进行聚类:

from sklearn.cluster import KMeans# 创建 KMeans 模型
kmeans = KMeans(n_clusters=3)# 拟合模型
kmeans.fit(X)# 获取簇标签
labels = kmeans.labels_# 获取质心
centroids = kmeans.cluster_centers_# 绘制聚类结果
plt.scatter(X[:, 0], X[:, 1], c=labels, cmap='viridis')
plt.scatter(centroids[:, 0], centroids[:, 1], c='red', marker='x')
plt.title('K-Means Clustering')
plt.show()

运行上述代码后,你将看到数据点被成功地分成了 3 个簇,并且每个簇的质心也被标记出来。

进阶实例

问题描述

在实际应用中,数据集往往更加复杂,可能包含更多的特征和噪声。例如,我们有一个包含多个特征的客户数据集,希望通过 K-Means 聚类来识别不同的客户群体。

高级代码实例

首先,我们加载数据并进行预处理:

import pandas as pd
from sklearn.preprocessing import StandardScaler# 加载数据
data = pd.read_csv('customer_data.csv')# 选择特征
features = ['age', 'income', 'spending_score']
X = data[features]# 数据标准化
scaler = StandardScaler()
X_scaled = scaler.fit_transform(X)

接下来,我们使用 K-Means 算法进行聚类,并评估聚类效果:

from sklearn.cluster import KMeans
from sklearn.metrics import silhouette_score# 创建 KMeans 模型
kmeans = KMeans(n_clusters=4)# 拟合模型
kmeans.fit(X_scaled)# 获取簇标签
labels = kmeans.labels_# 计算轮廓系数
silhouette_avg = silhouette_score(X_scaled, labels)
print(f'Silhouette Score: {silhouette_avg}')# 可视化聚类结果
plt.scatter(X_scaled[:, 0], X_scaled[:, 1], c=labels, cmap='viridis')
plt.title('K-Means Clustering with Multiple Features')
plt.show()

通过计算轮廓系数(Silhouette Score),我们可以评估聚类的效果。轮廓系数的范围在 -1 到 1 之间,值越接近 1 表示聚类效果越好。

实战案例

问题描述

假设你在一家电商平台工作,负责用户行为分析。你的任务是通过用户的购买历史和浏览行为,将用户分成不同的群体,以便进行更精准的营销活动。

解决方案

  1. 数据收集:收集用户的购买历史、浏览记录、点击率等数据。
  2. 数据预处理:清洗数据,处理缺失值,标准化特征。
  3. 特征选择:选择对用户行为影响较大的特征,如购买频率、平均消费金额、浏览时间等。
  4. 模型训练:使用 K-Means 算法对数据进行聚类。
  5. 结果分析:分析不同用户群体的行为特征,制定相应的营销策略。

代码实现

import pandas as pd
from sklearn.preprocessing import StandardScaler
from sklearn.cluster import KMeans
from sklearn.metrics import silhouette_score# 加载数据
data = pd.read_csv('user_behavior_data.csv')# 选择特征
features = ['purchase_frequency', 'average_spend', 'browse_time']
X = data[features]# 数据标准化
scaler = StandardScaler()
X_scaled = scaler.fit_transform(X)# 创建 KMeans 模型
kmeans = KMeans(n_clusters=5)# 拟合模型
kmeans.fit(X_scaled)# 获取簇标签
labels = kmeans.labels_# 计算轮廓系数
silhouette_avg = silhouette_score(X_scaled, labels)
print(f'Silhouette Score: {silhouette_avg}')# 将聚类结果添加回原始数据
data['cluster'] = labels# 分析每个簇的特征
for cluster in range(5):cluster_data = data[data['cluster'] == cluster]print(f'Cluster {cluster} Summary:')print(cluster_data[features].describe())

通过上述代码,你可以将用户分成 5 个不同的群体,并分析每个群体的特征,从而制定更精准的营销策略。

扩展讨论

选择合适的 K 值

K-Means 算法的一个关键问题是选择合适的 K 值。常用的方法有肘部法(Elbow Method)和轮廓系数法(Silhouette Score)。肘部法通过绘制不同 K 值下的误差平方和(SSE)曲线,选择曲线的“肘部”作为最佳的 K 值。轮廓系数法则通过计算每个数据点的轮廓系数,选择使平均轮廓系数最大的 K 值。

处理大规模数据

对于大规模数据集,传统的 K-Means 算法可能会遇到性能瓶颈。此时可以考虑使用 Mini-Batch K-Means 或者分布式 K-Means 算法。Mini-Batch K-Means 在每次迭代时只使用一部分数据进行更新,从而加快收敛速度。分布式 K-Means 则可以利用多台机器并行计算,进一步提高效率。

其他聚类算法

虽然 K-Means 是最常用的聚类算法之一,但它也有局限性,例如对初始质心的选择敏感、不能处理非凸形状的簇等。因此,在实际应用中,还可以考虑其他聚类算法,如 DBSCAN、层次聚类(Hierarchical Clustering)、高斯混合模型(Gaussian Mixture Model)等。

总结

K-Means 聚类算法以其简单高效的特点,在数据挖掘和机器学习领域得到了广泛应用。通过本文的介绍,相信你已经掌握了 K-Means 的基本原理和应用方法。无论你是初学者还是有经验的开发者,都可以通过实践不断深化对 K-Means 的理解,将其应用于更多复杂的场景中。希望本文能为你提供有价值的参考和启发。

相关文章:

K-Means 聚类:数据挖掘的瑞士军刀

引言 在数据科学领域,聚类算法是一种非常重要的无监督学习方法,它能够帮助我们发现数据中的自然分组或模式。其中,K-Means 聚类算法因其简单高效而成为最常用的聚类算法之一。无论是市场细分、社交网络分析,还是图像分割等领域&a…...

项目练习:若依-前端项目的目录结构介绍

文章目录 一、目录截图二、目录讲解 一、目录截图 二、目录讲解 1、首先,我们可以看到,这个VUE项目,只有一个App.vue,所以,它是一个单页面系统。 这个App.vue是根组件,root组件。 2、public目录 在Vue 3.…...

知网研学 | 知网文献(CAJ+PDF)批量下载

知网文献(CAJPDF)批量下载 一、知网研学安装二、插件及脚本安装三、CAJ批量下载四、脚本下载及PDF批量下载浏览器取消拦截窗口 一、知网研学安装 批量下载知网文件,格式为es6文件,需使用知网研学软件打开,故需先安装该…...

设计模式期末复习

一、设计模式的概念以及分类 二、设计模式的主题和意图 三、面向对象程序设计原则,记住名字,还要理解它的使用场景以及如何用? 四、松耦合、紧耦合、强关联、弱关联、静态复用、动态复用的概念,还有静态委派,动态委…...

CentOS7源码编译安装nginx+php+mysql

1.安装nginx 安装依赖 yum -y install gcc gcc-c wget automake autoconf libtool libxml2-devel libxslt-devel perl-devel perl-ExtUtils-Embed pcre-devel openssl openssl-devel 创建一个不能登录的nginx运行用户 groupadd www-data useradd -s /sbin/nologin -g www-d…...

linux CentOS系统上卸载docker

一、停止Docker服务 首先,需要停止Docker服务。使用systemctl命令来停止Docker服务: bash复制代码sudo systemctl stop docker二、卸载Docker软件包 接下来,使用CentOS的包管理器yum来卸载Docker软件包。根据安装的Docker版本和组件&#…...

css中相对定位的应用场景

元素位置微调 文本与图标组合微调&#xff1a;在网页设计中&#xff0c;经常会有文本和图标的组合&#xff0c;比如一个带有搜索图标的搜索框。可以使用相对定位来微调图标在搜索框内的位置。例如&#xff0c;有以下HTML结构&#xff1a; <input type"text" class…...

Android 获取屏幕物理尺寸

注&#xff1a;编译 sdk 需要使用 30 因为引入了 WindowMetrics、uild.VERSION_CODES.R 新 sdk 才存在的类和属性 某些场景处理 view &#xff0c;对 view 显示的位置要求比较精确&#xff0c;通常我们使用context.getResources().getDisplayMetrics().widthPixels 获取到的宽、…...

C缺陷与陷阱 — 8 编译与链接

目录 1 程序的编译过程 2 动态链接的优缺点 2.1 动态链接的优点 2.2 动态链接的缺点 2.3 只使用动态链接 3 函数库链接的5个特殊秘密 4 警惕Interpositioning 5 产生链接器报告文件 1 程序的编译过程 程序的编译过程是将源代码转换成计算机可以执行的机器代码的过程。…...

知识分享第三十天-力扣343.(整数拆分)

343 整数拆分 给定一个正整数 n&#xff0c;将其拆分为至少两个正整数的和&#xff0c;并使这些整数的乘积最大化。 返回你可以获得的最大乘积。 示例 1: 输入: 2 输出: 1 解释: 2 1 1, 1 1 1。 示例 2: 输入: 10 输出: 36 解释: 10 3 3 4, 3 3 4 36。 说明: 你可…...

Springboot 整合DL4J 打造智能写作助手(文本生成)

项目准备 环境要求: Java 1.8或以上 Maven 或 Gradle&#xff08;用于项目管理&#xff09; Spring Boot框架 DL4J库&#xff08;DeepLearning4J&#xff09; 创建 Spring Boot 项目 使用 Spring Initializr 来生成一个新的 Spring Boot 项目。选择合适的依赖&#xff0c;例如…...

SPL06 基于stm32F103 HAL库驱动(软件模拟IIC)

talk is cheap, show you my code SPL06.c #include "SPL06.h"//*************全局变量*************// Factor_List* b_list; //存储过采样率对应的系数KP&#xff0c;KT COEF_ValueStruct Coefficient { 0 }; //存储校准系数…...

【C#】List求并集、交集、差集

值类型List List<int> intList1 new List<int>() { 1, 2, 3 };List<int> intList2 new List<int>() { 3, 4, 5 };var result intList1.Union(intList2);Console.WriteLine($"并 {string.Join(,,result)}");result intList1.Intersect(in…...

YOLOv8目标检测——详细记录使用ONNX Runtime进行推理部署C++/Python实现

概述 在之前博客中有介绍YOLOv8从环境安装到训练的完整过程&#xff0c;本节主要介绍ONNX Runtime的原理以及使用其进行推理加速&#xff0c;使用Python、C两种编程语言来实现。 https://blog.csdn.net/MariLN/article/details/143924548?spm1001.2014.3001.5501 1. ONNX Ru…...

mfc140u.dll是什么文件?如何解决mfc140u.dll丢失的相关问题

遇到“mfc140u.dll文件丢失”的错误通常影响应用程序的运行&#xff0c;这个问题主要出现在使用Microsoft Visual C环境开发的软件中。mfc140u.dll是一个重要的系统文件&#xff0c;如果它丢失或损坏&#xff0c;会导致相关程序无法启动。本文将简要介绍几种快速有效的方法来恢…...

Redis篇-19--运维篇1-主从复制(主从复制,读写分离,配置实现,实战案例)

1、概述 Redis的主从复制&#xff08;Master-Slave Replication&#xff09;是一种数据冗余机制&#xff0c;它允许将一台Redis服务器的数据复制到其他Redis服务器。在主从复制中&#xff0c;有一台主服务器&#xff08;Master&#xff09;和一个或多个从服务器&#xff08;Sl…...

【Elasticsearch入门到落地】4、Elasticsearch的安装

接上篇《3、es与mysql的概念对比》 上一篇我们学习了Elasticsearch与Mysql的概念与区别。本篇我们来进行Elasticsearch的环境准备及软件安装。 一、环境准备 如果我们没有自己的Linux服务器&#xff0c;且现在正在使用的是Windows操作系统的电脑&#xff0c;那么首先我们需要安…...

计算无人机俯拍图像的地面采样距离(GSD)矩阵

引言 在无人机遥感、测绘和精细农业等领域&#xff0c;地面采样距离&#xff08;Ground Sampling Distance&#xff0c;简称 GSD&#xff09;是一个非常重要的指标。GSD 是指图像中每个像素在地面上实际代表的物理距离&#xff0c;通常以米或厘米为单位。GSD 决定了图像的空间…...

牛客网 SQL37查找多列排序

SQL37查找多列排序 select device_id,gpa,age from user_profile order by gpa asc,age asc#select [字段1,字段2] from [表名] order by [字段1] [升序(asc)/降序(desc)],[字段2] [升序(asc)/降序(desc)] #select&#xff1a;查询 #order by 排序 每日问题 如何处理对象的状…...

el-tabs标签过多

tab-position&#xff1a;top情况 .el-tabs__nav-wrap{overflow-x: auto ;width: 86% ;margin-left: 10px ; } 效果&#xff1a; tab-position&#xff1a;left情况 .el-tabs__nav-wrap{overflow-x: auto ;height: 高度 ;margin-top: 10px ; } 效果&#xff1a; 注意&…...

IDEA运行Tomcat出现乱码问题解决汇总

最近正值期末周&#xff0c;有很多同学在写期末Java web作业时&#xff0c;运行tomcat出现乱码问题&#xff0c;经过多次解决与研究&#xff0c;我做了如下整理&#xff1a; 原因&#xff1a; IDEA本身编码与tomcat的编码与Windows编码不同导致&#xff0c;Windows 系统控制台…...

conda相比python好处

Conda 作为 Python 的环境和包管理工具&#xff0c;相比原生 Python 生态&#xff08;如 pip 虚拟环境&#xff09;有许多独特优势&#xff0c;尤其在多项目管理、依赖处理和跨平台兼容性等方面表现更优。以下是 Conda 的核心好处&#xff1a; 一、一站式环境管理&#xff1a…...

Vue记事本应用实现教程

文章目录 1. 项目介绍2. 开发环境准备3. 设计应用界面4. 创建Vue实例和数据模型5. 实现记事本功能5.1 添加新记事项5.2 删除记事项5.3 清空所有记事 6. 添加样式7. 功能扩展&#xff1a;显示创建时间8. 功能扩展&#xff1a;记事项搜索9. 完整代码10. Vue知识点解析10.1 数据绑…...

基于大模型的 UI 自动化系统

基于大模型的 UI 自动化系统 下面是一个完整的 Python 系统,利用大模型实现智能 UI 自动化,结合计算机视觉和自然语言处理技术,实现"看屏操作"的能力。 系统架构设计 #mermaid-svg-2gn2GRvh5WCP2ktF {font-family:"trebuchet ms",verdana,arial,sans-…...

微软PowerBI考试 PL300-选择 Power BI 模型框架【附练习数据】

微软PowerBI考试 PL300-选择 Power BI 模型框架 20 多年来&#xff0c;Microsoft 持续对企业商业智能 (BI) 进行大量投资。 Azure Analysis Services (AAS) 和 SQL Server Analysis Services (SSAS) 基于无数企业使用的成熟的 BI 数据建模技术。 同样的技术也是 Power BI 数据…...

逻辑回归:给不确定性划界的分类大师

想象你是一名医生。面对患者的检查报告&#xff08;肿瘤大小、血液指标&#xff09;&#xff0c;你需要做出一个**决定性判断**&#xff1a;恶性还是良性&#xff1f;这种“非黑即白”的抉择&#xff0c;正是**逻辑回归&#xff08;Logistic Regression&#xff09;** 的战场&a…...

oracle与MySQL数据库之间数据同步的技术要点

Oracle与MySQL数据库之间的数据同步是一个涉及多个技术要点的复杂任务。由于Oracle和MySQL的架构差异&#xff0c;它们的数据同步要求既要保持数据的准确性和一致性&#xff0c;又要处理好性能问题。以下是一些主要的技术要点&#xff1a; 数据结构差异 数据类型差异&#xff…...

Qwen3-Embedding-0.6B深度解析:多语言语义检索的轻量级利器

第一章 引言&#xff1a;语义表示的新时代挑战与Qwen3的破局之路 1.1 文本嵌入的核心价值与技术演进 在人工智能领域&#xff0c;文本嵌入技术如同连接自然语言与机器理解的“神经突触”——它将人类语言转化为计算机可计算的语义向量&#xff0c;支撑着搜索引擎、推荐系统、…...

linux 错误码总结

1,错误码的概念与作用 在Linux系统中,错误码是系统调用或库函数在执行失败时返回的特定数值,用于指示具体的错误类型。这些错误码通过全局变量errno来存储和传递,errno由操作系统维护,保存最近一次发生的错误信息。值得注意的是,errno的值在每次系统调用或函数调用失败时…...

自然语言处理——Transformer

自然语言处理——Transformer 自注意力机制多头注意力机制Transformer 虽然循环神经网络可以对具有序列特性的数据非常有效&#xff0c;它能挖掘数据中的时序信息以及语义信息&#xff0c;但是它有一个很大的缺陷——很难并行化。 我们可以考虑用CNN来替代RNN&#xff0c;但是…...