Оценка параметров распределения Дирихле в Scala Breeze

Я пытаюсь оценить параметры (распределение Дирихле) для набора данных, используя библиотеку Scala breeze. У меня уже есть рабочий python (pandas/dataframes) и код R для него, но мне было любопытно, как это сделать в Scala. Также я новичок в Scala.

Кажется, я не могу заставить его работать. Я предполагаю, что синтаксически у меня что-то не так или что-то в этом роде.

Код, который я пытаюсь использовать, находится здесь: https://github.com/scalanlp/breeze/blob/master/math/src/main/scala/breeze/stats/distributions/Dirichlet.scala#L111

Согласно приведенному выше коду: 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.


person cryp    schedule 28.10.2015    source источник


Ответы (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)

Результат очень близок к тому, что я получаю с моим собственным кодом для оценки максимального правдоподобия Дирихле, но не совсем такой же. Разница, вероятно, просто сводится к различиям в используемом оптимизаторе (я использую итерацию с фиксированной точкой (9) в разделе 1 этого paper Т. Минка) и критерии остановки.

Возможно, есть лучший способ сделать это с помощью breeze api; если это так, надеюсь, @dlwh или кто-то другой, более знакомый с бризом, присоединится.

person Jason Lenderman    schedule 28.10.2015

T должен быть DenseVector, а я должен быть Int. ExpFams сейчас не векторизованы.

person dlwh    schedule 28.10.2015