KModes:专为离散型特征变量设计的聚类算法

picture.image

背景

KModes算法是一种用于处理离散型(或分类)特征变量的聚类算法,它是KMeans算法的扩展,但专门针对分类数据,与KMeans不同,KMeans使用欧氏距离来计算样本之间的相似度,适用于连续数据,而KModes使用了分类数据的模式(mode)和简单匹配相似度来进行聚类

KModes的基本原理

  • 初始化:随机选择K个初始聚类中心(称为模态),这些中心是数据集中实际存在的记录
  • 分配样本到聚类:对于每一个样本,计算它与所有模态的相似度(通常使用汉明距离),将样本分配给最相似的模态
  • 更新模态:对每个聚类中的样本,计算每个特征的众数,更新该聚类的模态
  • 重复:重复分配样本和更新模态的步骤,直到模态不再发生变化或达到预定的迭代次数

KModes的优点

  • 能够有效处理纯分类数据,不需要将其转化为数值类型
  • 由于其简单的相似度计算,KModes的计算效率较高

KModes的缺点

  • 和KMeans类似,KModes也依赖于初始聚类中心的选择,容易陷入局部最优解
  • 需要预先指定聚类的数量K

代码实现

数据整理


          
from kmodes.kmodes import KModes
          
from sklearn.datasets import load_iris
          
import pandas as pd
          

          
# 加载示例数据集(Iris数据集)
          
data = load_iris()
          
df = pd.DataFrame(data.data, columns=data.feature_names)
          

          
# 这里是一个简单的将连续值转为分类值的例子(实际场景中可能需要更复杂的处理)
          
data_discretized = df.apply(lambda x: pd.cut(x, bins=3, labels=['low', 'medium', 'high']))
          
data_discretized
      

picture.image

原始的Iris数据集包含的是连续型数值数据(如花瓣长度、宽度等),此代码通过将这些连续值分箱,将数据转化为离散的分类数据(low, medium, high),这样做的目的是使数据适合KModes聚类算法,因为KModes专门处理分类数据


        
            

          data\_discretized.info()
        
      

picture.image

利用info()输出数据的基本信息,可以发现每一列的数据类型已经变为了category

KModes算法实现


          
# 使用KModes进行聚类
          
km = KModes(n_clusters=3, init='Huang', n_init=5, verbose=1)
          

          
clusters = km.fit_predict(data)
          

          
# 输出聚类结果
          
print("聚类结果:", clusters)
          
print("聚类中心:\n", km.cluster_centroids_)
      

picture.image

将Iris数据集中的样本进行聚类,并观察KModes算法如何将样本分配到不同的簇中,由于Iris数据集本身有3个类别,代码中设置了3个簇,以验证KModes是否能够正确地识别这些类别

验证KModes算法


          
# 创建一个DataFrame来存放聚类结果和真实标签
          
result_df = pd.DataFrame({
          
    'Cluster Label': clusters,
          
    'True Label': data.target
          
})
          

          
from sklearn.metrics import confusion_matrix
          
import seaborn as sns
          
import matplotlib.pyplot as plt
          

          
# 输出混淆矩阵
          
conf_matrix = confusion_matrix(result_df['True Label'], result_df['Cluster Label'])
          

          
# 绘制热力图
          
plt.figure(figsize=(10, 7), dpi=1200)
          
sns.heatmap(conf_matrix, annot=True, annot_kws={'size':15}, 
          
            fmt='d', cmap='YlGnBu', cbar_kws={'shrink': 0.75})
          
plt.xlabel('Predicted Label', fontsize=12)
          
plt.ylabel('True Label', fontsize=12)
          
plt.title('KModes Clustering Confusion Matrix', fontsize=15)
          
plt.show()
      

picture.image

验证KModes聚类算法在Iris数据集上的效果,通过构建混淆矩阵并将其可视化为热力图,可以清晰地看到KModes聚类结果与真实标签的匹配程度,混淆矩阵图显示,KModes算法在Iris数据集上正确识别了大多数样本,但在Versicolor和Virginica之间存在少量误分类

往期推荐

利用SHAP解释二分类模型的四种机器学习GUI工具

模型过拟合与欠拟合的核心原理及其与数据集分割的关系

复现顶刊Streamlit部署预测模型APP

数据预处理全攻略:从缺失值到特征工程,一站式解决方案

精确度与参数的完美融合:用可视化解读模型优化过程

优化XGBoost回归模型:网格搜索与K折交叉验证实现

提升机器学习精度:利用SHAP值与蒙特卡洛模拟优化特征选择

特征选择:基于随机森林的Boruta算法应用

picture.image

picture.image

picture.image

微信号|deep_ML

欢迎添加作者微信进入Python、ChatGPT群

进群请备注Python或AI进入相关群
无需科学上网、同步官网所有功能、使用无限制

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

欢迎关注、点赞、转发~

个人观点,仅供参考

0
0
0
0
评论
未登录
暂无评论