scala spark 1.5.1权重中的高斯混合模型总是均匀分布

时间:2016-03-23 02:01:10

标签: scala apache-spark apache-spark-mllib

我为我的算法实现了mllib中提供的默认gmm模型。 我反复发现,无论我发起多少簇,所得到的权重总是等同。是否有任何具体原因没有调整权重?我实施错了吗?

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

1 个答案:

答案 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的错误。

但后来我尝试只聚集第一个维度,并且它有效。现在我认为对于小数据来说它一定是EM问题......除了我有很多。

那里有GMM专家吗?需要多少数据需要GaussianMixture和39维。

或者这毕竟是一个错误?

相关问题