我需要训练具有特定种子值的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)))
它工作正常。但是当我尝试使用set Seed时:
km.setRandomCenters(10, 0.5).setSeed(6250L)
我收到一个错误:
value setSeed不是org.apache.spark.mllib.clustering.StreamingKMeans的成员
在这种情况下如何设置种子?
错误告诉你没有setSeed
的org.apache.spark.mllib.clustering.StreamingKMeans
成员(你可以从API docs验证;奇怪的是,这种方法确实存在于KMeans
类,但不适用于StreamingKMeans
)。
但是,一切都不会丢失...... ;-)
setRandomCenters
方法有3个参数,第三个是随机种子。它的值默认为Utils.random.nextLong
。要做你想做的事,你应该改变这一行:
km.setRandomCenters(10, 0.5).setSeed(6250L)
至:
km.setRandomCenters(10, 0.5, 6250L)
更新:顺便提一下,Spark使用函数式编程范例。因此,在.setRandomCenters
实例上调用StreamingKMeans
等方法通常不会修改(或改变)该实例。相反,它会创建一个应用了修改的新实例。
在您的代码中,您有效地放弃了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)))