☰
K-Means聚类算法:从核心原理到实战应用全解析
2026/9/26 20:19:30 网站建设 项目流程

1. 从“分堆”到“聚类”:K-Means的直觉与核心思想

如果你手头有一堆数据点,比如几百个客户的年龄和消费记录,或者一批图片的像素特征,老板让你“把它们分分组”,你第一反应会怎么做?很多人会凭感觉,把看起来“挨得近”的点归到一堆。这个朴素的“物以类聚”的想法,就是聚类算法的起点。而K-Means,就是把这个直觉想法数学化、自动化,并且执行得相当高效的一种经典方法。

我第一次接触K-Means是在处理一个用户分群的项目里。当时我们有一堆用户的行为日志,维度多到人眼完全没法看。老板说,按活跃度分个三六九等出来。我一开始想手动定几个规则,比如登录频率大于多少算高活跃,结果发现规则之间互相打架,分出来的群体边界模糊,而且维度一多,规则组合就爆炸了。这时候,K-Means就像一个不知疲倦的“自动分堆机器人”,它不关心每个维度具体叫什么、有什么业务意义,它只关心数据点之间的“距离”。它会把所有数据点看成多维空间里的一堆散点,然后目标很明确:把这些散点划分成K个组(这就是“K”的由来),并且让同一个组内的点彼此尽可能“亲近”(距离小),不同组之间的点尽可能“疏远”(距离大)。

这个“亲近”和“疏远”怎么衡量?K-Means用了一个非常直观的指标:组内平方误差和。简单说,就是每个点到它所属的“组中心”(我们叫它“质心”)的距离的平方,然后把组内所有点的这个值加起来。K-Means算法的终极目标,就是找到一种分组方式和K个质心的位置,让所有组的这个“组内平方误差和”的总和达到最小。你可以把它想象成,你要给K个小组长(质心)选好驻扎地,然后把所有成员(数据点)分配给离他最近的小组长,目标是所有成员走路上班(到小组长的距离)的总路程最短。K-Means就是在反复调整小组长的位置和成员的归属,来逼近这个“总路程最短”的最优状态。

2. K-Means算法流程拆解:一场迭代的“中心争夺战”

理解了目标,我们来看看K-Means具体是怎么一步步干活的。它的流程清晰得像一个标准的生产线,主要就四步:初始化、分配、更新、检查。但每一步里都有不少门道和容易踩坑的地方。

2.1 第一步:开局布子——质心的初始化

万事开头难,对K-Means来说,这个“难”就体现在质心初始化上。你不能随便乱选初始质心,否则算法可能收敛到一个很差的局部最优解,就像小组长一开始全扎堆在城区东边,导致西边的成员永远被分得不合理。

最常见的初始化方法有两种:

  1. 随机选择:从数据集中随机挑选K个点作为初始质心。这是最省事的方法,但效果不稳定,你可能需要多次运行算法,取结果最好的那次。
  2. K-Means++:这是一种更聪明的初始化策略,旨在让初始质心彼此尽可能远离。它的步骤是:
    • 第一个质心从数据点中随机选一个。
    • 对于每一个数据点,计算它到当前已选出的所有质心的最短距离(即离它最近的那个质心的距离)。
    • 下一个质心被选中的概率,与这个“最短距离”的平方成正比。距离越远的点,被选为下一个质心的概率越大。
    • 重复直到选出K个质心。

注意:在实际应用中,尤其是数据量较大或维度较高时,强烈建议使用K-Means++初始化。像sklearn库中的KMeans类,默认的init参数就是'k-means++'。这能显著提高算法收敛速度和最终聚类效果的一致性。

2.2 第二步:划清界限——数据点的分配

质心初始化好后,就要给所有数据点“分配队伍”了。这一步非常简单粗暴:计算每个数据点到所有K个质心的距离(通常是欧氏距离),然后将该点分配给距离它最近的那个质心所在的簇。

用公式表示,对于数据点 ( x_i ),它被分配到的簇 ( C^{(t)} ) 满足: [ C^{(t)} = \arg\min_{k} ||x_i - \mu_k^{(t)}||^2 ] 这里,( \mu_k^{(t)} ) 表示第t轮迭代时第k个质心的位置,( \arg\min ) 表示找到使距离平方最小的那个k。

这一步结束后,数据集就被划分成了K个互不相交的子集,每个子集是一个簇。

2.3 第三步:重新定位——质心的更新

队伍分好了,但当初随机选的小组长驻扎地可能不是最优的。第二步完成后,每个簇里都有了一群成员,现在我们要根据这群成员的“平均位置”来重新确定小组长的最佳驻扎地。这就是质心更新。

更新规则极其简单:对于第k个簇,其新的质心 ( \mu_k^{(t+1)} ) 等于该簇内所有数据点的均值(向量平均)。 [ \mu_k^{(t+1)} = \frac{1}{|C_k^{(t)}|} \sum_{x_i \in C_k^{(t)}} x_i ] 其中,( |C_k^{(t)}| ) 表示第t轮迭代后第k个簇中数据点的个数。

这个“均值”正是“K-Means”名字中“Means”的由来。它保证了新的质心是这个簇的“中心”,从距离平方和的角度看,这个点是能使簇内所有点到该点距离平方和最小的点。

2.4 第四步:胜负判定——收敛性检查

小组长挪了地方,成员的归属就可能要变。所以我们需要重复第二步(重新分配)和第三步(重新计算质心)。那么什么时候停止呢?这就是收敛性检查。

通常有两种停止准则:

  1. 质心变化很小:当所有质心位置的变化量(比如用欧氏距离衡量)小于一个预设的阈值(如tol=1e-4)时,认为算法已经收敛。
  2. 分配不再变化:当连续两次迭代中,没有任何一个数据点的簇归属发生变化时,算法自然就停止了。
  3. 达到最大迭代次数:为了防止无限循环,通常会设置一个最大迭代次数(如max_iter=300)。达到这个次数后,无论是否收敛都强制停止。

在sklearn中,默认结合了准则1和3。当质心移动的平方距离之和小于阈值tol乘以质心移动前的平方距离之和,或者达到max_iter,迭代就终止。

把上面四步串起来,K-Means的完整流程就是:初始化K个质心 -> (循环开始) -> 将每个点分配到最近的质心 -> 根据每个簇的点重新计算质心 -> 检查质心是否变化或分配是否稳定 -> (若未满足条件,回到分配步骤) -> (循环结束)。

3. K-Means的核心特性、优势与天生短板

用了这么久K-Means,我觉得它的魅力就在于简单和高效,但它的几个“硬伤”你也必须门儿清,不然用起来肯定会掉坑里。

3.1 为什么K-Means如此受欢迎?

  • 原理直观,易于理解和解释:就是找中心、分队伍,业务方也能听懂。你可以直接告诉产品经理:“我们根据用户行为特征,用算法自动分出了5类人群,这是每一类人的中心特征(质心坐标)。”
  • 计算效率高,适用于大规模数据:它的计算复杂度大致是 ( O(n \cdot K \cdot d \cdot I) ),其中n是样本数,K是簇数,d是维度,I是迭代次数。对于数值型数据,线性复杂度使得它能处理百万甚至千万级的数据。这是很多复杂聚类算法做不到的。
  • 实现简单,收敛速度快:算法步骤固定,代码容易实现。在实践中,通常迭代几十次就能收敛。
  • 簇的形状:当簇与簇之间区别明显,且簇的形状接近球形(或者说,在各个方向上方差比较均匀)时,K-Means的效果通常很好。

3.2 K-Means的那些“老毛病”

然而,没有完美的算法。K-Means的以下几个假设,在现实数据中经常被打破:

  • 必须预先指定K值:这是最头疼的问题之一。数据应该被分成几类?很多时候我们并不知道。选不同的K,结果差异巨大。后面我们会专门讲如何选择K。
  • 对初始质心敏感:虽然K-Means++缓解了这个问题,但不同的初始值仍可能导致不同的局部最优解。通常需要多次运行(n_init参数)取最优。
  • 对噪声和离群点敏感:质心是均值,而均值受极端值影响很大。一个远离群体的离群点会强烈地把质心“拉”向自己,导致整个簇的定位失真。
  • 假设簇是凸形且大小相近:K-Means基于距离,它隐含地假设簇是球状的。对于流形、环形、大小差异悬殊的簇,效果会很差。比如一个月球环形数据(外圈一圈,内圈一圈),K-Means会把它切成几个扇形块,而不是分成内外两个环。
  • 主要适用于数值型数据:因为要计算均值和距离。对于类别型数据,需要先进行特殊编码(如独热编码),但这样计算欧氏距离的意义需要仔细考量。

为了更直观地对比,我们可以看看面对不同数据分布时K-Means的表现:

数据分布特征K-Means 预期表现原因分析
球形簇,分离清晰优秀完全符合算法“最小化簇内距离”的假设。
簇大小悬殊较差大簇的质心可能“吞噬”小簇,或将小簇切分。因为算法倾向于产生大小相近的簇。
非球形簇(如流形、环形)很差基于欧氏距离,会强行将非凸簇分割成多个球形部分。
数据包含大量噪声/离群点差质心(均值)对离群点敏感,会被拉偏,影响整个簇的划分。
簇密度差异大较差高密度区域会吸引质心,可能导致低密度区域被错误划分。

4. 实战中的关键抉择:如何确定K值?

在实际项目里,“K等于几?”这个问题出现的频率高得惊人。下面介绍几种常用的方法,我通常会结合使用,而不是只看一个指标。

4.1 肘部法则:最直观的启发式方法

肘部法则的核心思想是:随着簇数K的增加,样本被划分得越来越细,每个簇的聚合程度(簇内误差平方和,即SSE)自然会下降。当K小于真实簇数时,增加K会大幅增加每个簇的聚合度,SSE下降幅度很大;当K达到真实簇数后,再增加K,聚合度的回报会迅速变小,SSE的下降幅度会骤降。这个拐点看起来像手肘的关节,故名“肘部法则”。

操作步骤:

  1. 分别计算K=1, 2, 3, ... 时的SSE。
  2. 绘制K-SSE曲线图。
  3. 寻找曲线上的“拐点”(肘部),其对应的K值就是建议值。

在Python中的实现:

from sklearn.cluster import KMeans import matplotlib.pyplot as plt # 假设 X 是你的数据 sse = [] for k in range(1, 11): kmeans = KMeans(n_clusters=k, random_state=42, n_init='auto') kmeans.fit(X) sse.append(kmeans.inertia_) # inertia_ 属性就是SSE plt.plot(range(1, 11), sse, 'bo-') plt.xlabel('Number of clusters K') plt.ylabel('SSE') plt.title('Elbow Method For Optimal K') plt.show()

解读与心得:肘部法则的问题在于,这个“肘部”有时候很明显,有时候很模糊,需要主观判断。我的经验是,不要只看一个点,关注SSE下降速率突然变缓的那段区间。如果曲线平滑没有明显拐点,说明数据可能没有清晰的自然簇结构,或者这个方法不适用。

4.2 轮廓系数:量化聚类“好坏”

轮廓系数结合了簇内的凝聚度和簇间的分离度,为每个样本点计算一个得分,再对所有点的得分求平均,得到一个介于[-1, 1]之间的总体评分。

  • 接近1:说明样本聚类合理,远离邻近簇。
  • 接近0:说明样本处在两个簇的边界上。
  • 接近-1:说明样本可能被分配到了错误的簇。

操作步骤:

  1. 对于不同的K值,进行K-Means聚类。
  2. 计算每个K值对应的平均轮廓系数。
  3. 选择平均轮廓系数最大的K。

在Python中的实现:

from sklearn.metrics import silhouette_score silhouette_avg_scores = [] for k in range(2, 11): # 轮廓系数要求至少2个簇 kmeans = KMeans(n_clusters=k, random_state=42, n_init='auto') cluster_labels = kmeans.fit_predict(X) silhouette_avg = silhouette_score(X, cluster_labels) silhouette_avg_scores.append(silhouette_avg) print(f"For n_clusters = {k}, the average silhouette_score is : {silhouette_avg:.3f}") best_k = range(2, 11)[silhouette_avg_scores.index(max(silhouette_avg_scores))] print(f"\nThe best K according to Silhouette Score is: {best_k}")

解读与心得:轮廓系数比肘部法则更客观,给出了一个量化的评价。但它计算量更大(需要计算所有样本两两之间的距离),对于大数据集可能较慢。另外,它同样倾向于找到“紧凑且分离良好”的球形簇。

4.3 间隔统计量:与随机数据对比

这是一种更统计的方法。其基本思想是:如果数据本身有清晰的聚类结构,那么真实数据的SSE应该显著小于随机均匀分布数据的SSE。通过比较不同K值下,真实数据SSE与参考分布SSE的差异(取对数后的差异),选择差异最大的K。

操作步骤(概念):

  1. 对原始数据运行K-Means,得到SSE。
  2. 在原始数据的最小包围矩形内,生成多次均匀分布的随机数据。
  3. 对每次生成的随机数据运行K-Means,计算SSE,得到一组参考SSE。
  4. 计算真实数据SSE与参考SSE均值之间的差距(考虑标准差)。
  5. 选择这个差距最大的K。

解读与心得:Gap Statistic理论上更严谨,但实现起来稍复杂,计算量也最大。sklearn没有直接提供,但可以自己实现或用其他库。它特别适用于肘部法则和轮廓系数都失效的情况,能告诉你数据到底有没有聚类结构。

我的常用策略:在实际项目中,我通常会先跑一个肘部法则图,快速看个趋势。然后用轮廓系数在候选的K值(比如肘部附近的2-3个值)里选一个最优的。如果结果还是模棱两可,我会结合业务目标来定。比如做客户分群,业务方可能明确需要分出“高价值”、“中价值”、“低价值”、“流失风险”4类,那K=4就是业务给定的,算法的指标只是辅助验证这个分法是否“数据自洽”。

5. 超越基础:K-Means的改进与变体

经典的K-Means有短板,聪明的研究者和工程师们就提出了各种改进方案。了解这些变体,能让你在合适场景下选用更趁手的工具。

5.1 K-Medoids:用中位数代替均值,抵御离群点

K-Means对噪声敏感,根源在于质心是“均值”。一个很自然的想法是:用“中位数”行不行?K-Medoids就是这么做的。它不再用虚拟的均值点作为簇中心,而是从实际数据点中选出一个代表点(Medoid)作为中心。这个代表点是簇内到其他所有点距离之和最小的那个点。

优势:由于中心是真实存在的数据点,且基于距离和(而非平方和)最小化,K-Medoids对噪声和离群点的鲁棒性强得多。劣势:计算复杂度比K-Means高得多,因为每次迭代都需要计算所有点到所有候选中心点的距离。常用算法是PAM,不太适合大数据集。适用场景:数据中有显著离群点,且数据规模不大时。

5.2 Mini-Batch K-Means:大数据集的加速器

当数据量巨大,无法全部装入内存时,标准K-Means就力不从心了。Mini-Batch K-Means应运而生。它的思想很简单:每次迭代不使用全部数据,而是随机抽取一个小批量(Mini-Batch)数据样本来更新质心。

优势:速度极快,内存消耗小,可以处理海量数据。虽然结果可能略差于标准K-Means,但常常在可接受的范围内。劣势:结果可能不如标准算法精确,有随机性。适用场景:数据量极大(如千万、亿级)时的首选聚类方法。在sklearn中,使用MiniBatchKMeans类即可。

from sklearn.cluster import MiniBatchKMeans mbk = MiniBatchKMeans(n_clusters=5, batch_size=100, random_state=42) mbk.fit(large_data)

5.3 基于密度的聚类(如DBSCAN):解决非球形簇问题

当你的数据是环形、月牙形,或者簇的形状极不规则时,基于距离的K-Means家族就无能为力了。这时需要换一个思路:基于密度。DBSCAN是其中的代表算法。

它不需要指定簇数K,而是定义两个参数:邻域半径eps和最小样本数min_samples。它的核心思想是:簇是数据空间中密度相连的点的最大集合。它能找出任意形状的簇,并且能识别出噪声点。

与K-Means对比:

特性K-MeansDBSCAN
簇形状凸形,球形任意形状
是否需要指定K是否
对噪声处理敏感,会强行归类鲁棒,能识别噪声
对参数敏感度对K值敏感对eps和min_samples敏感
复杂度相对较低邻域查询复杂度较高

适用场景:数据簇形状未知、非球形,且需要识别噪声点时。例如,在地理信息点聚类、异常检测中非常有用。

5.4 谱聚类:连接K-Means与图理论的桥梁

谱聚类是另一种强大的聚类方法,它先对数据点构建一个相似度图(比如用K近邻连接),然后对图的拉普拉斯矩阵进行特征分解,最后在特征向量构成的新空间里对数据点进行聚类(通常就用K-Means)。这相当于把原始空间中复杂纠缠的数据,映射到一个新的空间,使其变得更容易分离。

简单理解:想象一堆交织在一起的毛线(原始数据),谱聚类就像找到一种“拉直”毛线的方法(特征映射),让它们变成几束平行且分开的线,然后再用K-Means去切分,就很容易了。

优势:对于处理像“两个套在一起的圆圈”这类K-Means完全无法处理的数据,谱聚类效果极佳。劣势:计算复杂度高(需要计算特征值),对于大规模数据有挑战;也需要指定最终的簇数K。适用场景:小规模数据,且簇结构非常复杂、非凸时。

6. 从原理到代码:一个完整的K-Means实战案例

光说不练假把式。我们用一个完整的例子,把前面讲的知识串起来。假设我们有一份电商用户的消费行为数据,包含“年均消费金额”和“年均购买频次”两个特征,我们想对用户进行分群。

6.1 数据准备与探索

首先,我们生成一份模拟数据,并观察其分布。

import numpy as np import pandas as pd import matplotlib.pyplot as plt from sklearn.datasets import make_blobs from sklearn.preprocessing import StandardScaler # 1. 生成模拟数据:假设有3个自然用户群体 # make_blobs 默认生成球形簇,很适合K-Means X, y_true = make_blobs(n_samples=300, centers=3, cluster_std=0.8, random_state=42) # 为了模拟真实场景,我们给数据加上标签,并稍微打乱和缩放 df = pd.DataFrame(X, columns=['Annual_Spending', 'Purchase_Frequency']) # 添加一些噪声 np.random.seed(42) df['Annual_Spending'] += np.random.normal(0, 0.1, size=len(df)) df['Purchase_Frequency'] += np.random.normal(0, 0.1, size=len(df)) # 2. 数据标准化:K-Means基于距离,量纲不同的特征会影响结果 scaler = StandardScaler() X_scaled = scaler.fit_transform(df) # 3. 可视化原始数据 plt.figure(figsize=(8, 6)) plt.scatter(X_scaled[:, 0], X_scaled[:, 1], s=50, alpha=0.7, edgecolor='k') plt.xlabel('Standardized Annual Spending') plt.ylabel('Standardized Purchase Frequency') plt.title('Raw Customer Data Distribution') plt.grid(True, linestyle='--', alpha=0.5) plt.show()

这一步你会看到数据点大致聚成了三团。标准化非常重要,因为“消费金额”可能以万为单位,“购买频次”是个位数,不标准化的话,距离计算会被金额主导。

6.2 确定最佳K值

我们用肘部法则和轮廓系数双保险。

from sklearn.cluster import KMeans from sklearn.metrics import silhouette_score # 肘部法则 sse = [] for k in range(1, 11): kmeans = KMeans(n_clusters=k, random_state=42, n_init='auto') kmeans.fit(X_scaled) sse.append(kmeans.inertia_) plt.figure(figsize=(12, 4)) plt.subplot(1, 2, 1) plt.plot(range(1, 11), sse, 'bo-') plt.xlabel('Number of Clusters K') plt.ylabel('SSE') plt.title('Elbow Method') plt.grid(True, linestyle='--', alpha=0.5) # 轮廓系数 (K>=2) sil_scores = [] for k in range(2, 11): kmeans = KMeans(n_clusters=k, random_state=42, n_init='auto') cluster_labels = kmeans.fit_predict(X_scaled) sil_avg = silhouette_score(X_scaled, cluster_labels) sil_scores.append(sil_avg) plt.subplot(1, 2, 2) plt.plot(range(2, 11), sil_scores, 'ro-') plt.xlabel('Number of Clusters K') plt.ylabel('Average Silhouette Score') plt.title('Silhouette Analysis') plt.grid(True, linestyle='--', alpha=0.5) plt.tight_layout() plt.show() # 打印最佳K best_k_sil = range(2, 11)[np.argmax(sil_scores)] print(f"根据轮廓系数,最佳K值为: {best_k_sil}")

从生成的图上,肘部法则在K=3处有一个比较明显的拐点,轮廓系数在K=3时也达到峰值。这和我们生成数据时设定的centers=3是一致的。所以我们确定K=3。

6.3 模型训练与结果可视化

用K=3来训练模型,并查看结果。

# 使用最佳K值训练模型 best_k = 3 kmeans = KMeans(n_clusters=best_k, random_state=42, n_init='auto') kmeans.fit(X_scaled) cluster_labels = kmeans.labels_ centroids = kmeans.cluster_centers_ # 可视化聚类结果 plt.figure(figsize=(10, 8)) colors = ['#FF6B6B', '#4ECDC4', '#95E1D3'] # 为每个簇定义颜色 for i in range(best_k): # 画出属于当前簇的点 plt.scatter(X_scaled[cluster_labels == i, 0], X_scaled[cluster_labels == i, 1], s=70, c=colors[i], label=f'Cluster {i+1}', alpha=0.7, edgecolor='k') # 画出质心 plt.scatter(centroids[i, 0], centroids[i, 1], s=300, c=colors[i], marker='*', edgecolor='k', linewidth=2, label=f'Centroid {i+1}') plt.xlabel('Standardized Annual Spending') plt.ylabel('Standardized Purchase Frequency') plt.title(f'K-Means Clustering Result (K={best_k})') plt.legend() plt.grid(True, linestyle='--', alpha=0.5) plt.show() # 查看质心在原始尺度下的位置(反标准化) centroids_original = scaler.inverse_transform(centroids) centroids_df = pd.DataFrame(centroids_original, columns=df.columns, index=[f'Cluster_{i+1}' for i in range(best_k)]) print("各簇质心在原始特征空间的位置:") print(centroids_df.round(2))

你会看到一张清晰的散点图,三个簇被不同颜色标记,质心用大星星标出。打印出的质心坐标,可以帮助我们解读每个簇的特征。例如:

  • Cluster_1: 年均消费和购买频次都较低 ->低价值沉默用户。
  • Cluster_2: 年均消费高,购买频次中等 ->高消费低频次用户(可能是一次性大额购买)。
  • Cluster_3: 年均消费中等,购买频次很高 ->高频次忠实用户。

6.4 模型评估与业务解读

除了看图和轮廓系数,我们还可以计算一些内部指标,并尝试与业务结合。

from sklearn.metrics import calinski_harabasz_score, davies_bouldin_score # 计算更多内部评估指标 ch_score = calinski_harabasz_score(X_scaled, cluster_labels) db_score = davies_bouldin_score(X_scaled, cluster_labels) sil_score = silhouette_score(X_scaled, cluster_labels) print(f"聚类评估指标 (K={best_k}):") print(f" 轮廓系数 (Silhouette Score): {sil_score:.3f}") # 越高越好,[-1,1] print(f" 卡林斯基-哈拉巴斯指数 (Calinski-Harabasz Index): {ch_score:.2f}") # 越高越好 print(f" 戴维森堡丁指数 (Davies-Bouldin Index): {db_score:.3f}") # 越低越好 # 将聚类标签添加到原始数据框,便于后续分析 df['Cluster'] = cluster_labels + 1 # 让簇编号从1开始 print("\n各簇样本数量统计:") print(df['Cluster'].value_counts().sort_index()) # 简单的簇特征分析(按原始尺度) cluster_profile = df.groupby('Cluster').agg({ 'Annual_Spending': ['mean', 'std', 'count'], 'Purchase_Frequency': ['mean', 'std'] }).round(2) print("\n各簇特征概况:") print(cluster_profile)

这些指标从不同角度评估了聚类的紧密度和分离度。结合业务,我们可以给每个簇起个名字,并制定不同的运营策略:

  • 簇1(低价值沉默用户):可以考虑推送高性价比入门商品、签到有礼等活动,提升其活跃度和首次付费转化。
  • 簇2(高消费低频次用户):这类用户价值高但粘性低。应重点维护,提供VIP专属客服、大额优惠券,并尝试通过交叉推荐关联商品,提升其购买频次。
  • 簇3(高频次忠实用户):是社区的核心。应加强互动,如建立会员社群、推出忠诚度计划、邀请参与新品试用,提升其归属感和口碑传播。

实操心得:在实际项目中,数据清洗和特征工程往往比选择K值更重要。比如,你需要处理缺失值,可能需要创建新的特征(如“客单价”、“最近一次购买距今天数”),并且一定要做标准化。另外,K-Means的结果只是一个“数据标签”,真正的价值在于业务方能否理解并利用这个标签。因此,生成像上面cluster_profile这样的可解释性报告至关重要。最后,聚类是一个探索性过程,不要指望一次就得到完美结果,可能需要根据业务反馈调整特征、K值,甚至尝试不同的算法。

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

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

立即咨询