Я пытаюсь реплицировать этот код python:
cond_entropy_x = np.array([entropy(x[y == v]) for v in uy])
Где x
и y
- векторы, uy
- единственные значения на y
, например 0,1
.
В flink у меня есть:
val uy = y.distinct.collect
val condHx = for (i ← uy)
yield entropy(x.filterWithBcVariable(y)((_, yy) ⇒ yy == i))
Однако, кажется, filterWithBcVariable
не принимает каждое значение по y
, оно принимает только первое.
Я также пробовал:
for (i ← values) yield y.join(x).where(a ⇒ a).equalTo(_ ⇒ i)
Но у меня не хватало памяти.
Как я могу фильтровать x
по значениям на y
?
Что-то вроде x.zip(y)
будет делать это, но оно не поддерживается.
Есть идеи?
Я вышел с одним решением, возможно, это не самое лучшее, но, по крайней мере, его работа.
Теперь вместо передачи x
и y
качестве разделенных DataSets
я передаю DataSet[LabeledVector]
только с столбцом:
val xy = input.map(lv ⇒ LabeledVector(lv.label, DenseVector(lv.vector(0))))
Затем я передаю xy
в свою функцию:
def conditionalEntropy(xy: DataSet[LabeledVector]): Double = {
// Get the label
val y = xy map (_.label)
// Get probs for the label
val p = probs(y).toArray.asBreeze
// Get unique values in label
val values = y.distinct.collect
// Compute Conditional Entropy
val condH = for (i ← values)
yield entropy(xy.filter(_.label == i))
p.dot(seq2Breeze(condH))
}