2017-08-03 1 views
0

ich für Art „Maschinelles Lernen“ Algorithmus suchen, die dynamisch einen Parameter auf vordefinierten Kriterien passt:automatisch Parameter basierend auf Maschinenzeit einstellen

Angenommen ich folgende Daten haben:

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

Mein Kriterium ist: "Wenn die durchschnittliche abgelaufene Zeit für die letzten Iterationen weniger als 60 Sekunden beträgt, verdoppeln Sie die Größe"

Da die durchschnittliche abgelaufene Zeit für die letzten 3 Iterationen weniger als 60 Sekunden beträgt, kann die Batchgröße auf 2000 erhöht werden Die nächsten 3 Iterationen s könnte wie folgt sein

4   2000    20 
    5   2000    31 
    6   2000    30 

Und wir setzen diesen Prozess fort. Wenn die verstrichene Zeit 60 Sekunden überschritten hat, dann fallen wir auf den vorherigen Wert zurück, wie

folgt
120   32000    121 
121   32000    93 
122   32000    113 

123   16000    51 
124   16000    54 
125   16000    61 

es irgendwelche PL/SQL oder SQL-Bibliotheken zur Verfügung?

dank

oradbanj

+0

Können Sie erklären, wie viele Operationen "aktuell" sind? 2, 3, 5, 10 oder vielleicht 10000? – krokodilko

+0

3 Operationen können als neueste betrachtet werden. – oradbanj

Antwort

1

Ich habe versucht, Ihre verstrichene Zeit zu simulieren, indem eine Zufallszahl auf der Basis der vorherigen verstrichenen Zeit Wert variiert. Ich benutzte dann eine Fensterfunktion (avg), um die durchschnittliche verstrichene Zeit über die aktuelle und die letzten 2 verstrichenen Zeiten zu berechnen. Die ADJUSTED_BATCH_SIZE spiegelt die variierende AVERAGE_ELAPSED_TIME wider. Da hierbei eine Zufallszahl verwendet wird, wird jedes Mal eine andere Ergebnismenge generiert. Versuchen Sie es ein paar Mal und sehen Sie, ob Sie bekommen, was Sie erwarten.

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; 
+0

Großartig. Works-Anzeige wird erwartet. – oradbanj

Verwandte Themen