2016-03-23 35 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

我认为它是。我一直无法解决这个问题。 –