我需要使用特定的种子值来训练 StreamingKMeans。当我运行时
val km = new StreamingKMeans(3, 1.0, "points")
km.setRandomCenters(10, 0.5)
val newmodel = km.latestModel.update(featureVectors, 1.0, "points")
val prediction3 = id_features.map(x=> (x._1, newmodel.predict(x._2)))
效果很好。但是当我尝试使用 sedSeed 时:
km.setRandomCenters(10, 0.5).setSeed(6250L)
我收到错误:
值 setSeed 不是 org.apache.spark.mllib.clustering.StreamingKMeans 的成员
在这种情况下如何设置种子?
最佳答案
该错误告诉您,org.apache.spark.mllib.clustering.StreamingKMeans
中没有 setSeed
成员(您可以从 API docs 进行验证) ;奇怪的是,这个方法确实存在于 KMeans
类中,但不存在于 StreamingKMeans
中)。
但是,一切并没有失去......;-)
setRandomCenters
方法采用 3 个参数,其中第三个参数是随机种子。它的值默认为Utils.random.nextLong
。要执行您想要的操作,您应该将该行更改为:
km.setRandomCenters(10, 0.5).setSeed(6250L)
至:
km.setRandomCenters(10, 0.5, 6250L)
更新:顺便说一句,Spark 使用函数式编程范例。因此,在 StreamingKMeans
实例上调用诸如 .setRandomCenters
之类的方法通常不会修改(或变异)该实例。相反,它会创建一个应用了修改的新实例。
在您的代码中,您实际上放弃了 SetRandomCenters
所做的更改,因为您不存储结果。您的代码应该看起来更像这样:
val km = new StreamingKMeans(3, 1.0, "points").setRandomCenters(10, 0.5)
val newmodel = km.latestModel.update(featureVectors, 1.0, "points")
val prediction3 = id_features.map(x=> (x._1, newmodel.predict(x._2)))
关于scala - StreamingKMeans setSeed(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54699079/