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

问题描述 投票:1回答:1

我一直在玩为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)?

scala apache-spark apache-spark-mllib
1个回答
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)
})
© www.soinside.com 2019 - 2024. All rights reserved.