我一直在玩为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)?
答案 0 :(得分:2)
您可以做的是在驱动程序的单独线程中为每个模型启动单独的作业。这在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)
})