Python KMeans/RF多个作业内的一致随机状态
我的问题是,如果我使用多个作业而不是一个作业,来自sklearn模块集群的KMeans算法会产生不同的结果,即使我设置了一个随机种子。由于我需要相同输入的结果相同,我调用了KMeans函数,如下所示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) 问题是,如果我不使用多个作业,而只使用一个作业,那么这会产生不同的结果(实际
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次计算?在这两种情况下,我不明白为什么结果会有所不同。另外,如果不拆分任务,多个作业的速度会更快