根据机器时间自动调整参数

时间:2017-08-03 15:21:03

标签: sql oracle machine-learning plsql

我正在寻找一种“机器学习”算法,该算法根据预定义的标准动态调整参数:

假设我有以下数据:

Iteration   Batch_Size      Elapsed Time
  1            1000              10
  2            1000              11
  3            1000              10

我的标准是:“如果最近一次迭代的平均经过时间小于60秒,则大小加倍”

由于最近3次迭代的平均经过时间小于60秒,批量大小可以增加到2000.接下来的3次迭代可能如下:

  4            2000              20
  5            2000              31
  6            2000              30

我们继续这个过程。如果经过的时间超过60秒,那么我们将回落到之前的值,如下所示

 120           32000             121
 121           32000              93
 122           32000             113

 123           16000              51
 124           16000              54
 125           16000              61

是否有可用的PL / SQL或SQL库?

感谢

oradbanj

1 个答案:

答案 0 :(得分:1)

我尝试通过根据之前的经过时间值改变随机数来模拟您的经过时间。然后我使用窗口函数(avg)来计算当前和之前2次经过的平均经过时间。 ADJUSTED_BATCH_SIZE 反映了变化的 AVERAGE_ELAPSED_TIME 。因为这是使用随机数,所以每次都会生成不同的结果集。尝试运行几次,看看你是否得到了你期望的结果。

WITH
    build_data (iteration, batch_size, elapsed_time)
    AS
        (SELECT 1 iteration, 1000 AS batch_size, TRUNC (DBMS_RANDOM.VALUE (25, 120)) elapsed_time
           FROM DUAL
         UNION ALL
         SELECT iteration + 1
              , batch_size
              , CASE
                    WHEN elapsed_time > 60
                    THEN
                        TRUNC (DBMS_RANDOM.VALUE (25, 70))
                    ELSE
                        TRUNC (DBMS_RANDOM.VALUE (25, 120))
                END
           FROM build_data
          WHERE iteration < 1000),
    calc_data
    AS
        (SELECT iteration
              , batch_size
              , elapsed_time
              , ROUND (
                    AVG (elapsed_time)
                        OVER (
                            ORDER BY iteration ROWS 2 PRECEDING
                        )
                )
                    average_elapsed_time
           FROM build_data)
  SELECT a.iteration
    --   , batch_size
       , elapsed_time
       , average_elapsed_time
       , GREATEST (
               batch_size
             + (CASE WHEN average_elapsed_time < 60 THEN 1 WHEN average_elapsed_time > 60 THEN -1 ELSE 0 END * 1000)
           , 1000
         )
             adjusted_batch_size
    FROM calc_data a
ORDER BY iteration;