Линейная регрессия с использованием CEP

Как лучше всего добиться линейной регрессии с помощью CEP? Мы попробовали два разных варианта.

Мы хотим, чтобы алгоритм работал в режиме реального времени.

Базовый код для обоих подходов:

      create context IntervalSpanning3Seconds start @now end after 30 sec;

      create schema measure (
          temperature float,
          water float,
          _hours float,
          persons float,
          production float
      );

      @Name("gattering_measures")
      insert into measure
      select
          cast(getNumber(m,"measurement.bsk_mymeasurement.temperature.value"),     
         float) as temperature,
          cast(getNumber(m, "measurement.bsk_mymeasurement.water.value"), float) as water,
          cast(getNumber(m, "measurement.bsk_mymeasurement._hours.value"), float) as _hours,
          cast(getNumber(m, "measurement.bsk_mymeasurement.persons.value"), float) as persons,
          cast(getNumber(m, "measurement.bsk_mymeasurement.production.value"),float) as production
      from MeasurementCreated m 
      where m.measurement.type = "bsk_mymeasurement";

<сильный>1. Использование функции stat:linest

      @Name("get_data")
      context IntervalSpanning3Seconds
      select * from measure.stat:linest(water,production,_hours,persons,temperature)
      output snapshot when terminated;

EDIT: Проблема здесь в том, что кажется, что "get_data" выполняется для каждого измерения, а не для всего набора измерений.

<сильный>2. Получить данные и передать функцию JavaScript.

      create expression String exeReg(data) [
          var f = f(data)

          function f(d){
             .....
             // return the linear regression as a string 
          }
          return f
      ];

      @Name("get_data")
      insert into CreateEvent
      select 
         "bsk_outcome_linear_regression" as type,
         exeReg(m) as text,
         ....
      from measure m;

РЕДАКТИРОВАТЬ: Здесь я хотел бы знать, какой тип переменной передается в функцию exeReg() и как мне ее повторять? пример был бы хорош.

Я буду признателен за любую помощь.


person Jorge    schedule 26.01.2018    source источник
comment
Лучшие подходы будут работать. Linest кажется намного проще и, вероятно, быстрее. В чем вопрос?   -  person user650839    schedule 29.01.2018
comment
@ user650839, пожалуйста, посмотрите мое редактирование.   -  person Jorge    schedule 29.01.2018
comment
Сценарий получает текущий экземпляр измерения, и итерация недоступна. Для получения некоторого списка событий измерения должно быть окно данных и окно (*).   -  person user650839    schedule 30.01.2018


Ответы (1)


Использование JavaScript означает, что сценарий вычисляет новый результат (пересчитывает) для каждой полученной коллекции. Вместо пересчета окно данных #lineest является хорошим выбором. Или вы можете добавить пользовательскую функцию агрегации или пользовательское окно данных в движок, если есть определенный код, который вы хотите использовать. Ниже показано, как сценарий может получать несколько событий для случая, когда требуется сценарий.

    create expression String exeReg(data) [
            .... script here...
          ];

    select exeReg(window(*)) ....
    from measure#time(10 seconds);
person user650839    schedule 31.01.2018