Estoy construyendo un sistema en Clojure que consume eventos en tiempo real y actúa según la cantidad de mensajes similares recibidos recientemente. Me gustaría implementar esto usando un puntaje de experiencia reciente basado en el enfriamiento newtoniano.Mapa reciente en clojure usando enfriamiento newtoniano
En otras palabras, cuando llega un evento, quiero poder asignarle una puntuación entre 1.0 (nunca antes, o "temperatura ambiente" en la ecuación de Newton) y 10.0 (caliente y caluroso, ha ocurrido varias veces) en el último minuto). Tengo una vaga idea de cómo es esta estructura de datos: cada "tipo de evento" es una clave de mapa, y cada valor de mapa debe contener un conjunto de marcas de tiempo para eventos previos y quizás un promedio continuo de la corriente " calentar "para ese tipo de evento, pero no puedo entender cómo comenzar a implementarlo más allá de eso. Específicamente, tengo problemas para averiguar cómo pasar de la ecuación real de Newton, que es muy genérica, y aplicarla a este escenario específico.
¿Alguien tiene punteros? ¿Podría alguien sugerir un "algoritmo de puntuación de lo reciente" más simple para comenzar, que podría ser reemplazado por un enfriamiento newtoniano en el futuro?
EDIT: ¡Aquí hay algunos códigos de clojure! Se refiere a los eventos como letras, pero podría reutilizarse para tomar cualquier otro tipo de objeto.
(ns heater.core
(:require [clojure.contrib.generic.math-functions :as math]))
(def letter-recency-map (ref {}))
(def MIN-TEMP 1.0)
(def MAX-TEMP 10.0)
;; Cooling time is 15 seconds
(def COOLING-TIME 15000)
;; Events required to reach max heat
(def EVENTS-TO-HEAT 5.0)
(defn temp-since [t since now]
(+
MIN-TEMP
(*
(math/exp (/
(- (- now since))
COOLING-TIME))
(- t MIN-TEMP))))
(defn temp-post-event [temp-pre-event]
(+ temp-pre-event
(/
(- MAX-TEMP temp-pre-event)
EVENTS-TO-HEAT)))
(defn get-letter-heat [letter]
(dosync
(let [heat-record (get (ensure letter-recency-map) letter)]
(if (= heat-record nil)
(do
(alter letter-recency-map conj {letter {:time (System/currentTimeMillis) :heat 1.0}})
MIN-TEMP)
(let [now (System/currentTimeMillis)
new-temp-cooled (temp-since (:heat heat-record) (:time heat-record) now)
new-temp-event (temp-post-event new-temp-cooled)]
(alter letter-recency-map conj {letter {:time now :heat new-temp-event}})
new-temp-event)))))
+1 para una gran pregunta. Estaré interesado en ver las respuestas que obtienes. –
+1 también. Y acaba de agregar la etiqueta 'algorithm'. – 4e6