2015-10-23 96 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