K = 1이 허가되도록 org.apache.spark.ml.clustering.KMeans 클래스를 확장하거나 프록시하려고합니다. KMeansModel 개인 생성자를 가지고 있기 때문에개인 생성자를 사용하여 scala 클래스를 확장 (또는 프록시)하는 방법
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()
}
나는이 시도했다
하지만 new KMeansModel(centers_local)
는 권한이 없습니다. 여기 는 오류 메시지입니다 :
constructor KMeansModel in class KMeansModel cannot be accessed in class K1Means
가 나는 또한 KMeansModel을 확장하려고, 그래서 난 내 자신을 만들고 그것을 반환 할 수 있습니다
class K1MeansModel(centers: Array[DenseVector]) extends KMeansModel{}
을 그러나 그것은 또한 실패 : constructor KMeansModel in class KMeansModel cannot be accessed in class K1MeansModel
문서가 사용자의 의견에 어긋나는 것 같습니다. https://spark.apache.org/docs/1.6.0/api/java/org/apache/spark/ml/clustering/KMeansModel.html 공개적으로 보입니다. –
질문을 편집하고 실제 오류 메시지를 제공 할 수 있습니까? –
좋습니다. 다시 말해야합니다. 생성자가 비공개 인 것은 어쩌면 올바른 방법 일 수 있습니다.KMeans에 의해서만 인스턴스화 될 수 있습니다. – Borbag