2015-10-23 97 views
1

我一直在玩Spark/mllib提供的高斯混合模型。Spark/Mllib以分布式方式训练许多GaussianMixture模型

我发现它非常好的载体转/分的巨大数量产生一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方法接受序列[载体]作为输入,除了 RDD [矢量]因此,程序员可以选择其他根据问题之一。

有没有办法,我缺少处理这种情况下(使用mllib)任何其他解决办法?

回答

1

Mllib遗憾的是目前并不意味着创造出许多模型,但只有一个在当时,这是在最近的一次Spark meetup in London证实。

你可以做什么在驱动一个单独的线程推出针对每个模型一个单独的作业。这在job scheduling文档中有描述。所以你可以为每个用户创建一个RDD,并在每个用户上运行一个高斯混合,运行'action'使得每个用户都在一个单独的线程上运行。

另一种选择,如果第一个实例中每个用户的数据量,你可以比Mllib别的东西每个用户做一个高斯混合。在聚会中描述了这种方法,其中在PySpark中使用sklearn来创建多个模型。你会这样做:

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

感谢您宝贵和快速的答案。当拥有大量用户时,选项2在我看来更合适一些;但是,确实很遗憾Mllib会限制这种情况。希望这将在将来以他在scala中以ML为事实标准转换图书馆的方式得到解决。 – Javier

+0

似乎他们对这个用例是开放的,只是没有人对它做过工作。正在考虑考虑如何自己整合它,但不认为我会有时间,现在替代解决方案可以正常工作。如果您认为它解决了您的问题,请随时接受我的答案。 – sgvd