2

私はここでRedditのモデルに基づく投稿システムの時間減衰アルゴリズムに取り組んでいます:http: //amix.dk/blog/post/19588

私の作業ポートはここにあります:

public class Calculation
{
    protected DateTime Epoch = new DateTime(1970, 1, 1);

    protected long EpochSeconds(DateTime dt)
    {
        var ts = dt.Subtract(Convert.ToDateTime("1/1/1970 8:00:00 AM"));

        return ((((((ts.Days * 24) + ts.Hours) * 60) + ts.Minutes) * 60) + ts.Seconds);
    }

    protected int Score(int upVotes, int downVotes)
    {
        return upVotes - downVotes;
    }

    public double HotScore(int upVotes, int downVotes, DateTime date)
    {
        var s = Score(upVotes, downVotes);
        var order = Math.Log(Math.Max(Math.Abs(s), 1), 10);
        var sign = Math.Sign(s);
        var seconds = EpochSeconds(date) - 1134028003;
        return Math.Round(order + sign * ((double)seconds / 45000), 7);
    }
}

提供されたリンクからのモデル出力に基づいて、0〜13時間で徐々に減衰し、その後急激に減衰するはずです。

私が見ているのは非常に均一な減衰であり、元のコード(元のコード:3480-3471)からの出力よりもはるかに高いスコアです。

これが私がテストしている方法です:

        Calculation c = new Calculation();
        double now = c.HotScore(100, 2, DateTime.Now);
        double fivehoursago = c.HotScore(100, 2, DateTime.Now.AddHours(-5));
        double tenhoursago = c.HotScore(100, 2, DateTime.Now.AddHours(-10));
        double elevenhoursago = c.HotScore(100, 2, DateTime.Now.AddHours(-11));
        double twelvehoursago = c.HotScore(100, 2, DateTime.Now.AddHours(-12));
        double thirteenhoursago = c.HotScore(100, 2, DateTime.Now.AddHours(-13));
        double fiftyhoursago = c.HotScore(100, 2, DateTime.Now.AddHours(-50));
        double onehundredhoursago = c.HotScore(100, 2, DateTime.Now.AddHours(-100));
        Console.WriteLine(now.ToString());
        Console.WriteLine(fivehoursago.ToString());
        Console.WriteLine(tenhoursago.ToString());
        Console.WriteLine(elevenhoursago.ToString());
        Console.WriteLine(twelvehoursago.ToString());
        Console.WriteLine(thirteenhoursago.ToString());
        Console.WriteLine(fiftyhoursago.ToString());
        Console.WriteLine(onehundredhoursago.ToString());
        Console.ReadLine();

出力値:

now:               4675.2993816
five hours:        4674.8993816
ten hours:         4674.4993816
eleven hours:      4674.4193816
twelve hours:      4674.3393816
thirteen hours:    4674.2593816
fifty hours:       4671.2993816
one-hundred hours: 4667.2993816

明らかにそれは正しく機能することのSORTですが、何かがおかしいです。これは、真の* nixエポックサポートの欠如、または類似のマイクロ秒計算の欠如に関連している可能性がありますが、何かが正しくありません。

可能な参照リソース: http: //blogs.msdn.com/b/brada/archive/2004/03/20/93332.aspx http://codeclimber.net.nz/archive/2007/07/10/convert-a -unix-timestamp-to-a-.net-datetime.aspx

4

1 に答える 1

3

主な問題は、ホットアルゴリズムが時間に依存していることです。でホットスコアを計算していDateTime.Nowますが、記事は2010年11月23日に書かれました(記事の下部をご覧ください)。

試行錯誤を繰り返しましたが、データは2010-11-2307:35頃に計算されたようです。ではなくその値を使用してみてくださいDateTime.Now。表示されているグラフのデータとほぼ同じ結果が得られるはずです。

念のために言っておきますが、コードに次のような改善を加えることができます。

public class Calculation
{
    private static readonly DateTime Epoch = new DateTime(1970, 1, 1);

    private double EpochSeconds(DateTime dt)
    {
        return (dt - Epoch).TotalSeconds;
    }

    private int Score(int upVotes, int downVotes)
    {
        return upVotes - downVotes;
    }

    public double HotScore(int upVotes, int downVotes, DateTime date)
    {
        int s = Score(upVotes, downVotes);
        double order = Math.Log(Math.Max(Math.Abs(s), 1), 10);
        int sign = Math.Sign(s);
        double seconds = EpochSeconds(date) - 1134028003;
        return Math.Round(order + sign * seconds / 45000, 7);
    }
}

私の結果:

3479.0956039
3478.6956039
3478.2956039
3478.2156039
3478.1356039
3478.0556039
3475.0956039
3471.0956039

変更点:

  • 1970-01-01 08:00:00の変換ではなく、宣言されたエポックを使用しました(08:00は間違いだと思います)。
  • a - b;を使用して2つの日付を引くことができます。これは同じですがa.Subtract(b)、より簡潔で、元のPythonコードを反映しています。
  • タイムスパンマイクロ秒の精度を提供します(ダニは最小単位であり、100ナノ秒に相当します)。
  • また、TotalSecondsは、期間内の合計秒数を示します。それを再計算する必要はありません。小数部分は、マイクロ秒の精度を提供します。
  • EpochSecondsからdoubleを返すことにより、この精度を維持します。
  • どの変数が何であるかを明確に示すのではなく、データ型を明示的にvarしました(メソッドのシグネチャと一致するため、暗黙的なアップキャストはありません)。
  • 不要protectedに変更privateEpoch、定数にしました。
于 2012-08-08T00:29:56.790 に答える