R语言聚类分析实战:从K-means到层次聚类与DBSCAN
2026/9/15 16:44:32 网站建设 项目流程

1. 聚类分析是什么:概念、适用场景与算法地图

1.1 从“物以类聚”说起:聚类到底解决什么问题

之前写过数据分析和数据预处理的总结,这篇接着往后捋。做数据分析的同学迟早会遇到一类需求:没有人给你标签,没有人告诉你这些样本应该分成几组,但你明确知道“它们之间不对劲,应该不是同一类东西”。这时候就需要聚类分析。

聚类分析属于典型的无监督学习方法。监督学习里有y,也就是正确答案,模型学的是x到y的映射;聚类没有y,数据只有一堆特征,算法要做的事情是把相似的对象归到同一个簇里,让“组内差异尽量小,组间差异尽量大”。一句话概括:聚类就是让相似的样本自己抱团。

这个思路听着简单,实际应用非常广。电商做用户分群,把消费行为相似的客户分成几类,再针对每一类做差异化运营;医学研究把基因表达谱相似的病人分组,看不同组之间预后是否有差异,也就是热词里提到的转录组数据分析场景;风控领域把异常交易模式单独挑出来;还有图像分割、文档归类、推荐系统冷启动,背后都能看到聚类的影子。

我见过不少刚入行的朋友对聚类有个错觉,觉得它就是个“自动分类”工具,把数据丢进去就能拿到分组结果。实际上聚类分析更像是一个探索性工具,它帮你发现数据里潜在的结构,但最终这些分组有没有业务意义、能不能解释得通,还是要靠人来判断。

1.2 三大家族算法:K-means、层次聚类、DBSCAN

R语言里能实现的聚类算法非常多,但日常用得最多的就是三大类。

第一类是划分式聚类,典型代表是K-means。它的思路是:提前指定要分成K组,随机初始化K个中心点,反复迭代直到收敛。K-means最大的优势是快,数据量大一点也能扛得住,几百万行样本跑起来都很轻松。缺点是必须提前确定K值,而且对簇的形状有隐含假设,比较适合处理“球形簇”,遇到长条形、月牙形这种不规则分布就不太行了。

第二类是层次聚类,代表方法是hclust函数对应的凝聚式层次聚类。它不需要预先指定K,算法从每个样本单独成簇开始,一层一层往上合并,最终生成一棵树状图(dendrogram),你看完树状图再决定从哪里“切一刀”。这对探索性分析非常友好,我第一次跑层次聚类看树状图的时候,对“数据自己会说话”这句话有了很直观的感受。缺点也很明显:复杂度高,样本量一大就跑不动,几千个样本还能接受,几十万样本基本就是灾难。

第三类是密度聚类,代表是DBSCAN。它根据样本的紧密程度来划簇,能识别出任意形状的簇,还能自动把离群的孤立点标成噪声点。这个能力K-means和层次聚类都没有,遇到带大量噪声的数据或者形状不规则的簇,DBSCAN是首选。缺点是需要调两个参数,而且对参数变化很敏感。

三个算法的核心差异我用一张表总结过,方便对比:

算法是否需指定K簇形状假设噪声处理大数据量表现
K-means需要偏球形不擅长优秀
层次聚类不需要无特定假设一般
DBSCAN不需要任意形状自动标记较好

1.3 为什么用R语言做聚类分析

很多人会纠结一个问题:做聚类到底用SPSS、Python还是R?我个人的答案是,如果只是点几个按钮出个结果,SPSS确实方便,尤其是课程作业和论文场景;但如果你想把聚类分析真正用起来,反复比较不同方案、灵活调整可视化输出,R语言的生态优势就非常明显。

R语言里做聚类相关的包几乎是“一站式配齐”的。基础包stats里就有kmeans、hclust、dist、cutree这些核心函数;factoextra包提供fviz_cluster、fviz_nbclust、fviz_dend等可视化函数,画出来的图直接能进论文;cluster包提供silhouette轮廓系数、pam、agnes等算法;dbscan包实现了DBSCAN和HDBSCAN;还有pheatmap做热图展示。这套组合拳打下来,从数据处理、聚类计算到结果可视化都覆盖了。

另外R语言社区里做生物信息、医学统计的人特别多,如果你后续要接触转录组测序数据、微阵列数据,R基本上是绕不开的工具。这也是为什么“R语言医学数据分析”“转录组数据分析”这类搜索词会跟聚类分析高频绑定出现。

2. 环境准备与数据预处理:聚类前必须做好的事

2.1 R与RStudio的环境搭建与常用包安装

如果你还没有装好R环境,先把这一步解决。我遇到过很多初学者卡在环境安装上,其实并不复杂。R语言本体去镜像站下载对应操作系统的安装包就可以,Windows用户直接下载.exe文件一路Next,macOS用户下载.pkg文件安装。装好R之后再装RStudio,它是一个集成开发环境(IDE),写代码、看变量、画图、看历史记录都非常方便,强烈建议装。

装完RStudio之后,在控制台运行install.packages()安装这次用到的包:

install.packages(c("tidyverse", "factoextra", "cluster", "dbscan", "pheatmap"))

tidyverse是数据处理的一套工具集,包含dplyr、ggplot2、tidyr等核心包,做数据清洗和可视化都靠它;factoextra专门用于聚类和PCA结果的可视化;cluster包里包含了silhouette、pam、agnes等经典聚类函数;dbscan包就是做密度聚类的;pheatmap是出版级热图绘制工具。

安装完成后加载一下,验证环境没问题:

library(tidyverse) library(factoextra) library(cluster) library(dbscan) library(pheatmap)

2.2 数据预处理的关键步骤:标准化、缺失值与异常值

很多教程上来就讲算法原理和函数参数,但我必须提醒一句:聚类分析的结果,很大程度在跑算法之前就已经被数据质量决定了。

第一个要注意的问题是标准化。K-means和层次聚类都是基于距离计算的,而距离计算时,数值范围大的变量会主导整个距离的计算结果。举个例子,你要对一批商品做聚类,价格变量在几十到几千的范围内波动,销量变量在几百到几万的范围内波动,如果不做标准化,距离几乎完全由销量决定,价格变量的影响微乎其微。这显然不是一个合理的聚类逻辑。

R语言里标准化就一行代码:

df_scaled <- scale(df)

scale函数默认对每一列做z-score标准化,也就是减去均值除以标准差,让每个变量都变成均值为0、方差为1的形态。这样各个变量在距离计算里的地位就是平等的。

第二个问题是缺失值处理。大部分聚类函数不允许输入数据里有NA,碰到缺失值要么直接删掉那一行,要么用均值/中位数填充。具体用哪种方式要看缺失比例和数据业务含义,缺失比例不高(比如5%以下)直接删除影响不大;缺失比例高就建议先做缺失值插补。

第三个问题是异常值。K-means被异常值干扰得很厉害,因为它的聚类中心是均值计算的,一个极端值就能把中心点拉跑。层次聚类对异常值也敏感,DBSCAN反而不怕,因为它天然就把孤立点标成噪声。所以如果你打算用K-means,先画个箱线图或散点图看看有没有明显的离群点,有的话考虑先做截尾处理或剔除。

2.3 距离度量怎么选:欧氏距离只是默认选项,不是唯一选项

聚类靠的是“相似度”或“距离”来判断样本之间的关系,所以距离度量方式的选择直接影响聚类结果。stats包里的dist函数支持的度量方法有euclidean、manhattan、maximum、canberra、binary、minkowski等,默认是欧氏距离。

什么时候该换?如果你的数据是连续型数值变量,且经过标准化,欧氏距离通常够用;如果数据有量纲差异且无法标准化,曼哈顿距离往往更稳健;如果你做的是文本或用户行为等稀疏高维数据,可以考虑余弦相似度(R里需要自己计算);binary距离则适用于全是0/1的二值数据。

# 欧氏距离,最常用 d_euclidean <- dist(df_scaled, method = "euclidean") # 曼哈顿距离,对异常值更稳健 d_manhattan <- dist(df_scaled, method = "manhattan")

一个小技巧:拿到真实数据后,可以用不同距离度量跑一遍层次聚类,对比树状图的结构差异,感受一下不同距离选择对结果的影响。很多教科书只教你函数怎么用,不教你从结果反推数据特性,这一点我觉得挺重要的。

3. K-means聚类实操:从原理到完整案例

3.1 K-means到底在干什么

先花点时间把K-means的原理讲透,因为这个算法搞明白了,后面看其他算法会顺畅很多。

K-means的迭代过程可以用一句话概括:随机选中心,样本归队,重算中心,重复直到稳定。具体展开是这样:

第一步,确定K值,也就是打算把数据分成几簇。第二步,随机从数据中选K个点作为初始聚类中心。第三步,计算每个样本到K个中心的距离,把样本归到最近的中心点所在的簇。第四步,重新计算每个簇内所有样本的均值,用这个均值作为新的中心点。第五步,重复第三步和第四步,直到中心点不再变化或者达到设定的最大迭代次数。

这个算法在R里运行特别快,核心代码就一行:

km_result <- kmeans(df_scaled, centers = 3, nstart = 25)

这里的nstart参数是用来解决“随机初始中心导致结果不稳定”问题的。算法本身对初始中心点敏感,不同的初始值可能收敛到不同的局部最优解。设置nstart = 25表示算法会从25组不同的随机初始中心出发,跑25遍,最后返回组内平方和最小的那个结果。这个参数在实际使用中建议设置25到50之间,计算量不大但稳定性提升明显。

3.2 用iris数据集跑一个完整的K-means案例

用鸢尾花数据集iris来演示,这个数据集几乎是R语言的“Hello World”级案例,包含150个样本,每个样本有花萼长度、花萼宽度、花瓣长度、花瓣宽度四个特征,按物种分成三类。

# 查看数据结构 str(iris) # 提取数值型特征,排除标签列 df <- iris[, 1:4] # 标准化 df_scaled <- scale(df) # K-means聚类,设定分为3簇 set.seed(123) km_result <- kmeans(df_scaled, centers = 3, nstart = 25) # 查看聚类结果 km_result$size # 每簇的样本数 km_result$centers # 每个簇的中心点(标准化后的坐标) km_result$cluster # 每个样本的簇标签 # 将聚类结果与真实标签做交叉对比 table(km_result$cluster, iris$Species)

这里set.seed(123)也很关键。K-means有随机性,设置随机种子可以让结果可复现。我和很多同行交流过,大家一致认为做数据分析一定要养成设置随机种子的好习惯,否则今天跑出一个结果、明天跑出另一个结果,最后自己都没法解释。

table函数输出的交叉表可以直接看到聚类结果和真实物种标签的对应关系。如果聚类效果好,绝大多数样本应该被归到一起,比如簇1对应setosa,簇2对应versicolor,簇3对应virginica。这样你就知道算法在没有标签的情况下,仅凭4个特征就把三种鸢尾花基本分开了。

3.3 到底怎么选K:肘部法则、轮廓系数与间隙统计量

前面说了K-means必须先指定K,那K怎么选?这是K-means实操里最大的坑。我见过很多人直接拍脑袋定一个数字,这种做法不太推荐,还是用数据说话比较靠谱。

最常见的方法是肘部法则(Elbow Method)。它的逻辑是:随着K增大,组内平方和(within-cluster sum of squares,WSS)一定会下降,因为簇越多,每个样本离自己的簇中心越近。但K增加到一定程度后,WSS下降的幅度会明显变缓,这个拐点就是“肘部”,也就是相对最优的K值。

factoextra包提供了现成函数:

fviz_nbclust(df_scaled, kmeans, method = "wss")

输出的图会展示K从1到10对应的WSS变化曲线,找到曲线“拐弯”的地方。注意这个拐点有时候不是特别明显,需要结合业务判断。

另一个常用方法是轮廓系数(Silhouette Coefficient)。它衡量的是每个样本与自身簇内其他样本的相似度,以及与其他簇样本的差异度。轮廓系数的范围是-1到1,越接近1说明聚类效果越好。选择K时,找到平均轮廓系数最大的那个K。

fviz_nbclust(df_scaled, kmeans, method = "silhouette")

还可以用cluster包里的clusGap函数计算间隙统计量(Gap Statistic),它会通过比较真实数据与均匀分布的参考数据来选择K,原理上更严谨一些:

set.seed(123) gap_stat <- clusGap(df_scaled, FUN = kmeans, K.max = 10, B = 50) fviz_gap_stat(gap_stat)

实操中我的经验是,把肘部法则和轮廓系数结合起来看,两个方法给出的K一致就非常稳,不一致就选轮廓系数推荐的那个。如果业务上有特殊要求,比如运营团队明确说我们要分4组用户分别投放不同策略,K也可以按照业务需求来定——聚类分析本质上服务于业务解读,不要被纯算法指标绑架。

3.4 可视化输出与聚类结果解读

聚类做完不画图等于白做。K-means的可视化有两个层级:第一个层级是看样本在降维空间里的分布和分簇情况,第二个层级是分析每个簇的特征画像。

factoextra包的fviz_cluster函数可以一键完成第一种可视化:

fviz_cluster(km_result, data = df_scaled, palette = "Set2", ellipse = TRUE, ellipse.type = "norm")

这个函数默认会用主成分分析(PCA)把高维数据降到二维平面,然后绘制每个样本的散点位置,用不同颜色区分不同簇,并用椭圆圈出每个簇的分布范围。如果你的数据维度很高,这个图可以直观看出簇之间是否分离得开、有没有重叠纠缠。

第二种可视化更关键,是簇的特征画像。比如你想知道“簇1的用户有什么特征”“簇3的产品有什么特点”,可以按簇分组后对原始变量做汇总对比:

df_with_cluster <- as.data.frame(df) %>% mutate(cluster = factor(km_result$cluster)) df_with_cluster %>% group_by(cluster) %>% summarise(across(everything(), mean))

这样就能得到每个簇在各个变量上的均值,横向对比就能看出不同簇的典型特征差异。比如电商用户分群后,可能会发现簇1的客单价高、购买频次低,簇2的客单价低、购买频次高,簇3的个人会员占比高。这些特征才是业务方真正关心的东西,比一个簇号有意义得多。

4. 层次聚类实操:树状图与热图解读

4.1 层次聚类的核心逻辑:自底向上的合并过程

K-means需要提前定K,很多人在探索阶段并不知道应该分几类,这时候层次聚类就更有优势。层次聚类的核心逻辑是:先把每一个样本都看作一个独立的簇,然后计算所有簇之间的距离,把最近的两个簇合并成一个新簇,重复这个合并过程,直到所有样本都合并成一个大簇。整个过程记录下来,就是一棵树。

这棵树叫作树状图(dendrogram),它的叶子节点是每个样本,枝干的长度反映了簇与簇之间的相似程度。你拿到树状图之后,可以像一个园艺师一样,想从哪里剪一刀就从哪里剪,剪一刀就得到一个聚类结果。同一个树状图,切在高度2的位置可能是5个簇,切在高度3的位置就是3个簇,非常灵活。

R里做层次聚类分两步走:

# 第一步:计算距离矩阵 d <- dist(df_scaled, method = "euclidean") # 第二步:进行层次聚类 hc <- hclust(d, method = "ward.D2") # 绘制树状图 plot(hc, cex = 0.6, hang = -1)

hclust函数的method参数有几种选择,ward.D2、complete、average、single。我在实际使用中的经验是,ward.D2生成的簇形比较紧凑、均衡,最常用;complete做出来的簇倾向于团状;average是折中;single容易出现“链式效应”,不推荐日常使用,除非你有特殊理由。

4.2 确定聚类数:从树状图上“切一刀”的科学方法

树状图画出来后,怎么决定在哪里切?肉眼观察是最直接的方法,找树状图中“最长的那根横线”附近切,因为长横线意味着合并了两个差异很大的簇,在这里切会有比较清晰的分类边界。

更严谨一点,可以用factoextra的fviz_dend函数来做:

fviz_dend(hc, k = 3, rect = TRUE, rect_fill = TRUE, color_labels_by_k = TRUE, cex = 0.5)

这个函数会直接在树状图上用矩形框标出K个簇的划分,颜色也帮你分好了。这里的k = 3可以使用前面轮廓系数或者间隙统计量算出来的推荐值,也可以根据你观察树状图得到的结论来定。

层次聚类还有一个很实用的衍生分析:把样本按聚类结果排序后画热图,可以同时看到样本-特征的全局格局。

# 按层次聚类结果给行排序 pheatmap(df_scaled, cluster_rows = hc, cluster_cols = TRUE, cutree_rows = 3, show_rownames = FALSE)

热图的行是样本、列是特征、颜色深浅表示标准化后的数值大小。通过热图,你可以一眼看出哪些特征组合把样本分成了几大块。这在转录组数据分析里尤其常用,成千上万个基因的表达谱聚类后,配合热图可以直观展示不同样本组的表达模式差异。

4.3 层次聚类在大数据量下的局限与应对策略

层次聚类的最大瓶颈是计算复杂度。dist函数要计算n个样本两两之间的距离,距离矩阵的大小是n乘n。当n等于10000时,距离矩阵就有1亿个数值,内存消耗巨大,计算时间也很感人。所以层次聚类通常只适用于样本量在几千以内的场景。

如果样本量比较大但又想用层次聚类,我的建议是分两步走:第一步先用K-means把样本聚成较多的小簇(比如50到100个簇),第二步用小簇的均值向量再做一次层次聚类,相当于先用K-means做了数据压缩,再用层次聚类做层级划分。这种做法在文本聚类和推荐系统里很常见,既能保留层次结构,又控制了计算量。

5. 高维数据与密度聚类:处理更复杂的情况

5.1 K-means和层次聚类解决不了的场景

前面一直在讲的K-means和层次聚类,都有一个共同的隐含假设:数据是按距离来分组。这个假设在很多时候能成立,但在两类场景下会出问题。

第一类是簇形状不规则的场景。比如数据分布是两个月牙形或者螺旋形的簇,K-means只能识别出球形簇,一个簇会被硬生生切成两半,或者两个簇被混合在一起。第二类是数据中噪声点较多的场景。K-means会把噪声点也拉到某个簇里,导致簇中心偏移,层次聚类也会把噪声点当作正常样本参与合并。

这两种情况在真实业务中都不少见。比如地理信息数据里的兴趣点聚类,城市里商圈的形状根本不是圆形,而是沿着街道延伸的长条形;再比如传感器异常检测数据,噪声点本身就代表着“这条数据不太正常”,如果聚类算法把它和正常数据混在一起,这个信息就浪费了。

DBSCAN就是针对这些问题设计的。

5.2 DBSCAN核心概念与参数调优实操

DBSCAN的全称是Density-Based Spatial Clustering of Applications with Noise,基于密度的空间聚类。它的核心思想是:如果一个点周围足够密集,就把它加入一个簇;簇可以沿着高密度区域不断向外延伸,所以能识别任意形状的簇。

DBSCAN有两个关键参数:eps和minPts。eps是邻域半径,也就是说以某个点为中心、半径eps范围内算不算它“周围”;minPts是邻域内至少包含多少个点才能认为这里是“高密度区域”。eps设大了,很多点会被连成一个大簇;eps设小了,好的簇可能被打碎。minPts一般经验值是数据维度的两倍左右,比如二维数据设4到6,高维数据适当增大。

R语言里dbscan包用起来非常简洁:

# 运行DBSCAN db_result <- dbscan(df_scaled, eps = 0.6, minPts = 5) # 查看聚类结果 db_result$cluster # 标签为0的表示噪声点 # 可视化 fviz_cluster(db_result, data = df_scaled, stand = FALSE)

标签为0的样本就是噪声点,这是DBSCAN的一个重要特色:它不会强迫每个样本都进簇,而是明确告诉你哪些点是离群的。这在异常检测场景里极其好用。

eps怎么调?一个常用的工具是k-距离图(k-distance plot)。计算每个样本到第k个最近邻居的距离,把这些距离排序后画出来,曲线出现“拐弯”的位置对应的距离值就可以作为eps的参考。dbscan包提供了kNNdistplot函数:

kNNdistplot(df_scaled, k = 5) abline(h = 0.6, lty = 2)

我在使用DBSCAN时踩过不少坑,最大的体会是它对eps非常敏感,差0.1结果可能天差地别。建议先跑一组不同eps的结果做对比,而不是一上来就盯着某一个参数值。

5.3 高维数据聚类:距离诅咒与降维的配合

还有一个绕不开的话题,就是高维数据。如果你的特征有几十甚至上百个维度,直接套用K-means或者DBSCAN,效果通常不会好。原因在于高维空间中所有点之间的距离趋于相近,聚类结构会被稀释,这就是所谓的“维度灾难”。

常用的解决办法有两个。第一个是先降维再聚类,先做PCA或UMAP把数据压缩到二维到三维的低维空间,再对降维后的数据做聚类。注意这里的逻辑是先把数据压缩去噪,而不是为了画图才降维。我在做基因表达谱聚类的时候就经常这样做,先用PCA取累计贡献率超过80%的主成分,再做聚类分析。第二个是改用适合高维的相似度度量,比如余弦相似度,在很多文本和推荐场景下比欧氏距离表现好得多。

6. 常见问题与排查技巧实录

6.1 聚类结果不稳定,每次跑出来都不一样

这个问题几乎每个用过K-means的人都会遇到。原因前面提过:K-means的初始中心点是随机的,不同初始值可能收敛到不同的局部最优解。

解决办法就是设置nstart参数和随机种子。nstart设为25以上,让算法多次尝试取最优;同时用set.seed固定随机数种子,确保任何人在任何时间复跑代码都能得到相同结果。不要小看这两件事,在学术论文和业务交付里,“可复现”是基本功。如果你发现设置了nstart = 25结果还是明显不稳定,那要考虑数据本身是否存在多个模棱两可的分组方式,或者K选取不合理,这时候要回到选K的环节去重新审视。

6.2 标准化到底要不要做

这个问题的答案是:要看场景。计算距离的聚类算法(K-means、层次聚类)默认要做标准化。我有一次随手分析了两个特征但没标准化,其中一个特征取值范围是0到1,另一个是0到1000,结果聚类结果几乎只看那个数值范围大的特征,另一个特征形同虚设,当时差点误导了业务判断。

但要注意,不是所有聚类都必须标准化。如果你的数据本身就是同一量纲,比如都是百分比、都是同一类评分,标准化反而可能抹掉有价值的信息。另外DBSCAN对标准化也敏感,因为它的eps参数是在距离尺度上定义的,标准化后eps的取值会更直观。

6.3 聚类结果和业务认知对不上

这是最考验分析师价值的时候。聚类结果分组明明很清晰,但业务方一看说“这些客户怎么能是一类”?这种情况通常有两个原因。

第一个原因是特征选择有问题。你喂给算法的东西决定了它能从数据里学到什么。如果业务上认为一个客户是否流失很重要,但你根本没把流失相关的特征放进聚类模型里,算法当然分不出这个维度。第二个原因是没有做簇画像分析。聚类输出的只是一堆编号,你需要把每个簇的平均特征、占比分布做成通俗易懂的报告,告诉业务方“这个簇的人具有什么样的共同特点”,而不是只丢一张散点图给他们。

还有一个心得:聚类分组出来之后,不要急着下结论。先把结果放到一个验证集或者下一时间段的数据上跑一遍,看看标签是否稳定、簇的特征是否变化过大。聚类分析是探索性工具,它的结论需要反复验证才能变成业务决策的依据。

6.4 常见问题速查表

把平时遇到的典型问题整理成一个速查表,方便排查:

问题现象可能原因解决办法
K-means结果不稳定未设置随机种子、nstart过小set.seed设置种子,nstart设为25以上
不同特征对结果影响差异大数据未标准化用scale函数做z-score标准化
聚类图形状奇怪,簇混在一起数据本身不是球形簇改用DBSCAN或层次聚类
有大量离群点被硬分进簇里K-means无法识别噪声改用DBSCAN并设置合适eps/minPts
跑层次聚类内存崩溃样本量太大,距离矩阵爆炸先K-means压缩到小簇再做层次聚类
簇数选不出来,肘部不明显数据本身无天然簇结构尝试改变特征、标准化或换聚类算法
树状图分不清从哪里切样本量大,图太挤用fviz_dend的k参数、或先抽样可视化
聚类结果无业务意义特征选择不合理重新审视特征,加入业务相关变量

7. 一点个人体会

这篇笔记是我学习聚类分析过程中整理的总结,很多结论是我跑了几十遍代码、对比了一堆结果之后才逐渐清晰起来的。回头看,最有价值的经验有三条:第一,聚类分析的成败更多地取决于数据质量和特征选择,而不是算法本身多高级;第二,每个算法都有自己的“脾气”,K-means快但笨,层次聚类直观但慢,DBSCAN灵活但调参难,没有银弹,只有合适不合适;第三,聚类分析是一个探索性过程,不要指望一次跑完就万事大吉,要多尝试不同的算法、不同的参数,从不同角度审视数据,结论才会逐渐清晰。

如果你刚开始学,建议从R自带的iris数据集入手,把K-means和层次聚类的完整流程跑通,再用factoextra包的几种可视化把结果展示出来,这个流程走一遍之后,你对聚类的理解会比只看教程深刻得多。代码写得多了之后,再回头去啃原理,很多东西自然就通了。

最后再分享一个小建议:学习聚类分析的时候,不要只盯着R语言或者Python某一个工具。原理是通用的,R里理解了距离度量和簇间距离,换到Python的scikit-learn就是换个函数名的事情。把底层逻辑吃透,工具只是顺手的事。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询