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)
})