k-prototypes聚类算法

引言

数据变量为单一的数值型和单一的类别型的聚类算法之前都已经介绍过了,但是实际的数据大多数是数值型和类别型变量混合。针对混合型变量的数据,采用k-prototypes算法进行聚类。

k-prototypes算法

k-prototypes算法在聚类的过程中,是将数据的数值型变量和类别型变量拆开,分开计算样本间变量的距离,再将两者相加,视为样本间的距离。
k-prototypes聚类的准则就是使用一个合适的损失函数去度量数值型和分类变量对原型的距离;

k-prototypes算法步骤:
1.随机选取k个初始原型(中心点);
2.针对数据集中的每个样本点,计算样本点与k个原型的距离(数值型变量计算欧氏距离,类别型变量计算汉明距离),将样本点划分到离它最近的中心点所对应的类别中;
3.类别划分完成后,重新确定类别的原型,数值型变量样本取值的均值作为新的原型的特征取值,类别型变量样本取值的众数作为新的原型的特征取值;
4.重复步骤2 3,直到没有样本改变类别,返回最后的聚类结果。

算法总结:
1)基于“众心”和“质心”的聚类方法;
2)数值型变量和类别型变量混合数据聚类方法。

python实现

#加载所需模块
import numpy as np
import pandas as pd
from kmodes.kprototypes import KPrototypes
%matplotlib inline
import matplotlib.pyplot as plt
import seaborn as sns
from sklearn import preprocessing
#数据预处理
data_num = data[['aa','bb']]
data_cat = data[['cc','dd']]
le = preprocessing.LabelEncoder()
data_cat = data_cat.apply(le.fit_transform) #类别型变量如果不是数值,需要先做LabelEncode
data[columns_to_normalize] = data[columns_to_normalize].apply(lambda x: (x - x.mean()) / np.std(x)) #数值型变量做标准化处理,类别型变量如果不是数值,需要先做LabelEncode
data = data.values #转化为数组
#模型训练不同的类别数对应的SSE及模型
def TrainCluster(df, model_name=None, start_k=2, end_k=20):
    print('training cluster')
    #df = StandardScaler().fit_transform(df) #数据标准化
    K = []
    SSE = []
    silhouette_all=[]
    models = [] #保存每次的模型
    for i in range(start_k, end_k):
        kproto_model = KPrototypes(n_clusters=i, n_jobs=multiprocessing.cpu_count())
        kproto_model.fit(df,categorical=cate_index)
        SSE.append(kproto_model.cost_)  # 保存每一个k值的SSE值
        K.append(i)
        print('{}-prototypes SSE loss = {}'.format(i, kproto_model.cost_))
        models.append(kmeans_model) #保存每个k值对应的模型

    return(K,SSE,models)
#用肘部法则来确定最佳的K值
train_cluster_res = TrainCluster(data,model_name=None, start_k=2, end_k=20 )
K = train_cluster_res[0]
SSE = train_cluster_res[1]
plt.plot(K, SSE, 'bx-')
plt.xlabel('聚类类别数k')
plt.ylabel('SSE')
plt.xticks(K)
plt.title('用肘部法则来确定最佳的k值')
plt.show()
#确定了最佳的k值后
models = train_cluster_res[2]
best_model = models[K.index(k)]
  • 7
    点赞
  • 89
    收藏
    觉得还不错? 一键收藏
  • 14
    评论
k-prototypes是一种聚类算法,它结合了k-means算法和k-modes算法,适用于同时包含数值型和分类型数据的数据集聚类问题。k-prototypes算法在R语言中有多种实现方式。 在R语言中,可以使用"clustMixType"包来进行k-prototypes聚类。该包提供了一个名为"kmodesCluster"的函数来执行聚类操作。需要注意的是,该包需要先进行一些前期处理,将分类型数据转换为哑变量形式。 另一个常用的R包是"clustMixType",该包提供了一个名为"kproto"的函数,用于执行k-prototypes聚类。与"clustMixType"包不同的是,"kproto"函数可以直接接收原始的混合数据作为输入。 使用这些包进行k-prototypes聚类的步骤如下: 1. 加载相关的R包,如"clustMixType"或"clustMixType"。 2. 准备数据集,包括数值型和分类型变量。 3. 如果使用"clustMixType"包,需要将分类型变量转换为哑变量形式。 4. 根据算法要求,选择合适的k值。 5. 调用相应的函数,执行k-prototypes聚类。 6. 获取聚类结果,可以查看每个观测值所属的聚类类别。 7. 进一步分析和解释聚类结果,可以绘制聚类图像、计算类别间的距离等。 总之,在R语言中可以利用"clustMixType"包或"clustMixType"包中的函数来进行k-prototypes聚类。通过合适的数据处理和参数选择,我们可以得到包含数值型和分类型变量的数据集的聚类结果,进而进行深入的分析和解释。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 14
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值