1

我有一个数据集,它有 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 行数据。有没有更好/最佳的方法来实现我的结果?

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

4

1 回答 1

1

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

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

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

于 2022-01-10T14:56:22.630 回答