如何调用此构造函数?

时间:2013-07-12 14:40:18

标签: scala

此类(https://github.com/scalanlp/nak/blob/20637cfd6f373792b7d2fb4d9c965c0a6dac89d9/src/main/scala/nak/cluster/Kmeans.scala)具有构造函数:

class Kmeans(
  points: IndexedSeq[Point],
  distance: DistanceFunction,
  minChangeInDispersion: Double = 0.0001,
  maxIterations: Int = 100,
  fixedSeedForRandom: Boolean = false
)

距离函数是具有特征的对象 (https://github.com/scalanlp/nak/blob/ae8fc0c534ea0613300e8c53487afe099327977a/src/main/scala/nak/cluster/Points.scala):

trait DistanceFunction extends ((Point, Point) => Double)

/**
 * A companion object to the DistanceFunction trait that helps select the
 * DistanceFunction corresponding to each string description.
 */
object DistanceFunction {
  def apply(description: String) = description match {
    case "c" | "cosine" => CosineDistance
    case "m" | "manhattan" => ManhattanDistance
    case "e" | "euclidean" => EuclideanDistance
    case _ => throw new MatchError("Invalid distance function: " + description)
  }
}

/**
 * Compute the cosine distance between two points. Note that it is a distance
 * because we subtract the cosine similarity from one.
 */
object CosineDistance extends DistanceFunction {
  def apply(x: Point, y: Point) = 1 - x.dotProduct(y) / (x.norm * y.norm)
}

/**
 * Compute the Manhattan (city-block) distance between two points.
 */
object ManhattanDistance extends DistanceFunction {
  def apply(x: Point, y: Point) = (x - y).abs.sum
}

/**
 * Compute the Euclidean distance between two points.
 */
object EuclideanDistance extends DistanceFunction {
  def apply(x: Point, y: Point) = (x - y).norm
}

到目前为止,这是我的构造函数实现:

val p1 = new Point(IndexedSeq(0.0, 0.0 , 3.0));
val p2 = new Point(IndexedSeq(0.0, 0.0 , 3.0));
val p3 = new Point(IndexedSeq(0.0, 0.0 , 3.0));

val clusters1 =  IndexedSeq( p1 , p2 , p3 )

val k = new Kmeans(clusters1 , ??????

如何创建DistanceFunction实现以实现Kmeans构造函数?我可以使用现有的DistanceFunction对象吗?

1 个答案:

答案 0 :(得分:1)

您不能使用DistanceFunction伴随对象 - it is just a place where statics for corresponding trait/class are placed,但您可以使用提供的对象来扩展特征:CosineDistance,ManhattanDistance或EuclideanDistance:

val k = new Kmeans(clusters1 , CosineDistance, ... )

如果你想创建自己的实现,你已经有了一个例子:

object ManhattanDistance extends DistanceFunction {
  def apply(x: Point, y: Point) = (x - y).abs.sum
}

或与班级:

class ManhattanDistance extends DistanceFunction {
  def apply(x: Point, y: Point) = (x - y).abs.sum
}
val k = new Kmeans(clusters1 , new ManhattanDistance(), ... )