Spark / Mllib以分布式方式训练许多GaussianMixture模型

时间:2015-10-23 07:34:21

标签: scala apache-spark apache-spark-mllib

我一直在玩为spark / mllib提供的高斯混合模型。

我发现从大量的矢量/点生成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))
)

然而,众所周知,这是禁止火花的。内部sc.parallelize不在驱动程序中,因此会导致错误。

所以问题是,

Mllib方法应该接受Seq [Vector]作为输入 RDD [Vector]因此,程序员可以根据问题选择其中一个。

我是否有任何其他解决方法可以解决此问题(使用mllib)?

1 个答案:

答案 0 :(得分:2)

不幸的是,Mllib目前并不打算创建许多模型,但当时只有一个模型,最近在Spark meetup in London确认了。

您可以做的是在驱动程序的单独线程中为每个模型启动单独的作业。这在job scheduling文档中有所描述。因此,您将为每个用户创建一个RDD,并在每个用户上运行高斯混合,运行' action'这使得事物在一个单独的线程上运行。

另一种选择,如果每个用户的数据量适合一个实例,则可以使用除Mllib之外的其他内容对每个用户执行高斯混合。在PySpark中使用sklearn来创建多个模型的情况下,会议中描述了这种方法。你可以这样做:

val users: List[Long] = getUsers
val models = sc.parallelize(users).map(user => {
  val userData = getDataForUser(user)
  buildGM(userData)
})