如何使用 Kmeans 聚类为数据中的每个组找到最佳 K

How to find Optimal K for each group in data with Kmeans clustering

我有一个数据集,该数据集有 10 个不同的组和一年中 3 周的销售额。我正在尝试 运行 一种聚类算法,该算法根据每个组中存在的项目数量对每个组进行聚类。基本上,我想区别对待每个组。

我尝试了一种手动方法,并将每个组的集群设置为相对于项目数最多的组,但我想让代码为每个组的 kmeans 找到最佳 k。我不确定如何确定每个组的最佳 k

这是数据:

items_scaled = 
PROD    LOB_LABEL    1         2           3    
100001  Books   0.022556    0.020326    0.020556    
100002  Books   0.023756    0.080306    0.020656
100003  Candles 0.022966    0.020178    0.020291    
100004  Shoes   0.021067    0.020485    0.019420    
100005  Candles 0.020403    0.021067    0.020556
100006  Shoes   0.023634    0.026219    0.029357
100007  Books   0.022472    0.017218    0.016454
100008  Pens    0.023670    0.027971    0.029763
100009  Pens    0.037894    0.026664    0.031777
100010  Shoes   0.015929    0.015205    0.015446    
....

这是我关于如何找到最佳 k 的试验,但 运行时间真的很长。按照这个速度,运行 可能需要一天或更长时间。我正在处理 3500 行数据。有没有 better/optimal 方法来实现我的结果?

silhouette = []
# count = 0
# K = range(2, len(items))
for lob in item_df['LOB_LABEL'].unique():
    items = item_df[item_df['LOB_LABEL']==lob]
    items_scaled = items.iloc[:, 2:54]
    K = range(2, len(items))
    for k in tqdm(K):
        kmeanModel = TimeSeriesKMeans(n_clusters=k, metric="dtw", n_jobs=6, max_iter=10, n_init=5)
        kmeanModel.fit(items_scaled)
        silhouette.append(silhouette_score(items_scaled, kmeanModel.labels_, metric="dtw"))
        print(lob,max(silhouette),k)
#     if count == 0:
#         break
#     count += 1

最佳簇数取决于您的假设,例如等于最大的项目数,或者您可以根据经验确定它。为此,您 运行 针对不同数量的 k 的算法并计算聚类的误差,例如通过计算聚类的所有成员与聚类中心之间的 MSE。然后,您必须在可接受的错误(很可能随着集群的数量而减少)和大量的集群是否仍然对手头的任务有意义之间做出决定。

为了降低经验方法的时间复杂度,您可以更改三个变量:K 的最大值、迭代次数和参数扫描中使用的样本数。如果你想要最优化的解决方案,你最好花一天时间来 运行 这个。但是,如果您时间紧迫或怀疑您需要在某个时候重新运行,我建议您使用数据的子集进行超参数搜索。

更实际地说,我想你会找到k << len(items,所以你的搜索范围可能会大大缩小。将其与数据点的子集相结合,您应该会节省很多时间。