首页 > 解决方案 > KMeans/RF 的多个作业中的一致随机状态

问题描述

我的问题是,如果我使用多个作业而不是一个作业,来自 sklearn 模块聚类的 KMeans-Algorithm 会产生不同的结果,即使我确实设置了随机种子。由于我需要相同输入的结果相同,因此我调用了 KMeans 函数,如下所示

from sklearn.cluster import KMeans
k_means = KMeans(n_clusters=k, init='k-means++', random_state=1, n_jobs=-1)

这样做的问题是,与我不使用多个作业而只使用一个作业相比,这会产生不同的(实际上在我的整体计算中更糟糕)的结果。谁能告诉我如何解决这个问题?如果尝试设置一个RandomState实例

    rand_state = np.random.RandomState(1)
    k_means = KMeans(n_clusters=k, init='k-means++', random_state=rand_state, n_jobs=-1)

但这也不能通过仅一项工作提供相同功能的一致结果。

此外,由于我必须对大量数据进行一些非常繁重的聚类,我真的很想使用多个作业来节省时间。顺便说一句,我在使用随机森林回归时也遇到了同样的问题。

用于澄清的玩具示例

所以我使用的功能如下:

def find_cluster_centers(timeseries, k):
    k_means = KMeans(n_clusters=k, init='k-means++', random_state=1, n_jobs=-1)
    k_means.fit(timeseries)
    return k_means.cluster_centers_

然后我创建了一个随机矩阵并使用聚类方法一次n_jobs=1和一次n_jobs=-1。结果果然不一样!

这个是与n_jobs=1

random_ts = np.random.normal(0,1,(10000,100))
single_job = find_cluster_centers(random_ts, 100)  
single_job _df = pd.DataFrame(single_job )
single_job _df.head()

         0         1         2         3         4         5         6   \
0 -0.848288  0.589338 -0.006344  0.257509 -0.119400  0.000149  0.262761   
1 -0.629481 -0.159716  0.590887 -0.343553  1.229933 -0.353534 -0.031462   
2  0.390420 -0.407103  0.032059 -0.213350 -0.145259  0.897559  0.259399   
3 -0.278780  0.028879 -0.287944 -0.219377  0.296087 -0.312260  0.108674   
4  0.152551  0.060320  0.222156  0.290888 -0.279436 -0.290054  0.374626

这是与n_jobs=-1

multiple_jobs = find_cluster_centers(random_ts, 100)
multiple_jobs _df = pd.DataFrame(multiple_jobs )
multiple_jobs _df.head()

         0         1         2         3         4         5         6   \
0  0.112666  0.206470  0.212597 -0.016386  0.086566  0.287404 -0.109466   
1  0.344165  0.224839  0.106922  0.385593  0.065500 -0.089228 -0.489109   
2 -0.520918 -0.165296 -0.018160  0.201272  0.096660  0.665532  0.061834   
3  0.325803  0.164303  0.417824 -0.149116  0.512074  0.335293  0.367367   
4  0.278681  0.077819 -0.078964  0.355309  0.129788 -0.333567  0.384981   

标签: pythonscikit-learnk-means

解决方案


当使用多个作业时,会为每个并行作业生成一组种子。每个作业都被初始化并运行n_init时间,其中最好的初始化被报告回并行作业池。作业池中最好的作业被报告为最终输出。

换句话说,多个作业不会拆分任务,而是创建具有不同初始化种子的多个实例并返回最好的实例。然而,它是可重现的。random_state当使用单个或多个作业时,使用相同的将产生相同的集群。

它不会产生与使用单个作业相同的集群,这是正确的。使用多个作业对集群位置进行更多计算,并将提供最好的结果。它应该是一个更好的质心位置


推荐阅读