我是GMM的新手,但我对GMM的运作方式有很好的了解。所以我有一个问题,我希望有人可以启发我。
我使用的代码是标准的Spark mllib GMM,我有一个名为Input的非索引RDD,格式为RDD(Value),我希望使用GMM.predictSoft对值进行聚类:
val Vectorize = Input.map(x=>(Vectors.dense(x)))
val Valuegmm = newGaussianMixture().setK(5).run(Vectorize)
val GMMgroup = Valuegmm.predictSoft(Vectorize).map(x=>x.indexOf(x.max))
问题是在predictSoft过程中,输入是非索引向量;因为它是一个RDD,我期望输出结果的索引被混洗(即第一个结果可能不是第一个输入的结果)。令我惊讶的是,输出结果实际上与输入匹配。有人可以帮忙解释一下这总是正确的还是我的测试数据太小而我没有经历过洗牌?
答案 0 :(得分:1)
这里没有必要洗牌。 predictSoft
是仅映射操作,其中模型的相关部分简单地广播到工作节点。这意味着应保留分区成员资格和每个分区的顺序。
一般来说,shuffle仅在合并转换期间发生(如groupBy
,combineByKey
,foldByKey
,reduceByKey
,join
等),分区和排序。