Фильтрация набора данных с точки зрения другого набора данных в Scala Flink

1

Я пытаюсь реплицировать этот код 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) будет делать это, но оно не поддерживается.

Есть идеи?

Теги:
numpy
apache-flink
entropy

1 ответ

0
Лучший ответ

Я вышел с одним решением, возможно, это не самое лучшее, но, по крайней мере, его работа.

Теперь вместо передачи 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))
  }

Ещё вопросы

Сообщество Overcoder
Наверх
Меню