使用Scala Breeze数字导致错误:没有足够的方法适用于方法

时间:2017-09-13 12:38:07

标签: scala scala-breeze

我正在使用Scala Breeze开发一个简单的分类算法。我想使用Breeze数字将不同的函数应用于我正在使用的矩阵,特别是sigmoid和tanh。单独使用sigmoid很好,但我想通过将函数指定为字符串参数然后在方法中使用它来选择sigmoid或tanh。我试过了:

// this code works
import breeze.numerics._
val H: BDM[Double] = sigmoid((M(::,*) + bias).t)

// this code throws an error
def activationFuncBreeze(af: String) = af match {
  case "sigmoid" => sigmoid
  case "tanh" => tanh
}
val H: BDM[Double] = activationFuncBreeze(af)((M(::,*) + bias).t)

错误是

Error:(60, 50) could not find implicit value for parameter impl: breeze.generic.UFunc.UImpl[_13.type,breeze.linalg.DenseMatrix[Double],VR]
val H: BDM[Double] = activationFuncBreeze(af)((M(::,*) + bias).t)

,下一个错误是:

Error:(60, 50) not enough arguments for method apply: (implicit impl: breeze.generic.UFunc.UImpl[_13.type,breeze.linalg.DenseMatrix[Double],VR])VR in trait UFunc.

未指定的值参数impl。     val H:BDM [Double] = activationFuncBreeze(af)((M(::,*)+ bias).t)

我已经查找了Breeze数字并实现了UFuncs但是sigmoid和tanh已经存在于Breeze.numerics库中作为elementwise UFuncs所以我应该能够轻松地使用它们。任何建议赞赏

1 个答案:

答案 0 :(得分:0)

将矩阵引入函数似乎有效:

def calculateH(af: String): BDM[Double] = af match {
  case "sigmoid" => sigmoid((M(::, *) + bias).t)
  case "tanh" => tanh((M(::, *) + bias).t)
  case "sin" => sin((M(::, *) + bias).t)
  case _ => throw new IllegalArgumentException("Activation function must be sigmoid, tanh, sin")
}

val H = calculateH(af)