python - 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
解决方案
当使用多个作业时,会为每个并行作业生成一组种子。每个作业都被初始化并运行n_init
时间,其中最好的初始化被报告回并行作业池。作业池中最好的作业被报告为最终输出。
换句话说,多个作业不会拆分任务,而是创建具有不同初始化种子的多个实例并返回最好的实例。然而,它是可重现的。random_state
当使用单个或多个作业时,使用相同的将产生相同的集群。
它不会产生与使用单个作业相同的集群,这是正确的。使用多个作业对集群位置进行更多计算,并将提供最好的结果。它应该是一个更好的质心位置
推荐阅读
- json - 展开 Postgresql 嵌套数组 Json 字段
- javascript - Firebase中的反应和节点应用程序不起作用?
- android - 哪个活动/片段/片段管理器?
- c# - 为什么 GridView 的 SortExpression 在 RowDataBound 上变空 - C#
- django - ValueError: 字段 'id' 需要一个数字,但得到了 'deleted ""' - Django Generic DeleteView
- android - 标记自定义协程调度程序,使其被视为 Dispatchers.IO
- php - 在 Laravel 6 中找不到工厂
- swift - 设置 AVCaptureSession 时 availableMetadataObjectTypes 中的空数组
- r - R dense_rank 没有排序
- java - 如何根据 Spring MVC 控制器方法的请求 URI 为 @RequestBody 参数实例化特定子类型?