Spark/Mllib 以分布式方式训练多个 GaussianMixture 模型
Spark/Mllib Train many GaussianMixture models in a distributed way
我一直在研究为 spark/mllib 提供的高斯混合模型。
我发现从大量 vectors/points 中生成 GaussianMixture 真的很棒。然而,在 ML 中情况并非总是如此。通常,您不需要从无数向量生成模型,而是从几个向量生成无数模型(每个模型)(即,为具有数百个用户的数据库的每个用户构建一个 GMM)。
此时,我不知道如何继续使用 mllib,因为我看不到同时按用户和数据分发的简单方法。
示例:
Let featuresByUser = RDD[user, List[Vectors]],
the natural way to train a GMM for each user might be something like
featuresByUser.mapValues(
feats => new GaussianMixture.set(nGaussians).run(sc.parallelize(feats))
)
然而,众所周知,这在spark中是被禁止的。里面的sc.parallelize不在驱动里,所以会报错
所以问题是,
Mllib 方法是否应该接受 Seq[Vector] 作为输入,除了
RDD[Vector] 因此,程序员可以根据问题选择其中之一。
我是否缺少任何其他解决方法来处理这种情况(使用 mllib)?
不幸的是,Mllib 目前并不意味着要创建很多模型,但当时只能创建一个模型,这一点在最近的 Spark meetup in London 中得到了证实。
您可以做的是在驱动程序的单独线程中为每个模型启动单独的作业。 job scheduling 文档中对此进行了描述。因此,您将为每个用户创建一个 RDD,并在每个用户上创建一个 运行 高斯混合,运行 宁 'action' 使 运行 每个人在单独的线程上。
另一种选择,如果每个用户的数据量适合一个实例,您可以使用 Mllib 之外的其他东西对每个用户进行高斯混合。在聚会中描述了这种方法,其中 sklearn
在 PySpark 中用于创建多个模型。你会做类似的事情:
val users: List[Long] = getUsers
val models = sc.parallelize(users).map(user => {
val userData = getDataForUser(user)
buildGM(userData)
})
我一直在研究为 spark/mllib 提供的高斯混合模型。
我发现从大量 vectors/points 中生成 GaussianMixture 真的很棒。然而,在 ML 中情况并非总是如此。通常,您不需要从无数向量生成模型,而是从几个向量生成无数模型(每个模型)(即,为具有数百个用户的数据库的每个用户构建一个 GMM)。
此时,我不知道如何继续使用 mllib,因为我看不到同时按用户和数据分发的简单方法。
示例:
Let featuresByUser = RDD[user, List[Vectors]],
the natural way to train a GMM for each user might be something like
featuresByUser.mapValues(
feats => new GaussianMixture.set(nGaussians).run(sc.parallelize(feats))
)
然而,众所周知,这在spark中是被禁止的。里面的sc.parallelize不在驱动里,所以会报错
所以问题是,
Mllib 方法是否应该接受 Seq[Vector] 作为输入,除了 RDD[Vector] 因此,程序员可以根据问题选择其中之一。
我是否缺少任何其他解决方法来处理这种情况(使用 mllib)?
不幸的是,Mllib 目前并不意味着要创建很多模型,但当时只能创建一个模型,这一点在最近的 Spark meetup in London 中得到了证实。
您可以做的是在驱动程序的单独线程中为每个模型启动单独的作业。 job scheduling 文档中对此进行了描述。因此,您将为每个用户创建一个 RDD,并在每个用户上创建一个 运行 高斯混合,运行 宁 'action' 使 运行 每个人在单独的线程上。
另一种选择,如果每个用户的数据量适合一个实例,您可以使用 Mllib 之外的其他东西对每个用户进行高斯混合。在聚会中描述了这种方法,其中 sklearn
在 PySpark 中用于创建多个模型。你会做类似的事情:
val users: List[Long] = getUsers
val models = sc.parallelize(users).map(user => {
val userData = getDataForUser(user)
buildGM(userData)
})