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