2016-03-23 92 views
1

我實現了我的算法在mllib中提供的默認gmm模型。 我反覆發現,無論我發起多少個集羣,總得到的權重總是等待。有沒有特定的原因爲什麼權重不被調整?我執行錯了嗎?斯卡拉火花高斯混合模型1.5.1權重總是均勻分佈

import org.apache.spark.mllib.clustering.GaussianMixture 
import org.apache.spark.mllib.clustering.GaussianMixtureModel 
import org.apache.spark.mllib.linalg.Vectors 
import org.apache.spark.ml.feature.VectorAssembler 
import org.apache.spark.ml.feature.Normalizer 
import org.apache.spark.sql.DataFrame 
import org.apache.spark.sql.DataFrameNaFunctions 

var colnames= df.columns; 
for(x<-colnames) 
{ 
    if (df.select(x).dtypes(0)._2.equals("StringType")|| df.select(x).dtypes(0)._2.equals("LongType")) 
    {df = df.drop(x)} 

} 
colnames= df.columns; 
var assembler = new VectorAssembler().setInputCols(colnames).setOutputCol("features") 
var output = assembler.transform(df) 
var normalizer= new Normalizer().setInputCol("features").setOutputCol("normalizedfeatures").setP(2.0) 
var normalizedOutput = normalizer.transform(output) 
var temp = normalizedOutput.select("normalizedfeatures") 
var outputs = temp.rdd.map(_.getAs[org.apache.spark.mllib.linalg.Vector]("normalizedfeatures")) 
var gmm = new GaussianMixture().setK(2).setMaxIterations(10000).setSeed(25).run(outputs) 

輸出代碼:

for (i <- 0 until gmm.k) { 
    println("weight=%f\nmu=%s\nsigma=\n%s\n" format 
    (gmm.weights(i), gmm.gaussians(i).mu, gmm.gaussians(i).sigma)) 
} 

,因此點的所有點相同的簇中被預測。 var ol = gmm.predict(outputs).toDF

+0

你能給一個輸入例子嗎? – eliasah

+0

這與數據無關。它發生的一切 –

+0

嘗試幾顆種子,看看你是否總是看到相同的行爲。 –

回答

1

我也有這個問題。權重和高斯總是相同的。它似乎獨立於K.

我的代碼很簡單。我的數據是雙向39維矢量。我只是這樣訓練......

val gmm = new GaussianMixture().setK(2).run(vectors) 
for (i <- 0 until gmm.k) { 
    println("weight=%f\nmu=%s\nsigma=\n%s\n" format 
    (gmm.weights(i), gmm.gaussians(i).mu, gmm.gaussians(i).sigma)) 
} 

我試過KMeans,它按預期工作。所以我認爲這必須是GaussianMixture的一個bug。

但後來我試圖聚集只是第一維,它的工作。現在我認爲這對於一些數據來說肯定是一個新興的問題,除非我有很多。

任何GMM專家在那裏?需要多少數據需要GaussianMixture和39個維度。

還是這是一個錯誤?

+0

我認爲它是。我一直無法解決這個問題。 –