我正在尝试使用Scala的breeze lib估算数据集的参数(Dirichlet分布)。我已经有一个工作的python(pandas / dataframes)和R代码,但我很好奇如何在Scala中做到这一点。我也是Scala的新手。
我似乎无法让它发挥作用。我猜在语法上我没有正确的东西。
根据上面的代码:ExpFam [T,I]接受两个参数T和I.我不知道T和I是什么。 T可以是密集矩阵吗?
我在做的是:
# Creating a matrix. The values are counts in my case.
val mat = DenseMatrix((1.0, 2.0, 3.0),(4.0, 5.0, 6.0))
# Then try to get sufficient stats and then MLE. I think this where I doing something wrong.
val diri = new ExpFam[DenseMatrix[Double],Int](mat)
println(diri.sufficientStatisticFor(mat))
此外,如果有一个像DenseMatrix((1.0,2.0,3.0),(4.0,5.0,6.0)这样的数据矩阵),如何在Scala中估计参数(Dirichlet)。
答案 0 :(得分:2)
我对微风这方面并不是很熟悉,但这对我有用:
val data = Seq(
DenseVector(0.1, 0.1, 0.8),
DenseVector(0.2, 0.3, 0.5),
DenseVector(0.5, 0.1, 0.4),
DenseVector(0.3, 0.3, 0.4)
)
val expFam = new Dirichlet.ExpFam(DenseVector.zeros[Double](3))
val suffStat = data.foldLeft(expFam.emptySufficientStatistic){(a, x) =>
a + expFam.sufficientStatisticFor(x)
}
val alphaHat = expFam.mle(suffStat)
//DenseVector(2.9803000577558274, 2.325871404559782, 5.850530402841005)
结果与Dirichlets的最大似然估计得到的结果非常接近但不完全相同。差异可能只取决于所使用的优化器的差异(我在T.Minka的paper的第1部分中使用了定点迭代(9))和停止标准。
使用breeze api可能有更好的方法。如果是这样的话,希望@dlwh或其他更熟悉微风的人会参与进来。
答案 1 :(得分:1)
T应该是DenseVector,我应该是Int。 ExpFams现在没有矢量化。