Python KMeans/RF多个作业内的一致随机状态

Python KMeans/RF多个作业内的一致随机状态,python,scikit-learn,k-means,Python,Scikit Learn,K Means,我的问题是,如果我使用多个作业而不是一个作业,来自sklearn模块集群的KMeans算法会产生不同的结果,即使我设置了一个随机种子。由于我需要相同输入的结果相同,我调用了KMeans函数,如下所示 from sklearn.cluster import KMeans k_means = KMeans(n_clusters=k, init='k-means++', random_state=1, n_jobs=-1) 问题是,如果我不使用多个作业,而只使用一个作业,那么这会产生不同的结果(实际

我的问题是,如果我使用多个作业而不是一个作业,来自sklearn模块集群的KMeans算法会产生不同的结果,即使我设置了一个随机种子。由于我需要相同输入的结果相同,我调用了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\u 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   

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

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


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

谢谢你的回答。我仍然无法理解为什么结果不同。据我所知,该算法确实计算了
n_init
乘以质心,并返回最佳质心。如果需要多个作业,则并行计算此步骤(在kmeans文档中说明)。这是否意味着
n_init=10
是以拆分方式计算的,这意味着2个核分别进行5次计算,还是以“乘法”方式,这意味着2个核分别进行10次计算?在这两种情况下,我不明白为什么结果会有所不同。另外,如果不拆分任务,多个作业的速度会更快