高维数据集层次聚类可视化:如何实现商品维度的聚类结果展示
层次聚类商品维度可视化解决方案
结论
层次聚类完全可以实现按商品维度展示聚类结果的需求,你的现有代码逻辑本身是正确的:你的DataFrame行索引为商品,每行的特征就是该商品在所有订单中的购买数量分布,调用sch.linkage(data)时默认就是对每行(每个商品)计算距离做聚类,生成的树状图x轴已经对应商品,本质就是商品维度的聚类结果。
现有代码优化
你的代码有几处可以调整优化,保证聚类结果和可视化一致:
- 树状图生成的
linkage方法要和后续聚类的方法保持一致,避免结果不匹配 - 聚类结果直接赋值即可,无需额外转DataFrame
修正后代码如下:
import scipy.cluster.hierarchy as sch from sklearn.cluster import AgglomerativeClustering import matplotlib.pyplot as plt import pandas as pd # data为原始数据集,行索引为商品,列为订单 plt.figure(figsize=(16,8)) # linkage方法和后续聚类保持一致,此处用average和后面匹配 dendrogram = sch.dendrogram(sch.linkage(data, method="average"), labels=data.index.values) plt.title('商品层次聚类树状图') plt.xlabel('商品') plt.ylabel('欧式距离') plt.xticks(rotation=45) # 商品名称过长时可旋转避免重叠 plt.show() hc = AgglomerativeClustering(n_clusters = 5, affinity = 'euclidean', linkage ='average') y_hc = hc.fit_predict(data) data['cluster'] = y_hc
拓展可视化方案
如果需要更直观的聚类分布展示,可以先对商品特征降维再按聚类标签着色:
t-SNE降维散点图示例
from sklearn.manifold import TSNE import seaborn as sns # 降维时需排除新增的cluster列 tsne = TSNE(n_components=2, random_state=42) tsne_res = tsne.fit_transform(data.drop('cluster', axis=1)) # 绘制散点图 plt.figure(figsize=(10,8)) sns.scatterplot( x=tsne_res[:,0], y=tsne_res[:,1], hue=data['cluster'], palette=sns.color_palette("hls", 5), alpha=0.8 ) # 可按需添加商品名称标签 for idx, product_name in enumerate(data.index): plt.text(tsne_res[idx,0], tsne_res[idx,1], product_name, fontsize=8) plt.title('商品聚类结果t-SNE可视化') plt.show()
聚类结果验证
可以按簇分组输出商品列表,验证聚类效果是否符合业务预期:
for cluster in range(5): print(f"簇{cluster}包含商品:") print(data[data['cluster'] == cluster].index.tolist()) print("----------")
内容的提问来源于stack exchange,提问作者elchapo
相关产品推荐
相关产品推荐

