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

标签 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 库吗?

谢谢

奥拉类吉

最佳答案

我尝试通过根据之前的耗时值改变随机数来模拟您的耗时。然后,我使用窗口函数 (avg) 来计算当前和前 2 个耗时的平均耗时。 ADJUSTED_BATCH_SIZE 反射(reflect)了不同的 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;

关于sql - 根据机器时间自动调整参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45488449/

相关文章:

sql - 有没有可能在sql server的一张表上有两个PK?

PHP 和 MySQL 数据库同时搜索多个表

php - 从给定的表中显示 isbn、书名、作者(所有书籍作者在一行中)的查询是什么?

mysql - 如何选择列的不同前缀子字符串?

sql - 一定是执行此 SQL WHERE/IN 的更好方法

sql - 用行号更新 Oracle 表列

java - Oracle上执行的executeBatch()是否按顺序执行?

machine-learning - 如何计算 HMM 的值?

machine-learning - word2vec 对于监督学习有意义吗?

machine-learning - 如何在 scikit learn 中使用核密度估计作为一维聚类方法?