我正在寻找一种“机器学习”算法,该算法根据预定义的标准动态调整参数:
假设我有以下数据:
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
答案 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;