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. 将分群结果添加到数据集中。

🍍可视化聚类结果

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

🍍查看聚类结果

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

 

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

公共代理IP和独享代理IP之间的区别?

公共代理IP和独享代理IP在网络应用中扮演着不同的角色,它们之间的区别主要体现在使用方式、性能、安全性以及隐私保护等方面。以下是对这两种代理IP的详细对比和分析。 第一点就是使用的方式以及成本上的不同,公共代理IP,顾名思义&#xff0…

MySQL中, 自增主键和UUID作为主键有什么区别?

首先我们来看看, 存储自增主键和uuid的数据类型 我们知道, mysql中作为主键的通常是int类型的数据, 这个 数据从第一条记录开始, 从1开始主键往后递增, 例如我有100条数据, 那么根据主键排序后, 里面的记录从上往下一次就是1, 2, 3 ... 100, 但是UUID就不一样了, UUID是根据特殊…

基于Zookeeper的分布式锁

分布式锁的介绍 在Java的多线程部分,我们知道如果在单个jvm进程中,多个线程之间同时访问一个资源,此时会有多线程的安全问题。为了解决这个线程安全的问题,我们可以使⽤“锁”来实现。但是,多个jvm进程之间如果同时访问…

Topk问题以及二叉树的三种层序遍历和基本操作

一、Topk问题 1、问题描述 TOP-K问题:即求数据结合中前K个最大的元素或者最小的元素,一般情况下数据量都比较大。 比如:专业前10名、世界500强、富豪榜、游戏中前100的活跃玩家等。 2、思路 对于Top-K问题,能想到的最简单直接的…

Go微服务: Nacos的搭建和基础API的使用

Nacos 概述 文档:https://nacos.io/docs/latest/what-is-nacos/搭建:https://nacos.io/docs/latest/quickstart/quick-start-docker/有很多种搭建方式,我们这里使用 docker 来搭建 Nacos 的搭建 这里,我们选择单机模式&#xf…

重学java 46.集合 ① Collection集合

事常与人违,事总在人为 —— 24.5.26 集合 知识导航 1.集合的特点以及作用 2.使用collection接口中的方法 3.使用迭代器迭代集合 4.ArrayList以及LinkedList的使用 5.使用增强for遍历集合 一、单列集合框架的介绍 1.长度可变的容器:集合 2.集合的特点 a.…

App推广新境界:Xinstall助你轻松突破运营痛点,实现用户快速增长!

在移动互联网时代,App已经成为企业营销不可或缺的一部分。然而,如何有效地推广App,吸引并留住用户,成为了众多企业面临的难题。今天,我们将为您揭秘一款神奇的App推广工具——Xinstall,它将助您轻松突破运营…

音视频开发8 音视频中SDL的使用,SDL 在windows上环境搭建,SDL 使用 以及 常用 API说明,show YUV and play PCM

1.SDL简介 SDL(Simple DirectMedia Layer),是一个跨平台的C语言多媒体开发库。 支持Windows、Mac OS X、Linux、iOS、Android 提供对音频、键盘、鼠标、游戏操纵杆、图形硬件的底层访问 很多的视频播放软件、模拟器、受欢迎的游戏都在使用…

我的前端封装之路

最近有粉丝提问了我一个面试中遇到的问题,他说面试的时候,面试官问我:你在以前的项目中封装过组件吗?或者做过npm公共库吗?遇到过什么问题吗?当时自己突然觉得好像没什么可回答的啊,但面试结束想…

【Torch学习笔记】

作者:zjk 和 的区别是逐元素相乘,是矩阵相乘 cat stack 的区别 cat stack 是用于沿新维度将多个张量堆叠在一起的函数。它要求所有输入张量具有相同的形状,并在指定的新维度上进行堆叠。

LabVIEW直方图应用解析

概述 在LabVIEW中,直方图是一种重要的工具,用于分析和展示数据的分布情况。它通过将数据分成若干区间并绘制对应频数,可以帮助用户了解数据的集中趋势、离散程度和分布形态。本文将详细介绍LabVIEW中直方图的使用方法、适用场合、实际意义及…

解决使用ServletUtil.write方法下载接口文件中文乱码问题

文章目录 前言代码片段如下:一、问题分析二、解决办法总结 前言 在开发过程中遇到的一个小问题,实现一个下载模板的接口,我选择了使用hutool包的ServletUtil.write方法去进行文件下载,但调试过程中下载出来的文件名是乱码的&#…

DEM、DSM和DTM之间的区别及5米高程数据获取

在日常的学习工作中我们经常会遇到DEM、DSM和DTM等术语,它们的含义类似,甚至相互替换。那么它们之间有什么区别?这里我们对这些术语进行介绍。 DEM(数字高程模型,Digital Elevation Model): 定义…

JavaFX安装与使用

前言 最近学习了javafx,开始时在配置环境和导包时遇到了一些麻烦,关于网上很多方法都尝试过了,现在问题都解决了,和大家分享一下我是怎么实现javafx的配置,希望大家可以通过这个方法实现自己的环境配置! 🙈个人主页: 心.c 🔥文章专题:javafx &#x1f49…

5月26号总结

目录 刷题记录(Codeforces Round 947 (Div. 1 Div. 2)前三题) 1.A. Bazoka and Mochas Array 2.B. 378QAQ and Mochas Array 3.C. Chamo and Mochas Array 刷题记录(Codeforces Round 947 (Div. 1 Div. 2)前三题) 1.A. Bazok…

【开源可视化报表设计器】借力实现高效率流程化办公!

进行数字化转型、实现流程化办公,这些应该是目前很多企业都想要实现的目标吧。那么,利用什么样的软件平台可以实现?低代码技术平台拥有可视化界面、灵活操作、好维护等众多优势特点,可以借助低代码技术平台、开源可视化报表设计器…

H5扫描二维码相关实现

H5 Web网页实现扫一扫识别解析二维码,就现在方法的npm包就能实现,在这个过程中使用过html5-qrcode 和 vue3-qr-reader。 1、html5-qrcode的使用 感觉html5-qrcode有点小坑,在使用的时候识别不成功还总是进入到错误回调中出现类似NotFoundExc…

用Prometheus全面监控MySQL服务:一篇文章搞定

简介 在现代应用中,MySQL数据库的性能和稳定性对业务至关重要。有效的监控可以帮助预防问题并优化性能。Prometheus作为一款强大的开源监控系统,结合Grafana的可视化能力,可以提供全面的MySQL监控方案。 设置Prometheus 安装Prometheus 使…

JVM学习-方法区(元空间)

运行时数据区结构图 从线程共享与否角度来看 栈、堆、方法区的交互关系 方法区 《Java虚拟机规范》中明确说明:“尽管所有的方法区在逻辑上属于堆的一部分,但一些简单的实现可能不会选择去进行垃圾收集或者进行压缩”,但对于HotSpotJVM而…

Qt 概述

Qt 背景介绍 什么是 Qt Qt 是⼀个 跨平台的 C 图形⽤⼾界⾯应⽤程序框架 。它为应⽤程序开发者提供了建⽴艺术级图形界⾯所需的所有功能。它是完全⾯向对象的,很容易扩展。Qt 为开发者提供了⼀种基于组件的开发模式,开发者可以通过简单的拖拽和组合来实…