更具有解释意义的聚类算法K-medoids与常见算法K-means的比较实现

机器学习算法大数据

picture.image

✨ 欢迎关注 ✨

本节介绍: 更具有解释意义的聚类算法K-medoids与常见算法K-means的比较实现 。数据采用模拟数据,作者根据个人对机器学习的理解进行代码实现与图表输出,仅供参考。 完整数据和代码将在稍后上传至交流群,成员可在交流群中获取下载。需要的朋友可关注公众文末提供的获取方式 。 购买前请咨询,避免不必要的问题。

✨ 基础知识 ✨

K-means是一种基于划分的聚类算法,通过将数据分成若干簇,使得同一簇内的数据点尽可能相似,而不同簇之间的数据点差异最大

K-Medoids也是一种聚类算法,类似于K-means,但它通过选择簇中的实际数据点作为中心(即 medoids),而不是计算均值,以提高对离群点的鲁棒性

K-medoids比K-means更容易解释,因为它使用实际的数据点作为聚类中心(medoids),而K-means计算的是每个簇的均值,后者往往缺乏实际的代表意义。接下来,从代码输出的角度来看,K-medoids的聚类结果直接与数据集中的实例相关联,使得每个簇的中心更容易被直观地理解和解释

✨ 代码实现 ✨

  
import pandas as pd  
import numpy as np  
import matplotlib.pyplot as plt  
plt.rcParams['font.family'] = 'Times New Roman'  
plt.rcParams['axes.unicode_minus'] = False  
import warnings  
# 忽略所有警告  
warnings.filterwarnings("ignore")  
  
path = r"2025-7-16公众号Python机器学习AI.xlsx"  
df = pd.read_excel(path)  
from sklearn.manifold import TSNE  
  
# 创建t-SNE对象,n_components=2表示降到二维  
tsne = TSNE(n_components=2, random_state=42)  
# 进行t-SNE降维  
tsne_components = tsne.fit_transform(df)  
tsne_df = pd.DataFrame(data=tsne_components, columns=['t-SNE1', 't-SNE2'])    
tsne_df

picture.image

使用t-SNE对高维数据进行降维,将数据压缩到二维空间,方便后续聚类结果的可视化,当然,聚类的对象仍然是原始的高维数据

  
import seaborn as sns  
tsne1_col_name = tsne_df.columns[0]  
tsne2_col_name = tsne_df.columns[1]  
fig, ax = plt.subplots(figsize=(6, 5))  
sns.scatterplot(data=tsne_df, x=tsne1_col_name, y=tsne2_col_name,  
                palette='muted', s=15, ax=ax, legend=True, alpha=0.9)  
ax.set_title('')    
ax.set_xlabel(tsne1_col_name, fontsize=18)  
ax.set_ylabel(tsne2_col_name, fontsize=18)  
ax.spines['top'].set_visible(False)  
ax.spines['right'].set_visible(False)  
ax.spines['left'].set_linewidth(1.5)  
ax.spines['bottom'].set_linewidth(1.5)  
ax.tick_params(width=1.5, labelsize=18)  
handles, labels = ax.get_legend_handles_labels()  
if handles:  
    ax.legend(loc='best', fontsize=10, title_fontsize=9, frameon=False)  
  
plt.title("raw", fontsize=18)  
plt.savefig("t-SNE.pdf", format='pdf', bbox_inches='tight', dpi=1200)  
plt.tight_layout()    
plt.show()

picture.image

绘制降维后的数据的二维散点图,代表了原始数据的一个低维可视化信息

  
from sklearn.cluster import KMeans  
  
# 创建 KMeans 模型,设定 k=2  
kmeans = KMeans(n_clusters=2, random_state=42)  
  
# 训练 KMeans 模型  
kmeans.fit(df)  
  
# 获取聚类标签  
labels_kmeans = kmeans.labels_  
tsne_df['labels_kmeans'] = labels_kmeans  
tsne1_col_name = tsne_df.columns[0]  
tsne2_col_name = tsne_df.columns[1]  
fig, ax = plt.subplots(figsize=(6, 5))  
sns.scatterplot(data=tsne_df, x=tsne1_col_name, y=tsne2_col_name, hue='labels_kmeans',  
                palette='muted', s=15, ax=ax, legend=True, alpha=0.9)  
ax.set_title('')    
ax.set_xlabel(tsne1_col_name, fontsize=18)  
ax.set_ylabel(tsne2_col_name, fontsize=18)  
ax.spines['top'].set_visible(False)  
ax.spines['right'].set_visible(False)  
ax.spines['left'].set_linewidth(1.5)  
ax.spines['bottom'].set_linewidth(1.5)  
ax.tick_params(width=1.5, labelsize=18)  
handles, labels = ax.get_legend_handles_labels()  
if handles:  
    ax.legend(loc='best', fontsize=10, title_fontsize=9, frameon=False)  
  
plt.title("K-means", fontsize=18)  
plt.savefig("K-means.pdf", format='pdf', bbox_inches='tight', dpi=1200)  
plt.tight_layout()    
plt.show()

picture.image

使用K-means聚类算法对数据进行聚类,并将聚类结果可视化为 t-SNE 降维后的二维散点图,图中不同的聚类标签用不同颜色显示

  
# 获取K-means聚类中心  
cluster_centers = kmeans.cluster_centers_  
# 创建一个 DataFrame 存储聚类中心  
cluster_centers_kmeans = pd.DataFrame(cluster_centers, columns=df.columns)  
# 添加 "Cluster" 列来表示每个中心对应的聚类类别  
cluster_centers_kmeans['Cluster'] = ['Cluster 0', 'Cluster 1']  
# 将 "Cluster" 列移到开头  
cluster_centers_kmeans = cluster_centers_kmeans[['Cluster'] + [col for col in df.columns]]  
cluster_centers_kmeans

获取K-means聚类的中心点

picture.image

为了更易于解释,不再用一个“平均值”来代表某个群体,而是希望在每个簇中找到一个真实存在的样本来作为该簇的代表。例如,在K-means聚类中,sex这一分类数据的聚类中心是 0.675214 或 0.553846,虽然这些值能反映簇的特征,但它们并不直接对应于实际的分类标签(0 或 1)。为了更直观地理解,最好选择簇内的一个实际样本来代表该簇,这样更符合数据的实际意义

当然,这里假 K=2主要是为了代码实现这一过程。在实际应用中,K值的选择并非固定,可以通过如轮廓系数、肘部法等方法来确定最佳的K值,以便更好地反映数据的聚类结构

  
from sklearn_extra.cluster import KMedoids  
  
# 创建 KMedoids 模型,设定 k=2  
kmedoids = KMedoids(n_clusters=2, random_state=42)  
  
# 训练 KMedoids 模型  
kmedoids.fit(df)  
  
# 获取聚类标签  
labels_kmedoids = kmedoids.labels_  
  
# 将 KMedoids 聚类标签添加到 DataFrame 中  
tsne_df['labels_kmedoids'] = labels_kmedoids  
tsne1_col_name = tsne_df.columns[0]  
tsne2_col_name = tsne_df.columns[1]  
fig, ax = plt.subplots(figsize=(6, 5))  
sns.scatterplot(data=tsne_df, x=tsne1_col_name, y=tsne2_col_name, hue='labels_kmeans',  
                palette='muted', s=15, ax=ax, legend=True, alpha=0.9)  
ax.set_title('')    
ax.set_xlabel(tsne1_col_name, fontsize=18)  
ax.set_ylabel(tsne2_col_name, fontsize=18)  
ax.spines['top'].set_visible(False)  
ax.spines['right'].set_visible(False)  
ax.spines['left'].set_linewidth(1.5)  
ax.spines['bottom'].set_linewidth(1.5)  
ax.tick_params(width=1.5, labelsize=18)  
handles, labels = ax.get_legend_handles_labels()  
if handles:  
    ax.legend(loc='best', fontsize=10, title_fontsize=9, frameon=False)  
  
plt.title("K-means", fontsize=18)  
plt.savefig("K-means.pdf", format='pdf', bbox_inches='tight', dpi=1200)  
plt.tight_layout()    
plt.show()

picture.image

使用K-medoids聚类算法对数据进行聚类,并将聚类结果可视化为 t-SNE 降维后的二维散点图

  
# 获取聚类中心(medoids)  
cluster_centers = kmedoids.cluster_centers_  
# 将聚类中心转换为 DataFrame  
cluster_centers_kmedoids = pd.DataFrame(cluster_centers, columns=df.columns)  
# 添加 "Cluster" 列来表示每个中心对应的聚类类别  
cluster_centers_kmedoids['Cluster'] = ['Cluster 0', 'Cluster 1']  
# 将 "Cluster" 列移到开头  
cluster_centers_kmedoids = cluster_centers_kmedoids[['Cluster'] + [col for col in df.columns]]  
cluster_centers_kmedoids

获取K-medoids聚类的中心(medoids)

picture.image

可以看到聚类的中心(medoids)是以原始数据样本作为聚类中心的,例如 "sex" 列的值为 0 或 1,分别表示女性和男性。在K-medoids聚类中,每个聚类的中心直接对应于数据集中的一个实际样本,而不是通过计算平均值得出的数值(如 0.675214)。这样,聚类中心就更加易于解释,因为它代表了实际的样本,而不是某个模糊的统计值

但是,K-means聚类算法计算效率高,适合大规模连续数据,对离群点敏感;而K-medoids对离群点鲁棒性强,适用于任意类型数据,且聚类中心易于解释,但计算复杂度较高,在下一期文章中将结合 K-medoids与SHAP进行模型解释,利用 K-medoids聚类中每个聚类的中心直接对应于数据集中的一个实际样本这个原理,关于 K-means和 K-medoids更详细的解读可以点击下方原文链接阅读

当然,公众号中还有更多机器学习期刊实战技巧,您可以通过历史文章进行检索和阅读,关注公众号,点击“发信息”>“历史文章”即可搜索公众号所有文章信息

picture.image

✨ 该文章案例 ✨

picture.image

在上传至交流群的文件中,像往期文章一样,将对案例进行逐步分析,确保读者能够达到最佳的学习效果。内容都经过详细解读,帮助读者深入理解模型的实现过程和数据分析步骤,从而最大化学习成果。

同时,结合提供的免费AI聚合网站进行学习,能够让读者在理论与实践之间实现融会贯通,更加全面地掌握核心概念。

✨ 介绍 ✨

本节介绍到此结束,有需要学习数据分析和Python机器学习相关的朋友欢迎到淘宝店铺:Python机器学习AI,下方提供淘宝店铺二维码获取作者的公众号合集。截至目前为止,合集已包含近300多篇文章,购买合集的同时,还将提供免费稳定的AI大模型使用。

更新的内容包含数据、代码、注释和参考资料。 作者仅分享案例项目,不提供额外的答疑服务。项目中将提供详细的代码注释和丰富的解读,帮助您理解每个步骤 。 获取 前请咨询,避免不必要的问题。

✨ 群友反馈 ✨

picture.image

✨ 淘宝店铺 ✨

picture.image

请大家打开淘宝扫描上方的二维码,进入店铺,获取更多Python机器学习和AI相关的内容 ,希望能为您的学习之路提供帮助!

往期推荐

期刊复现:连续数据与分类数据共存的SHAP可视化散点图与箱形图组合形式

期刊复现:多分类任务如何拆分为二分类任务并进行堆叠预测提高模型预测性能

期刊配图:SHAP模型解释多种特征重要性柱状图可视化解析

期刊配图:SHAP值分析模型可解释性在柱状图与蜂窝图中的进阶组合展示

期刊配图:通过堆叠Mean|SHAP|展示不同区间对模型贡献度的可视化分析

期刊复现:利用UMAP降维算法可视化深度学习随着训练次数的增加模型区分能力的变化

期刊配图:PCA、t-SNE与UMAP三种降维方法简化高维数据的展示应用对比

Science期刊复现:分类、回归与Shap分析多角度揭示同一数据集变量对目标的影响

多模型SHAP+PDP解读Stacking集成模型:从基学习器到元学习器的可解释性与模型调参实现

picture.image

如果你对类似于这样的文章感兴趣。

欢迎关注、点赞、转发~

个人观点,仅供参考

0
0
0
0
关于作者

文章

0

获赞

0

收藏

0

相关资源
大规模高性能计算集群优化实践
随着机器学习的发展,数据量和训练模型都有越来越大的趋势,这对基础设施有了更高的要求,包括硬件、网络架构等。本次分享主要介绍火山引擎支撑大规模高性能计算集群的架构和优化实践。
相关产品
评论
未登录
看完啦,登录分享一下感受吧~
暂无评论