FlinkML 0.10.1 Множественная линейная регрессия с разреженными векторами для обучения
Все,
Я пытаюсь протестировать Flink ML 0.10.1, выполняя линейную регрессию, как описано здесь:
https://ci.apache.org/projects/flink/flink-docs-master/libs/ml/multiple_linear_regression.html
Я использую SparseVectors вместо DenseVector, но столкнулся с этой проблемой при попытке обучить модель:
java.lang.IllegalArgumentException: axpy only supports adding to a dense vector but got type class org.apache.flink.ml.math.SparseVector.
at org.apache.flink.ml.math.BLAS$.axpy(BLAS.scala:60)
at org.apache.flink.ml.optimization.GradientDescent$$anonfun$org$apache$flink$ml$optimization$GradientDescent$$SGDStep$2.apply(GradientDescent.scala:181)
at org.apache.flink.ml.optimization.GradientDescent$$anonfun$org$apache$flink$ml$optimization$GradientDescent$$SGDStep$2.apply(GradientDescent.scala:177)
at org.apache.flink.api.scala.DataSet$$anon$7.reduce(DataSet.scala:583)
at org.apache.flink.runtime.operators.chaining.ChainedAllReduceDriver.collect(ChainedAllReduceDriver.java:93)
at org.apache.flink.runtime.operators.MapDriver.run(MapDriver.java:97)
at org.apache.flink.runtime.operators.BatchTask.run(BatchTask.java:489)
at org.apache.flink.runtime.iterative.task.AbstractIterativeTask.run(AbstractIterativeTask.java:144)
at org.apache.flink.runtime.iterative.task.IterationIntermediateTask.run(IterationIntermediateTask.java:92)
at org.apache.flink.runtime.operators.BatchTask.invoke(BatchTask.java:354)
at org.apache.flink.runtime.taskmanager.Task.run(Task.java:584)
at java.lang.Thread.run(Thread.java:745)
FlinkML MLG не поддерживает SparseVectors?
2 ответа
Проблема в том, что GradientDescent
реализация ожидает, что сумма векторов градиента будет плотной. Это не является сильным ограничением, потому что результат суммирования набора разреженных векторов не должен быть снова разреженным. Кроме того, часто более эффективно преобразовать первый вектор градиента в плотный вектор и затем добавить к нему следующие векторы разреженного градиента вместо того, чтобы все время добавлять 2 разреженных вектора.
Я открыл запрос на удаление, чтобы исправить эту проблему. Это следует объединить в ближайшие дни.
Я проверил источник, и это выглядит так. Там есть явная проверка для типов, и случай, когда левый вектор является редким, вызывает эту ошибку. Код действительно ужасен, поэтому, вероятно, это всего лишь временная версия, и со временем она будет улучшена. Вы должны указать это в списке рассылки или открыть вопрос на JIRA.