聚类算法选型指南:5个真实案例告诉你什么时候该用K-means,什么时候选K-medoid
聚类算法选型实战从K-means到K-medoid五个真实场景下的决策逻辑每次面对一堆没有标签的数据想从中找出点规律我第一个想到的工具往往是聚类。它就像数据世界里的“物以类聚”能把看似杂乱的点归拢成几个有意义的群组。但工具盒里不止一把锤子K-means和K-medoid这两把最常用的“锤子”用错了场景敲出来的可能不是钉子而是自己的手指。我记得有一次做电商用户分群直接套用K-means结果几个高消费的“土豪”用户硬生生把整个簇的中心点拉偏了导致那个分群的特征变得模糊不清后续的营销策略差点跑偏。那次教训让我明白算法没有绝对的好坏只有合不合适。今天这篇文章我想抛开教科书式的定义对比直接切入我们数据分析师和算法工程师日常工作中最常遇到的几个业务场景。我们会看到在电商用户画像、金融风控、图像处理、生物信息学乃至零售选址这些截然不同的领域选择K-means还是K-medoid背后是一套结合数据特性、业务目标和计算成本的综合决策逻辑。我会结合具体的代码片段、参数调优的细节以及我踩过的坑帮你建立起一套直观的选型直觉。1. 核心差异不只是“质心”与“中心点”的文本游戏很多人对K-means和K-medoid的第一印象停留在“质心是均值点”和“质心是样本点”这个最表层的区别上。这没错但如果我们只理解到这里选型时依然会感到迷茫。我们需要深入一层看看这个差异在数学和计算上究竟引发了怎样的连锁反应。K-means的核心操作是计算簇内所有点的算术平均值。这个操作在欧几里得空间就是我们最熟悉的那个空间里有着明确的几何意义它找到的是使簇内所有点到该“中心”的平方距离之和最小的那个点。注意是“平方距离”。这意味着那些远离群体的极端值离群点因为距离被平方了会对这个中心点的位置产生巨大的、不成比例的拉力。# 一个简化的K-means质心更新步骤凸显均值计算 def update_centroids_kmeans(points, labels, k): new_centroids [] for i in range(k): # 找到属于第i簇的所有点 cluster_points points[labels i] # 关键步骤计算均值算术平均 new_center np.mean(cluster_points, axis0) new_centroids.append(new_center) return np.array(new_centroids)K-medoid则走了另一条路。它不从虚空中创造一个“均值点”而是固执地从现有的、真实的样本点中挑选出一个“代表”。这个代表的选拔标准是它到簇内所有其他点的距离之和最小。注意这里通常是绝对距离如曼哈顿距离或欧氏距离本身而非平方距离。这使得它对“异类”的容忍度更高——一个遥远的离群点只会增加线性的距离成本而不会像在K-means中那样被平方放大其影响力。# K-medoid寻找新中心点的核心逻辑 def find_new_medoid(cluster_points): n len(cluster_points) best_medoid None min_total_distance float(inf) # 遍历簇内的每一个点计算它作为中心的“总成本” for i in range(n): candidate cluster_points[i] total_dist 0 for j in range(n): if i ! j: # 计算绝对距离这里用欧氏距离但思想一致 total_dist np.linalg.norm(candidate - cluster_points[j]) # 选择总成本最小的点作为新中心 if total_dist min_total_distance: min_total_distance total_dist best_medoid candidate return best_medoid这个根本性的差异直接导致了它们在性能和适用性上的分水岭。我们可以用一个简单的对比表格来快速梳理特性维度K-meansK-medoid (如PAM算法)中心点性质虚拟的均值点可能不在数据集中数据集中真实存在的样本点目标函数最小化簇内样本与质心的平方欧氏距离和最小化簇内样本与中心点的距离和通常为曼哈顿距离对离群点敏感性非常敏感离群点会显著拉偏质心位置相对鲁棒离群点影响有限计算复杂度O(n * k * i * d) 通常较快 (n样本数, k簇数, i迭代数, d维度)O(k * (n-k)² * i) 在大数据集上极慢数据类型适应性主要适用于连续数值型数据且距离度量需有意义可用于任何定义了距离度量的数据包括分类数据、序列数据等典型应用场景大规模客户分群、图像颜色量化、文档主题聚类小规模异常检测、基因序列聚类、地理位置中心点查找注意这里K-medoid的复杂度是经典PAM算法的复杂度。在实际中为了处理更大数据会使用CLARA或CLARANS等采样优化算法但核心的“挑选真实点”思想不变。理解了这个表格你就掌握了选型的第一把钥匙。接下来我们把这把钥匙插进五个真实的业务锁孔里看看如何转动。2. 案例一电商用户价值分群——K-means的主场假设你在一家电商平台手头有过去一年所有用户的交易数据包括购买频率、客单价、最近购买时间等。你的任务是将用户分成“高价值”、“潜力用户”、“一般用户”、“流失风险用户”等5-6个群体以便运营团队进行精准营销。为什么这里是K-means的天下数据规模大动辄百万甚至千万级别的用户数据。K-medoid那O(n²)级别的计算成本在现有算力下几乎是不可行的。K-means的线性可扩展性在这里是硬性要求。特征连续且尺度可调RFM最近一次消费、消费频率、消费金额等指标都是连续数值。虽然可能存在极端高消费用户离群点但我们可以通过数据预处理来大幅缓解这个问题。常用的方法包括对数变换对客单价等右偏严重的特征取log压缩极端值的影响范围。缩尾处理将高于99分位数和低于1分位数的值用分位数值进行替换。标准化/Z-score归一化确保所有特征在相同尺度上避免某个特征因量纲大而主导距离计算。# 电商用户数据预处理示例 import pandas as pd import numpy as np from sklearn.preprocessing import StandardScaler, PowerTransformer # 假设df包含 recency, frequency, monetary_value 等列 # 1. 处理极端值对金额进行对数变换 df[log_monetary] np.log1p(df[monetary_value]) # log1p防止出现log(0) # 2. 缩尾处理Winsorization def winsorize(series, limits[0.01, 0.99]): lower series.quantile(limits[0]) upper series.quantile(limits[1]) return series.clip(lower, upper) df[frequency_winsor] winsorize(df[frequency]) # 3. 标准化 features_to_scale [recency, frequency_winsor, log_monetary] scaler StandardScaler() df_scaled scaler.fit_transform(df[features_to_scale])业务需求是寻找“典型群体”我们想要的是能代表大多数用户行为的“中心趋势”。一个由均值定义的、可能不存在的“理想型”用户画像对于设计普适性的营销策略如针对“高价值用户”的专属权益包恰恰更有指导意义。我们并不关心某个具体用户是否能成为中心。实操要点与陷阱K值选择务必使用轮廓系数Silhouette Score结合业务解读。手肘法在电商用户数据上拐点经常不明显。初始中心点使用k-means初始化sklearn默认能有效避免糟糕的初始聚类导致结果陷入局部最优。评估与迭代聚类完成后一定要分析每个簇的特征均值并给业务方提供清晰的画像描述。例如Cluster 0: “高频次、中等客单价、近期活跃的潜力股”。3. 案例二金融交易异常检测——K-medoid的用武之地在反欺诈或风险控制场景中你需要从海量交易记录中识别出异常模式。这些异常交易只占极小的比例如0.1%但特征与正常交易差异巨大例如深夜大额跨境转账、短时间内同一设备多账户登录。为什么K-medoid更适合离群点就是目标在这个场景下我们不仅不害怕离群点反而要主动找到它们。K-means会因为一个欺诈交易样本的极端特征把整个簇的质心拉向异常区域导致这个“异常簇”失去代表性甚至可能把一些正常交易也囊括进来。K-medoid选择一个真实交易作为中心能更好地保持“正常交易簇”的纯净性从而让那些无法被归入任何主要簇的“孤儿”点即离群点暴露出来。小样本聚焦分析我们通常不会直接用全量数据比如上亿条交易跑聚类来找异常。更常见的做法是先通过规则或简单模型筛选出一个“可疑交易池”比如几万条这个池子规模可控。然后在这个池子里使用K-medoid进行聚类目的是看这些可疑交易是否能形成一些有规律的“异常模式”如不同类型的欺诈团伙而不是把它们硬塞进以正常交易为主的簇里。距离度量的灵活性交易数据可能包含分类变量如交易渠道、设备类型。我们可以定义更复杂的距离度量如将分类变量转化为0/1距离的Gower距离。K-medoid只要求我们能计算任意两点间的距离不依赖均值计算因此能天然兼容这种混合型数据。操作流程示例# 假设我们有一个经过预筛选的“可疑交易”数据集 suspicious_df from sklearn_extra.cluster import KMedoids # 需要安装 scikit-learn-extra from sklearn.preprocessing import StandardScaler import numpy as np # 1. 准备特征可能包含数值和编码后的分类特征 # 假设已处理好得到特征矩阵 X scaler StandardScaler() X_scaled scaler.fit_transform(X) # 2. 使用K-medoids进行聚类寻找异常模式 # 我们假设可疑交易可能属于3-5种不同的异常类型 k 4 kmedoids KMedoids(n_clustersk, metriceuclidean, random_state42, methodalternate) cluster_labels kmedoids.fit_predict(X_scaled) # 3. 分析结果查看每个簇的中心点即Medoid是真实交易 medoid_indices kmedoids.medoid_indices_ for i, idx in enumerate(medoid_indices): print(f异常模式 {i} 的代表交易ID: {suspicious_df.iloc[idx][transaction_id]}) print(f该模式的特征概览:\n{suspicious_df.iloc[idx][[amount, channel, location]]}) print(- * 30) # 4. 那些没有被归入任何簇或属于非常小簇的点可能是更孤立的极端异常 from collections import Counter label_counts Counter(cluster_labels) small_clusters [label for label, count in label_counts.items() if count 10] # 假设定义小于10条为小簇 isolated_transactions suspicious_df[np.isin(cluster_labels, small_clusters)]提示在异常检测中K-medoid的结果通常需要与领域知识结合。某个簇可能代表一种新型欺诈手法而孤立点则可能是需要立即拦截的极高风险交易。4. 案例三图像颜色压缩与分割——K-means的效率体现你想将一张彩色图片的颜色数量从1600万色减少到256色颜色量化或者对医学图像如MRI进行初步分割以区分组织。每个像素点可以看作一个在RGB或Lab颜色空间中的三维数据点。为什么K-means是标准选择数据量极大计算效率至上一张1000万像素的图片就是1000万个数据点。K-medoid算法在此数据量面前完全不具备可行性。K-means尤其是利用Mini-Batch K-Means变种可以在保证效果近似的前提下大幅提升处理速度。均值具有明确的物理意义在颜色空间中一个簇的均值点对应的就是一种新的“代表色”。这个颜色是簇内所有颜色的混合结果视觉上是平滑且自然的。如果用K-medoid中心点必须是某个原始像素的颜色可能会选择到一个并不具有代表性的、略显突兀的颜色。目标函数与感知一致性人眼对颜色的感知在均匀颜色空间如CIELAB中近似于欧氏距离。最小化平方欧氏距离和与最小化颜色替换带来的整体视觉误差的目标是吻合的。实战代码片段from sklearn.cluster import MiniBatchKMeans from PIL import Image import numpy as np # 1. 加载图像并转换为一维像素数组 image Image.open(landscape.jpg) image_np np.array(image) # 形状为 (height, width, 3) pixels image_np.reshape(-1, 3) # 形状为 (height*width, 3) # 2. 使用MiniBatchKMeans进行颜色量化 n_colors 256 # 使用MiniBatch版本加速特别适合大数据 kmeans MiniBatchKMeans(n_clustersn_colors, batch_size1024, random_state42) kmeans.fit(pixels) # 3. 获取质心新调色板并替换每个像素的颜色 new_colors kmeans.cluster_centers_.astype(uint8) new_pixels new_colors[kmeans.labels_] # 4. 重塑为图像 quantized_image new_pixels.reshape(image_np.shape) Image.fromarray(quantized_image).save(quantized_image.jpg) # 对于图像分割思路类似但特征可能不仅是颜色还包括像素位置(x,y) # 构建5维特征 [R, G, B, x, y]但需要对位置坐标进行归一化 height, width image_np.shape[:2] x_coords, y_coords np.meshgrid(np.arange(width), np.arange(height)) spatial_features np.stack([x_coords/width, y_coords/height], axis-1) # 归一化位置 spatial_features_flat spatial_features.reshape(-1, 2) # 将颜色和空间特征拼接 features np.concatenate([pixels/255.0, spatial_features_flat], axis1) # 颜色也归一化 # 再次聚类此时聚类结果会同时考虑颜色相似和空间邻近 kmeans_seg MiniBatchKMeans(n_clusters10, batch_size2048) labels_seg kmeans_seg.fit_predict(features) # 每个簇的标签可以生成一个分割掩膜在这个场景下K-means不仅是可行的它几乎就是为这种大规模、低维度、连续型数据的聚类任务而生的。5. 案例四基因表达数据分析与零售门店选址——距离度量的抉择这两个看似不相关的领域在聚类算法选型上却面临同一个核心问题我们应该使用什么样的距离基因表达数据每个样本是数万个基因的表达水平向量。我们关心的是表达模式的“形状”而非绝对数值。两个基因可能表达量相差很大但它们的表达在不同实验条件下起伏趋势完全一致正相关这在生物学上意义重大。零售门店选址每个候选地址由一系列特征描述周边人口密度、竞争对手距离、公共交通可达性、租金成本等。这些特征量纲不同且业务上对“相似”的定义可能不是简单的欧氏距离。K-means的局限与K-medoid的灵活性K-means与欧氏距离及其平方和最小化的目标函数深度绑定。虽然可以通过对数据预处理如标准化来调整但其核心仍是基于坐标轴的空间距离。对于基因数据我们更可能使用余弦相似度或皮尔逊相关系数来衡量样本间的相似性。对于门店数据我们可能需要自定义一个加权距离。K-medoid在这里的优势再次凸显它不关心中心点如何计算只关心如何比较两点。只要你能定义一个距离矩阵Dissimilarity Matrix告诉算法任意两个样本之间的距离是多少K-medoid就能工作。操作示例基于距离矩阵的聚类import numpy as np from sklearn_extra.cluster import KMedoids from scipy.spatial.distance import pdist, squareform from scipy.cluster.hierarchy import linkage, dendrogram import matplotlib.pyplot as plt # 假设我们有基因表达数据矩阵 data形状为 (n_samples, n_genes) # 1. 计算基于相关性的距离矩阵 # 使用 1 - 皮尔逊相关系数 作为距离度量 correlation_matrix np.corrcoef(data) # 计算相关系数矩阵 distance_matrix 1 - correlation_matrix # 转换为距离矩阵值越大越不相似 # 2. 使用K-medoids进行聚类PAM算法需要距离矩阵 k 5 kmedoids_corr KMedoids(n_clustersk, metricprecomputed, random_state42) # 传入预先计算好的距离矩阵 cluster_labels kmedoids_corr.fit_predict(distance_matrix) # 3. 可视化可选通过层次聚类树状图辅助理解距离结构 # 使用平均链接法进行层次聚类仅用于可视化 linked linkage(squareform(distance_matrix, checksFalse), methodaverage) plt.figure(figsize(10, 7)) dendrogram(linked, orientationtop, distance_sortdescending, show_leaf_countsTrue) plt.title(Hierarchical Clustering Dendrogram (基于相关性距离)) plt.xlabel(Sample index) plt.ylabel(Distance) plt.show()注意当使用自定义或复杂距离度量时务必确保其满足距离度量的基本公理非负性、同一性、对称性、三角不等式。否则聚类结果可能不可预测。对于零售选址流程类似先根据业务逻辑为每个特征赋予权重计算每个候选地址之间的综合“差异度”矩阵再输入给K-medoids。这样得到的中心点就是一个在各项加权指标上综合来看最“典型”的真实候选地址极具参考价值。6. 选型决策树与工程化考量经过前面四个案例的剖析我们可以提炼出一个更普适的决策流程。下次当你面对一个聚类问题时可以顺着下面这个思路走我的数据有多大如果样本量 10,000优先考虑K-means或其变种Mini-Batch K-Means。计算效率是第一道门槛。如果样本量较小10,000且对离群点敏感或需要真实中心点则K-medoid进入候选。我的数据中离群点多吗它们重要吗如果离群点是噪声且需要被抑制或者业务上追求“典型”群体选K-means并做好数据清洗。如果离群点本身就是分析目标如欺诈检测或者需要保证中心点的可解释性如代表病例、代表门店选K-medoid。我的特征是什么类型距离度量能简单定义吗如果是纯粹的连续数值特征且欧氏距离有意义K-means是简单高效的选择。如果特征是混合类型数值分类或者需要基于相关性、自定义业务规则来计算相似度K-medoid是更灵活的选择。最终工程落地前必须做的验证稳定性测试由于两者都可能受初始点影响多次运行random_state设为不同值观察结果是否稳定。K-means初始化已大大改善了K-means的稳定性。指标评估不要只看轮廓系数。结合Calinski-Harabasz指数方差比准则和戴维森堡丁指数来综合判断。更重要的是将聚类结果交给业务方看每个簇是否具有清晰、可行动的业务意义。可视化检查对于2维或3维数据或通过PCA/t-SNE降维后务必绘图观察聚类效果。肉眼常常能发现指标无法反映的问题比如形状不规则的簇被强行分割。最后别忘了算力成本。我曾经在一个需要实时对用户进行分群的流式处理系统中因为最初选型时忽略了效率尝试用K-medoid的近似算法结果导致了处理延迟。后来换回Mini-Batch K-Means问题迎刃而解。在原型开发阶段你可以为了效果尝试更复杂的算法但在生产环境尤其是大规模、高频次的场景下K-means及其变种在效率与效果之间的平衡往往是更务实的选择。工具是拿来用的关键是弄清楚你要拧的是螺丝还是螺母。

相关新闻

随机森林实战:用Python手把手教你提升分类准确率(附完整代码)

随机森林实战:用Python手把手教你提升分类准确率(附完整代码)

从0.9到0.99:用Python解锁随机森林的实战调优艺术 如果你已经用scikit-learn的RandomForestClassifier跑通了第一个分类案例,看着屏幕上0.92或0.95的准确率,可能会觉得“随机森林不过如此”。但我想告诉你,从“能用”到“精通”&a…

2026/5/17 12:14:55 阅读更多 →
Qwen3-0.6B-FP8提示词工程实战:从入门到精通

Qwen3-0.6B-FP8提示词工程实战:从入门到精通

Qwen3-0.6B-FP8提示词工程实战:从入门到精通 1. 引言 你有没有遇到过这样的情况:给一个AI模型输入问题,得到的回答要么是“我不知道”,要么就是答非所问,完全不是你想要的?这很可能不是模型能力不行&…

2026/5/17 12:14:56 阅读更多 →
小白也能懂,手把手教你 Windows 10 部署 OpenClaw 并接入飞书,打造你的私人 AI 助理!

小白也能懂,手把手教你 Windows 10 部署 OpenClaw 并接入飞书,打造你的私人 AI 助理!

最近几个月,OpenClaw 这个开源项目真的火出圈了。身边好几个朋友都在问:“这玩意儿到底怎么装?能不能在飞书里用?”说实话,一开始我也被它的文档绕晕过——一会儿要配 Node.js,一会儿又是 Git、PowerShell …

2026/5/17 2:02:33 阅读更多 →

最新新闻

基于AES-CBC的统一图像加密系统:设计、实现与跨平台实践

基于AES-CBC的统一图像加密系统:设计、实现与跨平台实践

1. 项目概述:为什么我们需要一个“统一”的图像加密系统?在数字图像处理和数据安全领域,图像加密是一个老生常谈但又常做常新的课题。你可能已经接触过很多简单的像素置换、异或操作,或者听说过一些复杂的混沌系统加密方法。但当我…

2026/7/3 0:16:02 阅读更多 →
专业级视频质量对比工具:3大核心功能提升画质分析效率

专业级视频质量对比工具:3大核心功能提升画质分析效率

专业级视频质量对比工具:3大核心功能提升画质分析效率 【免费下载链接】video-compare Split-screen video comparison tool using FFmpeg and SDL2 项目地址: https://gitcode.com/gh_mirrors/vi/video-compare video-compare是一款基于FFmpeg和SDL2开发的专…

2026/7/3 0:16:02 阅读更多 →
智能降重工具在学术写作中的应用与技巧

智能降重工具在学术写作中的应用与技巧

1. 学术写作的痛点与解决方案学术写作过程中最让人头疼的莫过于查重环节。记得我读研时第一次提交论文,查重率高达38%,那些被标红的段落像伤口一样刺眼。当时熬夜手动改写,结果越改越乱,最后不得不删掉整段核心内容。这种经历相信…

2026/7/3 0:16:02 阅读更多 →
7个Token省钱技巧!把AI消耗从房贷干成奶茶钱

7个Token省钱技巧!把AI消耗从房贷干成奶茶钱

文章目录前言一、及时开新会话,别跟 AI 谈恋爱二、写交接摘要,让新会话“秒懂”三、缩小问题范围,拒绝无脑大范围提问四、分级使用模型,按需匹配不浪费五、合理调节Agent推理强度,不盲目拉满六、Headroom工具&#xff…

2026/7/3 0:14:00 阅读更多 →
STM32与LV3296构建高精度实时数据采集系统

STM32与LV3296构建高精度实时数据采集系统

1. 项目背景与核心需求 在嵌入式系统开发领域,LV3296信号处理芯片与STM32F401RB微控制器的组合正成为实时数据采集系统的热门选择。这套方案特别适合需要高精度信号捕获、实时轨迹跟踪以及复杂信息管理的应用场景,比如工业自动化中的设备状态监控、无人机…

2026/7/3 0:12:00 阅读更多 →
分组气泡图(Packedbubble)实战:全球车企市值分层聚合可视化

分组气泡图(Packedbubble)实战:全球车企市值分层聚合可视化

本车企市值聚合气泡案例充分体现 Highcharts 专业气泡可视化能力&#xff0c;解决传统散点气泡布局混乱、多分类无法自动分区的痛点。完整可预览修复 HTML<!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><met…

2026/7/3 0:12:00 阅读更多 →

日新闻

Nginx防御TLS重协商攻击实战:从原理到配置与监控

Nginx防御TLS重协商攻击实战:从原理到配置与监控

1. 项目概述&#xff1a;为什么TLS重协商攻击至今仍需警惕十多年前的CVE-2011-1473&#xff0c;一个关于TLS/SSL协议重协商机制的漏洞&#xff0c;现在提起来还有必要吗&#xff1f;很多运维和开发朋友可能会觉得&#xff0c;这都老掉牙了&#xff0c;现代服务器和客户端不都默…

2026/7/3 0:03:59 阅读更多 →
华为防火墙双通道远程管理实战:Web与SSH配置详解

华为防火墙双通道远程管理实战:Web与SSH配置详解

1. 项目概述&#xff1a;为什么需要双通道远程管理防火墙&#xff1f;在任何一个稍具规模的企业网络里&#xff0c;防火墙都是那个默默守护在边界的关键角色。作为网络工程师&#xff0c;我们不可能每次都跑到机房&#xff0c;插上console线去配置它。远程管理能力&#xff0c;…

2026/7/3 0:03:59 阅读更多 →
AD74413R与PIC18F65K40的高精度工业数据采集方案

AD74413R与PIC18F65K40的高精度工业数据采集方案

1. 项目概述&#xff1a;AD74413R与PIC18F65K40的协同工作在工业自动化和精密测量领域&#xff0c;同时实现高精度模数转换(ADC)和数模转换(DAC)功能是许多复杂系统的核心需求。AD74413R作为一款四通道可配置模拟输入/输出器件&#xff0c;与PIC18F65K40微控制器的组合&#xf…

2026/7/3 0:05:59 阅读更多 →

周新闻

月新闻