目录

一、模型介绍

模型定义

适用场景

二、模型代码

三、可视化图表解读


你是否还在为混合数据的聚类问题头疼?一边是数值型数据(如年龄、收入),一边是分类型数据(如职业、学历),用K-Means聚类分类型数据总出错,用K-Mode聚类数值型数据又不准?

别愁!今天要给大家介绍的k-prototype聚类模型,就是解决混合数据聚“类的“一把好手”,既能处理数值型数据,又能搞定分类型数据,让聚类不再受数据类型的限制!

一、模型介绍

模型定义

k-prototype聚类是一种结合了K-Means和K-Mode两种聚类算法优点的混合聚类模型。它针对同时包含数值型和分类型属性的数据集合,通过合理的距离计算方式和原型更新规则,实现对数据的有效聚类。

其中,“原型”指的是每个簇的代表点,对于数值型属性,原型类似K-Means中的均值;对于分类型属性,原型则类似K-Mode中的众数。

图片

适用场景

当我们面对的数据集同时存在数值型和分类型数据时,k-prototype聚类就能大显身手。比如:

1.客户分群场景:客户数据中既有“消费金额”“年龄”等数值型数据,又有“性别”“会员等级”等分类型数据,用它能更精准地划分客户群体。

2.产品分类场景:产品数据里有“价格”“销量”等数值信息,还有“产品类别”“品牌”等分类型信息,可借助它实现产品的合理分类。

二、模型代码

下面以Python环境为例,用实际代码带大家实现k-prototype聚类。这里我们使用kmodes库中的KPrototypes函数。

手肘法的概念可以看上一篇k-means聚类。


# 导入所有必要的库import pandas as pdfrom kmodes.kprototypes import KPrototypesimport numpy as npimport matplotlib.pyplot as plt
# 设置中文显示plt.rcParams["font.family"] = ["SimHei"]
# 1. 准备数据(以模拟的客户数据为例)data = {    'age': [25, 30, 45, 28, 35, 50, 22, 38, 42, 55],    'income': [5000, 8000, 12000, 6000, 9000, 15000, 4500, 10000, 11000, 16000],    'gender': ['female', 'male', 'male', 'female', 'male', 'female', 'female', 'male', 'female', 'male'],    'occupation': ['student', 'engineer', 'manager', 'teacher', 'doctor', 'retired', 'student', 'engineer', 'manager', 'retired']}df = pd.DataFrame(data)# 将分类型数据转换为字符串类型categorical_cols = ['gender', 'occupation']for col in categorical_cols:    df[col] = df[col].astype(str)# 确定分类型数据所在的列索引cat_cols_idx = [df.columns.get_loc(col) for col in categorical_cols]
# 2. 用手肘法确定最佳K值costs = []K_range = range(1, 6)  # 尝试K=1到K=5for k in K_range:    kproto = KPrototypes(n_clusters=k, verbose=0, max_iter=20)    kproto.fit_predict(df, categorical=cat_cols_idx)    costs.append(kproto.cost_)# 绘制K值与成本的关系图plt.figure(figsize=(10, 4))plt.subplot(1, 2, 1)plt.plot(K_range, costs, 'bo-')plt.xlabel('簇数K')plt.ylabel('成本(总距离损失)')plt.title('手肘法确定最佳K值')
# 3. 根据手肘法结果选择最佳K值best_k = 2
# 4. 构建并训练k-prototype模型kproto = KPrototypes(n_clusters=best_k, verbose=2, max_iter=20)clusters = kproto.fit_predict(df, categorical=cat_cols_idx)# 将聚类结果添加到原数据中df['cluster'] = clustersprint("聚类结果:")print(df)
# 5. 聚类结果可视化plt.subplot(1, 2, 2)colors = ['red', 'blue']  for cluster in range(best_k):    cluster_data = df[df['cluster'] == cluster]    plt.scatter(cluster_data['age'], cluster_data['income'], c=colors[cluster], label=f'簇{cluster}')plt.xlabel('年龄')plt.ylabel('收入(元)')plt.title('k-prototype聚类结果可视化')plt.legend()plt.tight_layout()  # 调整子图布局plt.show()

三、可视化图表解读

我们将随机生成的年龄、性别、收入、职业变量放入模型,进行聚类。

左侧是手肘法的图,从图中能清晰看到成本随 K 值增加的变化趋势,找到成本下降由快转慢的 “拐点” K=2 时,这就是最佳簇数;

右侧是聚类结果散点图,以年龄为横轴、收入为纵轴,不同颜色代表不同簇。像红色的 “簇 0” 可能集中了年轻、中低收入的群体,蓝色的 “簇 1” 可能以年长、高收入群体为主,结合性别和职业信息,能进一步分析各簇的客户画像,为精准营销等决策提供依据。

图片

关注【小小科研】公众号,学习更多模型哦,感谢支持!

Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐