使用 Scala-Breeze 的 SBT 编译器崩溃

SBT Compiler crash using Scala-Breeze

我正在编写代码来执行内核 K-Means(又名 https://en.wikipedia.org/wiki/K-means_clustering,但有一个技巧)。我需要生成数据,作为第一个简单的生成器,我尝试实现高斯混合模型。这是我的代码:

package p02kmeans

import breeze.linalg._
import breeze.stats.distributions._

/**
 * First data generation is simple, gaussian mixture model.
 */
object Data {
  class GaussianClassParam (
      val mean: Double,
      val sd: Double)

  /**
   * @param proportion marginal probability for each label
   * @param param param[j][k] returns the GaussianClassParam for the k class of the j variable
   * @param nObs number of observations to be generated
   * @result DenseMatrix_ij where i is the observation index and j is the variable number
   */
  def gaussianMixture(
      proportion: DenseVector[Double],
      param: Vector[Vector[GaussianClassParam]],
      nObs: Int)
  : DenseMatrix[Double] = {
    val nVar = param.size
    val multiSampler = Multinomial(proportion) // sampler for the latent class
    val varSamplerVec = param.map(v => v.map(c => Gaussian(c.mean, c.sd)))
    val zi = DenseVector.fill[Int](nObs)(multiSampler.sample)

    val data = DenseMatrix.tabulate[Double](nObs, nVar)((i, j) => varSamplerVec(j)(zi(i)).sample)

    return data
  }
}

当我尝试编译我的代码时(我在 Windows 10 上使用 Scala-Ide 和 sbt eclipse)我得到 2 个错误:

错误由以下行触发:

val data = DenseMatrix.tabulate[Double](nObs, nVar)((i, j) => varSamplerVec(j)(zi(i)).sample)

然后消失:

val data = DenseMatrix.tabulate[Double](nObs, nVar)((i, j) => 12.0)

你能帮我调试一下吗?

我的 sbt 配置:

name := "Sernel"

version := "1.0"

scalaVersion := "2.11.8"

libraryDependencies  ++= Seq(
  "org.scalanlp" %% "breeze" % "0.13.1",
  "org.scalanlp" %% "breeze-natives" % "0.13.1",
  "org.scalanlp" %% "breeze-viz" % "0.13.1"
)

我的 OSX 设置也有同样的错误。

如果你想测试整个包(比如,如果你想重现错误),代码可以在 Github: https://github.com/vkubicki/sernel 上找到,我可以提供指导: ).

这似乎是一个编译器错误(我想在 scala macroses 中,因为 Breeze 正在使用它们)。您可以尝试在项目中执行完全清理(甚至可能包括 .ivy2 文件夹 - 这可能是您的 MacOS 和 Windows 设置之间的差异)并将您的 scala 更新到 2.11.11(或者甚至可能2.12.x)

然而,Scala 2.11.6 的类似问题(有些东西告诉我它在 Scala 的后续版本中继承)没有得到解决:https://issues.scala-lang.org/browse/SI-9284

因此,有时您可能不得不重复执行清理操作,或者尝试使用其他一些 NumPy 类似物,例如:scalala,Nd4j/Ndjs。

尝试另一个 IDE (IDEA/Atom) 或尝试使用 "bare" SBT 也可能有所帮助,因为 Eclipse 可能会通过调用 Scala 的编译器前端进行干扰。