智慧的拼图:聚类分析的启示

news2024/11/16 22:50:02

文章目录

  • 聚类分析简介
  • K-means聚类
    • 什么是K-means聚类?
    • K-means聚类的步骤
    • K-means聚类的特点
    • K-means聚类实例
  • 层次聚类
    • 什么是层次聚类?
    • 层次聚类的类型
    • 层次聚类的步骤
    • 层次聚类的特点
    • 层次聚类实例
  • K-means与层次聚类对比
    • 相同点
    • 不同点
  • 结论
  • 补充

聚类分析是数据挖掘中的一项重要技术,它可以帮助我们发现数据中的模式和结构。本文将介绍两种常用的聚类算法:K-means聚类和层次聚类,并通过实例展示它们在数据分析中的应用。

聚类分析简介

聚类分析是一种无监督学习方法,旨在将数据集中的对象分组,使得同一组内的对象相似度高,而不同组之间的对象相似度低。聚类分析广泛应用于市场细分、社交网络分析、图像分割等领域。

K-means聚类

什么是K-means聚类?

K-means聚类是一种基于中心的聚类算法,它将数据点划分到K个簇中,每个簇由一个质心点代表。算法的目标是最小化簇内点到质心的距离之和。

K-means聚类的步骤

  1. 初始化:随机选择K个数据点作为初始质心。
  2. 分配:将每个数据点分配到最近的质心,形成K个簇。
  3. 更新:重新计算每个簇的质心,通常是簇内所有点的均值。
  4. 迭代:重复分配和更新步骤,直到质心不再显著变化或达到预设迭代次数。

K-means聚类的特点

  • 简单高效,易于实现。
  • 对初始质心选择敏感,可能导致局部最优解。
  • 适用于大规模数据集,但需要预先指定簇的数量。

在这里插入图片描述

K-means聚类实例

假设我们有一组客户数据,包括年龄、年收入等特征。使用K-means聚类,我们可以将客户分为几个具有相似特征的群体,以便于市场细分。
好的,下面是一个完整的聚类分析示例,包括数据生成、预处理、聚类分析、结果解释和可视化。
1. 数据生成

首先,我们生成一个包含多个特征的模拟客户数据集。

import pandas as pd
import numpy as np

# 生成模拟数据
data = {
    '客户ID': ['C001', 'C002', 'C003', 'C004', 'C005', 'C006', 'C007', 'C008', 'C009', 'C010'],
    '性别': ['男', '女', '男', '女', '男', '女', '男', '女', '男', '女'],
    '年龄': [34, 28, 45, 25, 40, 31, 39, 42, 30, 36],
    '年收入': [120, 90, 200, 60, 150, 80, 130, 100, 70, 110],
    '教育水平': ['本科', '大专', '硕士', '本科', '硕士', '大专', '本科', '博士', '硕士', '本科'],
    '购买频率': ['高', '中', '低', '高', '中', '高', '低', '中', '高', '低'],
    '总消费金额': [5000, 3000, 10000, 4000, 6000, 2500, 8000, 7000, 5500, 4500],
    '会员等级': ['银', '铜', '金', '银', '金', '铜', '银', '金', '银', '铜']
}

df = pd.DataFrame(data)
print(df)

2. 数据预处理

接下来,我们对数据进行预处理,包括编码分类变量和标准化数值特征。

from sklearn.preprocessing import StandardScaler, OneHotEncoder
from sklearn.compose import ColumnTransformer

# 定义数值特征和分类特征
numeric_features = ['年龄', '年收入', '总消费金额']
categorical_features = ['性别', '教育水平', '购买频率', '会员等级']

# 创建预处理器
preprocessor = ColumnTransformer(
    transformers=[
        ('num', StandardScaler(), numeric_features),
        ('cat', OneHotEncoder(), categorical_features)
    ])

# 拟合预处理器并转换数据
X = preprocessor.fit_transform(df.drop('客户ID', axis=1))

3. K-means聚类分析

使用K-means算法对数据进行聚类。

from sklearn.cluster import KMeans

# 应用K-means聚类
kmeans = KMeans(n_clusters=3, random_state=42)
kmeans.fit(X)

# 将聚类结果添加到原始DataFrame
df['K-means 聚类标签'] = kmeans.labels_
from sklearn.decomposition import PCA

# 降维以便可视化
pca = PCA(n_components=2)
X_pca = pca.fit_transform(X)

# 绘制散点图
plt.figure(figsize=(8, 6))
for i in range(kmeans.n_clusters):
    plt.scatter(X_pca[kmeans.labels_ == i, 0], X_pca[kmeans.labels_ == i, 1],
                label=f'Cluster {i+1}')

# 绘制质心
plt.scatter(pca.transform(kmeans.cluster_centers_)[:, 0], pca.transform(kmeans.cluster_centers_)[:, 1],
            s=300, c='red', label='Centroids')

plt.title('K-means Clustering')
plt.xlabel('PCA Feature 1')
plt.ylabel('PCA Feature 2')
plt.legend()
plt.show()

层次聚类

什么是层次聚类?

层次聚类是一种不需要预先指定簇数量的聚类方法。它通过逐步合并或分割簇来构建一个层次结构,最终形成一个树状图来展示聚类结果。

层次聚类的类型

  1. 凝聚的层次聚类:从每个数据点作为单独的簇开始,逐步合并最接近的簇对。
  2. 分裂的层次聚类:从所有数据点作为一个簇开始,逐步分割最大的簇。

层次聚类的步骤

  1. 初始化:将每个数据点视为一个单独的簇。
  2. 计算距离:计算所有簇对之间的距离。
  3. 合并最近的簇:合并距离最近的两个簇。
  4. 更新距离矩阵:更新距离矩阵以反映新簇与其他簇之间的距离。
  5. 生成树状图:通过合并过程生成树状图。

在这里插入图片描述

层次聚类的特点

  • 不需要预先指定簇的数量。
  • 可以揭示数据的层次结构。
  • 计算复杂度高,对噪声和异常值敏感。

层次聚类实例

针对上面的例子,我们采用层次聚类来实现

from scipy.cluster.hierarchy import dendrogram, linkage
import matplotlib.pyplot as plt

# 应用层次聚类
Z = linkage(X, method='ward')

# 绘制谱系图
plt.figure(figsize=(8, 6))
dendrogram(Z, orientation='top')
plt.title('Hierarchical Clustering Dendrogram')
plt.xlabel('Sample index')
plt.ylabel('Distance')
plt.show()

K-means与层次聚类对比

K-means聚类和层次聚类是两种常用的聚类方法,它们在概念、算法和应用方面有一些相似之处,但也存在显著的不同点。以下是它们的一些主要异同:

相同点

  1. 聚类目的:两者都旨在将数据集中的对象分组,使得同一组内的对象比其他组的对象更相似。
  2. 无监督学习:K-means聚类和层次聚类都属于无监督学习算法,它们不需要预先标记的训练数据。
  3. 应用领域:它们都可以应用于市场细分、社交网络分析、图像分割、生物信息学等领域。

不同点

  1. 簇的数量

    • K-means聚类:需要预先指定簇的数量(K值)。
    • 层次聚类:不需要预先指定簇的数量,可以通过剪枝树状图来确定簇的数量。
  2. 算法性质

    • K-means聚类:是一种基于中心的聚类方法,通过迭代优化质心位置来聚类。
    • 层次聚类:是一种基于树状图的聚类方法,通过逐步合并或分割簇来构建层次结构。
  3. 算法过程

    • K-means聚类:包括初始化质心、分配数据点到最近的质心、更新质心位置等步骤。
    • 层次聚类:包括计算距离矩阵、合并或分割簇、构建树状图等步骤。
  4. 算法复杂度

    • K-means聚类:通常具有较低的时间复杂度,适合大规模数据集。
    • 层次聚类:时间复杂度较高,尤其是在数据量大时。
  5. 对初始条件的敏感性

    • K-means聚类:对初始质心的选择敏感,可能导致局部最优解。
    • 层次聚类:不受初始质心选择的影响,但对距离度量和数据的尺度敏感。
  6. 结果解释

    • K-means聚类:结果通常更直观,容易解释。
    • 层次聚类:通过树状图展示聚类过程,可以提供更丰富的信息,但可能需要更多的解释工作。
  7. 适用场景

    • K-means聚类:适用于大规模数据集,且簇的形状近似为球形时效果较好。
    • 层次聚类:适用于数据集较小或需要揭示数据层次结构的情况。
  8. 可视化

    • K-means聚类:通常通过散点图展示聚类结果。
    • 层次聚类:通过树状图展示聚类过程和结果。

在选择聚类算法时,应根据数据的特性、规模、形状以及分析的目标来决定使用K-means聚类还是层次聚类。有时,为了获得更全面的洞察,可以同时使用这两种方法进行分析。

结论

K-means聚类和层次聚类都是强大的聚类工具,它们各有优势和局限性。选择哪种聚类方法取决于数据的特性和分析的目标。在实际应用中,我们可能需要尝试多种聚类算法,并结合领域知识来解释聚类结果。聚类分析不仅能够帮助我们理解数据,还能够指导我们做出更明智的决策。随着数据科学的发展,聚类算法将继续在各个领域发挥重要作用。

补充

确定最佳的簇数量是聚类分析中的一个关键问题,尤其是在使用K-means聚类或需要预先指定簇数量的其他聚类算法时。以下是一些常用的方法来帮助确定最佳的簇数量:

  1. 肘部法则(Elbow Method):

    • 将数据集用不同数量的簇进行K-means聚类,然后计算每个模型的总内部平方和(SSE,即簇内误差平方和)。
    • 绘制SSE与簇数量的图,选择SSE下降速率骤减的点作为最佳簇数量。
  2. 轮廓系数(Silhouette Coefficient):

    • 轮廓系数衡量每个数据点聚类的质量,范围从-1到1,值越大表示聚类效果越好。
    • 对于不同的簇数量,计算所有数据点的轮廓系数的平均值,选择平均轮廓系数最大的簇数量。
  3. 戴维森堡丁指数(Davies-Bouldin Index):

    • 这个指数衡量簇的相似度,值越小表示聚类效果越好。
    • 与轮廓系数相反,戴维森堡丁指数越小,表示簇内的相似度越高,簇间的分离度越好。
  4. Calinski-Harabasz指数(也称为方差比指数):

    • 这个指数衡量簇间方差与簇内方差的比率,值越大表示聚类效果越好。
    • 对于不同的簇数量,计算Calinski-Harabasz指数,并选择最大值对应的簇数量。
  5. Gap统计量:

    • Gap统计量比较数据集的聚类分布与一系列参考分布(通常是随机分布)之间的差异。
    • 选择使Gap值最大的簇数量,表示该数量下的聚类效果显著优于随机分布。
  6. 交叉验证:

    • 将数据集分为训练集和测试集,使用训练集进行聚类,然后在测试集上评估聚类效果。
    • 选择在测试集上表现最好的簇数量。
  7. 领域知识:

    • 结合领域专家的知识来确定簇的数量。在某些情况下,簇的数量可能基于业务逻辑或先验知识。
  8. 稳定性分析:

    • 通过在不同的数据子集上运行聚类算法来检查结果的稳定性。
    • 如果在不同的子集上得到的簇分配相似,则可以认为簇的数量是合理的。
  9. 可视化方法:

    • 使用如树状图、散点图等可视化工具来直观评估不同簇数量下的聚类效果。

在实际应用中,可能需要结合多种方法来确定最佳的簇数量。例如,可以先使用肘部法则和轮廓系数来缩小可能的簇数量范围,然后使用领域知识或稳定性分析来做出最终决定。

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

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

相关文章

【永洪BI】1.添加数据源

目录 一、添加文本数据源(EXCEL&TEXT) 二、添加Mysql数据源 一、添加文本数据源(EXCEL&TEXT) 略 二、添加Mysql数据源 1.添加Mysql驱动 2.问题: 问题① 原因: Jar文件上传校验,只允…

类静态方法将python 中把不同脚本融合为一个大脚本 互不影响的方法!首发 以便于维护和扩展。

一般遇见想要方便管理或者集合的大脚本 我们管理很麻烦 用这个方法 无论是什么方面的脚本 都能放在一个大脚本中运行 互不干扰。 将所有功能整合到一个单一的脚本中,而不再依赖外部的.py文件,你可以将rendering.py和sercurity.py中的函数代码直接复制到…

centos7 安装minio

文章目录 下载 Minio 二进制文件配置 Minio将Minio设置成服务 配置Systemd服务启动创建minio变量文件:/etc/default/minio创建Service File:/etc/systemd/system/minio.service设置开启自启动 Nginx反向代理nginx配置 下载 Minio 二进制文件 cd /usr/lo…

VLM系列文章6-Cambrian-1

以视觉为中心的多模态大模型Cambrian-1,主要考虑的是MLLM中视觉模型的影响。 1、评估 LLM 还是 MLLM?:我们在使用 23 种不同的视觉主干训练的 MLLM 中比较了视觉禁用和视觉启用设置之间的性能。我们的研究结果表明,MMMU 和 AI2D 等…

有没有视频ai换脸的软件?

AI视频生成:小说文案智能分镜智能识别角色和场景批量Ai绘图自动配音添加音乐一键合成视频百万播放量https://aitools.jurilu.com/ 发现大家对AI换脸都非常感兴趣,AI换脸一般的步骤是:上传自己的照片→选择不同的风格→制作出被替换的GIF图或视…

安卓修改logo与开机动画后不显示问题解决

问题描述 替换安卓logo与开机动画bootanimation.zip画面是花的或黑的 修复步骤 手动替换安卓framework中的开机logo后显示异常排查 在电脑上打开logo图片, 查看分辨率, 再adb shell wm size查看设备的分辨率,要求二者一致.电脑上右键点击logo图片,查看属性,要确保它的位深度…

数据结构与算法 - 二分查找

一、二分查找 二分查找算法也称折半查找,是一种非常高效的工作于有序数组的查找算法。 时间复杂度 最坏情况:O(log n)最好情况:如果待查找元素恰好在数组中央,只需要循环一次O(1) 空间复杂度 递归->O(log n)&a…

暑期C++ printf和scanf的平替

有任何不懂的问题可以评论区留言&#xff0c;能力范围内都会一一回答 C中也有专门的输入和输出的方法 首先我们需要一个头文件&#xff0c;也就是#include<iostream> 然后根据我们命名空间的知识可知这个地方如果我们要使用必须先展开 可以全部展开比如using namespa…

K8s大模型算力调度策略的深度解析

随着大数据和人工智能技术的飞速发展&#xff0c;Kubernetes&#xff08;简称K8s&#xff09;作为容器编排的领军者&#xff0c;在支撑大规模模型训练和推理方面扮演着越来越重要的角色。在大模型算力的调度过程中&#xff0c;如何高效、合理地分配和管理资源成为了一个亟待解决…

实验2-5-1 求排列数

本题要求实现一个计算阶乘的简单函数&#xff0c;使得可以利用该函数&#xff0c;根据公式 算出从n个不同元素中取出m个元素&#xff08;0<m≤n&#xff09;的排列数。 函数接口定义&#xff1a; double fact( int n );其中n是用户传入的参数&#xff0c;函数返回n的阶乘。…

数据分析概要【数据分析---偏企业】

各位大佬好 &#xff0c;这里是阿川的博客&#xff0c;祝您变得更强 个人主页&#xff1a;在线OJ的阿川 大佬的支持和鼓励&#xff0c;将是我成长路上最大的动力 阿川水平有限&#xff0c;如有错误&#xff0c;欢迎大佬指正 数据分析概要前 必看 Python 初阶 Python–语言基础…

[数据集][目标检测]易拉罐底部缺陷检测数据集VOC+YOLO格式1122张5类别

数据集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路径的txt文件&#xff0c;仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数)&#xff1a;1122 标注数量(xml文件个数)&#xff1a;1122 标注数量(txt文件个数)&#xff1a;1122 标注…

企业获客重要途径-大数据获客系统

企业获客的重要途径之一是通过大数据获客系统。这一系统利用大数据技术和分析方法&#xff0c;帮助企业更精准地获取客户&#xff0c;提高市场营销的效率和效果。 所以整理了以下是大数据获客系统作为企业获客重要途径的详细阐述&#xff1a; 一、大数据获客系统的定义与功能…

永磁同步电机谐波抑制算法(8)——基于自适应带宽扩张状态观测器的采样电流偏置误差补偿办法

1.前言 在上一期内容中&#xff0c;已经介绍了采样电流的偏置误差the current measurement offset error /CMOE&#xff08;这个采样电流偏置误差通常认为是直流DC偏置&#xff0c;所以其在dq电流中会造成一次谐波&#xff09;。如果没看过上一期内容&#xff0c;那先需要补一…

SSRF-labs-master靶场

目录 file_get_content.php sql_connect.php download.php dns-spoofing.php dns_rebinding.php 访问链接 http://127.0.0.1/SSRF/# file_get_content.php 在编程语言中&#xff0c;有一些函数可以获取本地保存文件的内容。这些功能可能能够从远程URL以及本地文件 如果没…

C++第二十九弹---C++继承机制深度剖析(上)

✨个人主页&#xff1a; 熬夜学编程的小林 &#x1f497;系列专栏&#xff1a; 【C语言详解】 【数据结构详解】【C详解】 目录 1.继承的概念及定义 1.1继承的概念 1.2 继承定义 1.2.1定义格式 1.2.2继承关系和访问限定符 1.2.3继承基类成员访问方式的变化 2.基类和派生…

常见的手电筒芯片功能模式选型 单路双路可用

常见的手电筒芯片如下 单双路输出 带充电功能和不带充电功能的 外围结构简单、无需多余的元器件 搜恒森宇电子了解更多相关功能&#xff01; 首页

Spring随笔

Spring随笔 BeanFactory和ApplictionContextbean增强 AutowiredAnnotationBeanPostProcessor工厂增强 BeanFactory和ApplictionContext BeanFactory装载了bean实例&#xff0c;一个容器&#xff0c;提供了对bean的增删改查 ApplictionContext继承了factory&#xff0c;除此之外…

MyBatis基础配置

一、M y B a t i s 配 置 文 件 1.为什么学习MyBatis配置文件 功能&#xff1a;构建SqlSessionFactory的依据。 意义&#xff1a;MyBatis最为核心的内容&#xff0c;对MyBatis的使用影响很大。 注意&#xff1a;配置文件的层次顺序不能颠倒&#xff0c;一旦颠倒会出现异常。 …

NLP与搜广推常见面试问题

1 auc指标 AUC的两种意义 一个是ROC曲线的面积另外一个是统计意义。从统计学角度理解&#xff0c;AUC等于随机挑选一个正样本和负样本时&#xff0c;模型对正样本的预测分数大于负样本的预测分数的概率。下图为搜广推场景下的一个计算auc的例子