使用CEP的线性回归

时间:2018-01-26 16:57:51

标签: esper cumulocity

使用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;

编辑:这里的问题是它似乎是" 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()函数的变量的类型是什么以及我应该如何迭代它?例子很好。

我会感激任何帮助。

1 个答案:

答案 0 :(得分:0)

使用JavaScript意味着脚本为它接收的每个集合计算新结果(重新计算)。 #lineest数据窗口不是重新计算,而是一个不错的选择。或者,如果您要使用某些代码,则可以向引擎添加自定义聚合函数或自定义数据窗口。下面是脚本在需要脚本时如何接收多个事件的情况。

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

    select exeReg(window(*)) ....
    from measure#time(10 seconds);