背景
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
原始的Iris数据集包含的是连续型数值数据(如花瓣长度、宽度等),此代码通过将这些连续值分箱,将数据转化为离散的分类数据(low, medium, high),这样做的目的是使数据适合KModes聚类算法,因为KModes专门处理分类数据
data\_discretized.info()
利用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_)
将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()
验证KModes聚类算法在Iris数据集上的效果,通过构建混淆矩阵并将其可视化为热力图,可以清晰地看到KModes聚类结果与真实标签的匹配程度,混淆矩阵图显示,KModes算法在Iris数据集上正确识别了大多数样本,但在Versicolor和Virginica之间存在少量误分类
往期推荐
微信号|deep_ML
欢迎添加作者微信进入Python、ChatGPT群
进群请备注Python或AI进入相关群
无需科学上网、同步官网所有功能、使用无限制
如果你对类似于这样的文章感兴趣。
欢迎关注、点赞、转发~
个人观点,仅供参考
