Ich versuche, die org.apache.spark.ml.clustering.KMeans-Klasse zu erweitern, oder Proxy, so dass K = 1 autorisiert ist.Wie zu erweitern (oder Proxy) eine Scala-Klasse mit privaten Konstruktor
class K1Means extends Estimator{
final val kmeans = new KMeans()
val k = 1
override def setK(value:Int) {
if(value >1){
this.kmeans.setK(value)
}
}
override def fit(dataset: DataFrame): KMeansModel = {
if(this.k == 1){
/* super specific to my case */
val avg_sample = Vectors.zeros(
dataset
.select("scaledFeatures")
.take(1)(0)(0) // first row
.asInstanceOf[DenseVector] // was of type Any
.size
) // with the scaling the average value of each column is 0
var centers_local = Array(avg_sample)
return new KMeansModel(centers_local)
}
else{
return this.kmeans.fit(dataset)
}
}
// every method then calls this.kmeans.method()
}
ich das versucht habe, aber new KMeansModel(centers_local)
ist nicht berechtigt, da KMeansModel einen privaten Konstruktor hat. Hier ist die Fehlermeldung:
constructor KMeansModel in class KMeansModel cannot be accessed in class K1Means
Ich habe auch versucht KMeansModel zu verlängern, so kann ich meine eigene erstellen und senden Sie es:
class K1MeansModel(centers: Array[DenseVector]) extends KMeansModel{}
Aber es scheitert auch: constructor KMeansModel in class KMeansModel cannot be accessed in class K1MeansModel
Die Dokumente scheint nicht mit Ihnen zu stimmen: https://spark.apache.org/docs/1.6.0/api/java/org/apache/spark/ml/clustering/KMeansModel.html sieht mir öffentlich –
Können Sie Ihre Frage bearbeiten und die eigentliche Fehlermeldung ausgeben? –
Ok, ich muss neu formulieren. Der Konstruktor ist privat, vielleicht ist es der richtige Weg, es zu sagen.Es kann nur von KMeans instanziiert werden. – Borbag