【无监督学习】层次聚类步骤及matlab实现

层次聚类

    • (四)层次聚类
      • 1.算法步骤
      • 2.MATLAB 实现
      • 参考资料

(四)层次聚类

层次聚类是一种通过逐层合并或分裂数据点构建树状结构(树状图,Dendrogram)的聚类方法。它分为两种类型:

  • 凝聚层次聚类(Agglomerative Hierarchical Clustering):这是最常用的层次聚类方法。开始时每个数据点都被视为自己的簇,然后算法重复执行以下步骤直到所有点被合并为一个簇:
    • 找出最近的两个簇。
    • 将它们合并成一个新的簇。
    • 重新计算新簇与其他簇之间的距离。
  • 分裂层次聚类(Divisive Hierarchical Clustering):与凝聚方法相反,这种较少使用的方法从整个数据集作为一个单一的簇开始,然后逐步分裂簇,直到每个数据点成为独立的簇为止。
    • 商业应用场景:客户分群、市场细分、供应链优化等。

分层聚类分析(Hierarchical Clustering Analysis)生成的树状图,也称为树形图(Dendrogram),是展示数据点或簇之间层次关系的一种可视化方式。通过树状图,可以直观地看出哪些数据点或簇之间的相似度更高,以及如何逐步合并形成更大的簇。下面是一些解读树状图的关键点:
分层聚类分析树状图

  1. 树状图的基本结构

    • 垂直轴:通常表示距离或相似性度量。在树状图中,分支的长度代表了合并的数据簇之间的距离。越长的分支意味着簇间距离更大,即这些簇中的数据点彼此间的相似度较低。
    • 水平轴:代表参与聚类的数据点或者最终形成的簇。每个叶子节点对应一个原始数据点,而内部节点则代表由其子节点所构成的簇。
  2. 簇的形成过程

    • 树状图从底部开始,每个数据点最初都是单独的一个簇。随着向上移动,距离较近的簇会逐渐合并成新的簇,这一过程持续进行直到所有数据点都被合并到一个单一的簇中。这个自底向上的过程被称为凝聚层次聚类。
  3. 如何决定簇的数量

    • 切割树状图:通过在垂直方向上设定一个阈值来“切割”树状图,可以确定簇的数量。例如,在树状图上画一条水平线,这条线与多少个垂直线段相交就决定了将数据分成多少个簇。
    • 观察大跳跃:有时可以通过观察垂直轴上的较大跳跃(即较长的分支)来判断合理的切割点,因为较大的跳跃意味着显著不同的簇。

1.算法步骤

开始
数据标准化
计算距离矩阵
合并最近的两个簇
更新距离矩阵
是否剩一个簇?
输出树状图
划分聚类
结束
  1. 数据标准化

    • 目的:消除量纲差异,确保特征权重一致;
    • 方法:Z-score 标准化、最大-最小归一化;
    • 公式(Z-score): x s c a l e d = x − μ σ x_{scaled}=\frac{x−μ}{σ} xscaled=σxμ
  2. 计算距离矩阵

    • 输入:标准化后的数据矩阵 X ∈ R n × m X∈R^{n×m} XRn×m n n n 为样本数, m m m 为特征数;
    • 输出:对称矩阵 D ∈ R n × n D∈R^{n×n} DRn×n,表示样本间距离;
    • 距离度量
      • 欧氏距离(默认): d i j = ∑ k = 1 m ( x i k − x j k ) 2 d_{ij}=\sqrt{\sum_{k=1}^m (x_{ik}-x_{jk})^2} dij=k=1m(xikxjk)2
      • 曼哈顿距离、余弦相似度等。
  3. 合并最近的两个簇

    • 链接方法(Linkage Criterion)
      • 单链接(Single):两簇中最近样本的距离;
      • 全链接(Complete):两簇中最远样本的距离;
      • 平均链接(Average):两簇所有样本对的平均距离;
      • Ward方法:合并后簇的方差增量最小(适合商业数据)。
  4. 更新距离矩阵

    • 将合并后的新簇与其他簇的距离重新计算,更新矩阵 D D D
  5. 终止条件

    • 重复步骤3-4,直到所有样本合并为一个簇。
  6. 生成树状图

    • 树状图(Dendrogram):可视化合并过程,横轴为样本,纵轴为合并距离。
    • 截断阈值:通过树状图高度或业务需求确定最终簇数。

2.MATLAB 实现

层次聚类实现用户价值分层结果①
层次聚类实现用户价值分层结果②
层次聚类实现用户价值分层结果③

%% 用户价值分层,绿色为高价值、红色为中价值、蓝色为低价值
clc;        % 清空命令行窗口
clear;      % 清除工作区变量
close all;  % 关闭所有图形窗口%% ====================== 生成模拟客户数据(200个样本) ======================
rng(42); % 固定随机种子,确保每次运行结果可复现
n_samples = 200; % 总样本数% 特征1:年消费金额(万元)—— 高价值客户消费更高
% 前100个样本为高价值客户,消费金额服从 N(3, 0.5) 分布
% 后100个样本为低价值客户,消费金额服从 N(1, 0.3) 分布
monetary = [abs(randn(n_samples/2,1)*0.5 + 3);   % 高价值组abs(randn(n_samples/2,1)*0.3 + 1)];  % 低价值组% 特征2:购买频率(次/年)—— 高价值客户更活跃
% 高价值组频率服从 N(10, 2),低价值组服从 N(5, 3)
frequency = [abs(randn(n_samples/2,1)*2 + 10); abs(randn(n_samples/2,1)*3 + 5)];% 特征3:最近消费时间(天)—— 高价值客户更近期消费
% 高价值组最近消费时间服从 N(30, 30),低价值组服从 N(90, 60)
recency = [abs(randn(n_samples/2,1)*30 + 30); abs(randn(n_samples/2,1)*60 + 90)];% 合并特征矩阵:每行代表一个客户,三列分别为消费金额、频率、最近时间
X = [monetary, frequency, recency]; % 真实标签(仅用于验证,实际聚类无监督,不需要标签)
labels = [ones(n_samples/2,1);   % 前100个样本标签为1(高价值)2*ones(n_samples/2,1)]; % 后100个样本标签为2(低价值)%% ====================== 数据标准化(Z-score) ======================
% 目的:消除量纲差异,使各特征均值为0,标准差为1
X_scaled = zscore(X); % zscore函数自动计算每列的均值和标准差%% ====================== 层次聚类(使用Ward方法) ======================
% 步骤1:计算样本间距离矩阵
% pdist计算欧氏距离,返回压缩格式的距离向量(上三角部分)
D = pdist(X_scaled, 'euclidean'); % 步骤2:构建层次聚类树(链接矩阵Z)
% linkage函数使用Ward方法(最小化簇内方差)进行层次聚类
% Z矩阵格式:每行代表一次合并,列依次为合并簇1、簇2、距离、新簇包含的样本数
Z = linkage(D, 'ward'); %% ====================== 手动划分聚类(3个簇) ======================
n = size(X_scaled, 1); % 样本数量(200)
k = 3; % 目标簇数
num_merges = n - k; % 需要合并的次数(200-3=197次)max_clusters = 2 * n - 1; % 最大可能簇数(初始n个簇 + 每次合并新增1个簇)
cluster_members = cell(1, max_clusters); % 存储每个簇的成员索引% 初始化:每个样本为一个独立簇
for i = 1:ncluster_members{i} = i; % 第i个簇仅包含样本i
end% 逐次合并簇(共197次)
for i = 1:num_mergesc1 = Z(i, 1); % 当前合并的第一个簇索引(来自Z矩阵第i行)c2 = Z(i, 2); % 当前合并的第二个簇索引new_cluster_idx = n + i; % 新簇的索引(从n+1开始递增)% 合并簇成员:将c1和c2的成员合并到新簇cluster_members{new_cluster_idx} = [cluster_members{c1}, cluster_members{c2}];% 清空原簇(避免重复使用)cluster_members{c1} = [];cluster_members{c2} = [];
end% 收集最终的k个簇(非空簇)
final_clusters = {}; % 存储最终簇的成员列表
for j = 1:length(cluster_members)if ~isempty(cluster_members{j})final_clusters{end+1} = cluster_members{j}; % 添加非空簇end
end% 为每个样本分配簇标签(1到k)
clusters = zeros(n, 1); % 初始化标签向量
for cluster_idx = 1:length(final_clusters)members = final_clusters{cluster_idx}; % 当前簇的成员索引clusters(members) = cluster_idx; % 分配簇标签
end%% ====================== 可视化与业务分析 ======================
% 绘制树状图(Dendrogram)
figure;
dendrogram(Z); % 显示层次聚类过程
title('客户分群树状图');
xlabel('样本索引');
ylabel('合并距离');% 绘制3D散点图展示聚类结果
figure;
scatter3(X_scaled(:,1), X_scaled(:,2), X_scaled(:,3), 50, clusters, 'filled');
xlabel('标准化消费金额');
ylabel('标准化购买频率');
zlabel('标准化最近消费时间');
title('客户价值分层结果');
colormap(jet); % 使用jet颜色映射区分簇% 统计各簇特征均值和标准差
% grpstats按簇分组计算统计量
cluster_stats = grpstats(X, clusters, {'mean', 'std'});
disp('各簇统计特征:');
disp(['     [Mean_Monetary] ','[Mean_Frequency] ','[Mean_Recency]']);
disp(['高价值组:',num2str(cluster_stats(2,:))]);
disp(['中价值组:',num2str(cluster_stats(3,:))]);
disp(['低价值组:',num2str(cluster_stats(1,:))]);% 输出业务策略
fprintf('=== 业务策略 ===\n');
fprintf('簇1(高价值): 消费金额高、频率高、近期活跃 → 提供VIP服务与专属折扣\n');
fprintf('簇2(中价值): 消费中等 → 推送促销活动提升复购\n');
fprintf('簇3(低价值): 消费低且久未活跃 → 发送唤醒优惠券\n');

参考资料

[1] 层次聚类的基本原理_哔哩哔哩_bilibili
[2] 层次聚类的树状图如何看?序列分析和回归分析如何结合?哔哩哔哩_bilibili

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

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

相关文章

02 HarmonyOS Next仪表盘案例详解(一):基础篇

温馨提示:本篇博客的详细代码已发布到 git : https://gitcode.com/nutpi/HarmonyosNext 可以下载运行哦! 文章目录 1. 项目概述2. 技术架构2.1 文件结构2.2 ArkTS 语言特性装饰器的使用 3. 数据结构设计3.1 接口定义3.2 数据初始化 4. 生命周期与页面路由…

微信小程序接入deepseek

先上效果 话不多说&#xff0c;直接上代码&#xff08;本人用的hbuilder Xuniapp&#xff09; <template><view class"container"><!-- 聊天内容区域 --><scroll-view class"chat-list" scroll-y :scroll-top"scrollTop":…

istio入门到精通-2

上部分讲到了hosts[*] 匹配所有的微服务&#xff0c;这部分细化一下 在 Istio 的 VirtualService 配置中&#xff0c;hosts 字段用于指定该虚拟服务适用的 目标主机或域名。如果使用具体的域名&#xff08;如 example.com&#xff09;&#xff0c;则只有请求的主机 域名与 exa…

6. PromQL的metric name(在node exporter复制下来交给AI解释的)

目录 前言&#xff1a; Go 运行时指标&#xff1a; Go 内存统计指标&#xff1a; CPU 指标&#xff1a; 内存指标&#xff1a; 磁盘指标&#xff1a; 网络指标&#xff1a; 系统指标&#xff1a; 前言&#xff1a; 写这个得目的是为了后续方便查询&#xff0c;因为在pro…

图像形成与计算机视觉基础

1. 图像形成的基本原理 图像形成是物理世界与传感器&#xff08;如胶片、CCD/CMOS&#xff09;交互的过程&#xff0c;核心是光线的传播与记录。 1.1 直接放置胶片模型 物理原理&#xff1a;物体表面反射的光线直接照射到胶片上&#xff0c;但无任何遮挡或聚焦机制。 问题&a…

Dockerfile概述及编辑

文章目录 Docker 镜像原理操作系统组成部分Docker 镜像原理镜像制作 Dockerfile概念及作用Dockerfile 概念Dockerfile 作用 Dockerfile关键字 案例要求实现步骤 Docker 镜像原理 操作系统组成部分 操作系统组成&#xff1a;进程调度子系统、进程通信子系统、内存管理子系统、…

CES Asia 2025:AR/VR/XR论坛峰会备受瞩目

CES Asia 2025第七届亚洲消费电子技术贸易展&#xff08;赛逸展&#xff09;将在首都北京心盛大举行。作为亚洲极具影响力的消费电子技术展会&#xff0c;此次盛会以“科技重塑生活&#xff0c;创新定义未来”为主题&#xff0c;预计将吸引全球500展商、100,000专业观众参与&am…

【Java线程基础操作详解】

Java线程基础操作详解 前言1. 线程创建1.1 继承Thread类1.2 实现Runnable接口1.3 匿名内部类1.4 lambda表达式 2. 线程中断3. 线程等待4. 线程休眠 前言 在Java编程里&#xff0c;线程是实现多任务处理的关键概念。本文会详细讲解Java中线程的创建、中断、等待以及休眠等操作&…

qt 播放pcm音频

一、获取PCM音频 ffmpeg -i input.mp3 -acodec pcm_s16le -ar 44100 -ac 2 -f s16le output.pcm -acodec pcm_s16le&#xff1a;指定16位小端PCM编码格式&#xff08;兼容性最佳&#xff09;-ar 44100&#xff1a;设置采样率为CD标准44.1kHz&#xff08;可替换为16000/8000等&a…

python实现的可爱卸载动画

在逛掘金时&#xff0c;掘金用户在B站看到的灵感进行的一个卸载窗口的动画效果的实用案例。人类是一种不断在学习的动物&#xff0c;并且是一种模仿能力学习能里比较强的动物。我这里是第三波的学习实践者咯&#xff01; 相对VUE构建动画效果窗口&#xff0c;我更加喜欢用pytho…

出现FullGC的排查思路

一、明确Full GC的触发原因 根据多篇资料&#xff0c;Full GC的触发条件主要包括&#xff1a; 直接调用System.gc()&#xff1a;代码或第三方库&#xff08;如jxl组件&#xff09;可能显式触发。老年代空间不足&#xff1a;大对象直接进入老年代、Minor GC后存活对象过多导致…

【Python运维】 Python与日志管理:构建高效的集中式日志收集与分析系统

《Python OpenCV从菜鸟到高手》带你进入图像处理与计算机视觉的大门! 解锁Python编程的无限可能:《奇妙的Python》带你漫游代码世界 在当今信息化时代,日志数据成为企业监控系统健康、优化性能和保障安全的重要资源。传统的分散式日志管理方式不仅效率低下,而且难以应对大…

给没有登录认证的web应用添加登录认证(openresty lua实现)

这阵子不是deepseek火么&#xff1f;我也折腾了下本地部署&#xff0c;ollama、vllm、llama.cpp都弄了下&#xff0c;webui也用了几个&#xff0c;发现nextjs-ollama-llm-ui小巧方便&#xff0c;挺适合个人使用的。如果放在网上供多人使用的话&#xff0c;得接入登录认证才好&a…

静态成员不依赖于特定对象的内容

静态成员不依赖于特定对象的内容这一概念主要涉及到面向对象编程中的静态成员&#xff08;包括静态变量和静态方法&#xff09;。为了详细解释这一点&#xff0c;我们需要从以下几个方面来理解&#xff1a; 1. 面向对象编程基础 在面向对象编程中&#xff0c;类是对象的蓝图&…

SQL Server查询计划操作符(7.3)——查询计划相关操作符(9)

7.3. 查询计划相关操作符 78)Repartition Streams:该操作符消费多个输入流并产生多个输出流。期间,记录内容与格式保持不变。如果查询优化器使用一个位图过滤(bitmap filter),则输出流中的数据行数将会减少。一个输入流的每行记录被放入一个输出流。如果该操作符保留顺序…

【Java学习】异常

一、异常的处理过程 异常类的似复刻变量被throw时&#xff0c;会立即中止当前所在的这层方法&#xff0c;即当层方法里throw异常类似复刻变量之后的语句就不会执行了&#xff0c;如果throw异常语句在当层方法中被try{}包裹&#xff0c;则中止就先发生被包裹在了try{}层&#xf…

政务信息化项目审计全解析:核心重点与区域实践差异化破局

随着数字化转型加速&#xff0c;政务信息化项目审计已成为提升政府治理效能的关键环节。本文系统梳理审计核心维度&#xff0c;并结合多地差异化实践案例&#xff0c;揭示如何通过精准审计赋能智慧政务建设。 一、审计八大核心维度&#xff1a;穿透信息化项目全生命周期 1. 项…

HTML第四节

一.复合选择器 1.后代选择器 注&#xff1a;1.后代选择器会选中后代所有的要选择的标签 2.儿子选择器 3.并集选择器 注&#xff1a;1.注意换行&#xff0c;同时选中多种标签 4.交集选择器 注&#xff1a;1.标签选择器放在最前面&#xff0c;例如放在类选择器的前面 2.两个选择…

启智平台华为昇腾910B使用MS-Swift微调Janus-Pro-7/1B

最近想要微调一下DeepSeek出品的Janus多模态大模型 利用启智平台的昇腾910B国产计算卡进行大模型的微调 查看了一下MS-Swift支持了Janus模型的微调&#xff0c;LLamafactory好像暂时还不支持该模型的微调 看到了MS-Swift有单独对昇腾的支持&#xff0c;因此首先要安装swift&…

香港电讯CE2.0网络全面升级,100G服务支援企业关键应用

随着人工智能&#xff08;AI&#xff09;和新兴科技的应用日益俱增&#xff0c;安全可靠、高速稳定的网络对现今企业而言尤关重要。香港电讯作为香港及大湾区企业信赖的科技解决方案提供者&#xff0c;一直致力为企业客户提供面向未来的网络方案&#xff0c;为不同行业的网络需…