我需要训练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)
我遇到错误:
value setSeed不是org.apache.spark.mllib.clustering.StreamingKMeans的成员
在这种情况下如何设置种子?
答案 0 :(得分:2)
错误告诉您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
之类的方法通常不会修改(或 mutate )该实例。相反,它将创建一个新实例并对其应用修改。
在代码中,由于没有存储结果,因此有效地放弃了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)))