私は、リアルタイムでイベントを消費し、最近受信された類似のメッセージの数に応じて動作するClojureのシステムを構築しています。私はニュートンの冷却に基づいて最新のスコアを使用してこれを実装したいと思います。ニュートンの冷却を使用するclojureの最新のマップ
つまり、イベントが到着したときに、1.0(ニュートンの式の「周囲温度」または以前に起こったことはない)と10.0(ホットホットホット、数回発生した過去1分間に)。
すべての「イベントタイプ」はマップキーであり、すべてのマップ値には以前のイベントのタイムスタンプのセットが含まれている必要があります。現在の "そのイベントタイプでは「熱」がありますが、それを超えて実装を開始する方法はわかりません。具体的には、非常に一般的なニュートンの実際の方程式からどのように移動して、この特定のシナリオに適用するのかがわかりません。
誰でもポインタを持っていますか?誰かが簡単に「レニエントスコアアルゴリズム」を提案して、ニュートンの道を冷やすことで置き換えることができましたか?
EDIT:ここにいくつかのクロージャーコードがあります。それは文字としてのイベントを参照していますが、他の種類のオブジェクトを取るために明らかに再利用することができます。
(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。私はあなたが得る答えを見ることに興味があるでしょう。 –
+1。そして 'algorithm'タグを追加しました。 – 4e6