KModes是一种无监督机器学习算法,专门用于对分类变量进行聚类。与基于距离度量的聚类算法不同,KModes通过识别每个聚类中的主要或最频繁值来确定其质心。KModes非常适合对分类数据进行聚类,例如客户人口统计、市场细分或调查响应。它是数据分析师和科学家洞察数据并做出明智决策的强大工具。
KMeans使用数学度量(距离)来聚类连续数据。距离越小,数据点越相似。质心通过均值更新。但对于分类数据点,无法计算距离。因此,选择KModes算法。它使用数据点之间的不相似性(总不匹配数)。不相似性越小,数据点越相似。它使用众数而不是均值。
与层次聚类方法不同,需要预先指定K值。KModes算法的工作步骤如下:
通过一个例子来说明KModes算法的工作步骤。假设有一个数据集,包含了人们的发色、眼色和肤色信息。目标是根据这些信息将人们分组(可能是为了推荐一些造型建议)。发色、眼色和肤色都是分类变量。以下是数据集的样子。
首先,需要导入必要的库。
import pandas as pd
import numpy as np
# !pip install kmodes
from kmodes.kmodes import KModes
import matplotlib.pyplot as plt
%matplotlib inline
创建一个玩具数据集。
import pandas as pd
import numpy as np
# 创建玩具数据集
hair_color = np.array(['blonde', 'brunette', 'red', 'black', 'brunette', 'black', 'red', 'black'])
eye_color = np.array(['amber', 'gray', 'green', 'hazel', 'amber', 'gray', 'green', 'hazel'])
skin_color = np.array(['fair', 'brown', 'brown', 'brown', 'fair', 'brown', 'fair', 'fair'])
person = ['P1','P2','P3','P4','P5','P6','P7','P8']
data = pd.DataFrame({'person':person, 'hair_color':hair_color, 'eye_color':eye_color, 'skin_color':skin_color})
data = data.set_index('person')
print(data)
为了找到最佳的K值,可以绘制成本曲线。成本是聚类间所有不相似性的总和。选择成本值较小且出现肘部弯曲的K值。
# 肘部曲线以找到最佳K值
cost = []
K = range(1,5)
for num_clusters in list(K):
kmode = KModes(n_clusters=num_clusters, init = "random", n_init = 5, verbose=1)
kmode.fit_predict(data)
cost.append(kmode.cost_)
plt.plot(K, cost, 'bx-')
plt.xlabel('No. of clusters')
plt.ylabel('Cost')
plt.title('Elbow Method For Optimal k')
plt.show()
可以看到,当K=3时,曲线出现弯曲,表明3是最佳聚类数。
# 使用3个聚类构建模型
kmode = KModes(n_clusters=3, init = "random", n_init = 5, verbose=1)
clusters = kmode.fit_predict(data)
clusters
data.insert(0, "Cluster", clusters, True)
data