Я пытаюсь расширить или проксировать класс org.apache.spark.ml.clustering.KMeans, такой, что разрешено K = 1.Как расширить (или прокси) класс 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)
не разрешается, так как KMeansModel имеет закрытый конструктор. Вот сообщение об ошибке:
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