0

ユーザーに「ランダムに」表示される新しい「タグライン」をデータベースに導入できるようにしたいと考えています。(これらのキャッチフレーズは、アニメーション テキストとして紹介として表示されます。)

これらのキャッチフレーズから得られた販売数に基づいて、良いものは少しずつトップに表示されるようにしたいと思いますが、それでも他のものはあまり表示されないようにします.

基本的なアルゴリズムは非常に簡単に思いつくことができましたが、もう少し「統計的に正確」なものが必要です。

どこから始めればいいのか本当にわかりません。基本的な統計以外のことをしたのは久しぶりです。私のモデルは公差に敏感である必要がありますが、明らかに PHD に値する必要はありません。

編集:現在、「コンバージョン率」、つまり注文あたりのヒット数を追跡​​しています。この値は、アルゴリズムに入力される累積的な「全期間」コンバージョン率として計算するのがおそらく最適です。

4

4 に答える 4

1

あなたの問題を見て、要件を少し変更します-

1) 最も人気のあるものを最も頻繁に表示する必要があります。2) キャッチフレーズは「エイジング」する必要があります。つまり、過去に多くの投票 (購入) を獲得したが、最近は何も表示されていないものは、あまり表示されないようにする必要があります。

それらに同意する場合、アルゴリズムは次のようになります。

START:
x = random(1, 3); 
if x = 3 goto NEW else goto NORMAL

NEW:
TagVec = Taglines.filterYounger(5 days); // I'm taking a LOT of liberties with the pseudo code,,,
x = random(1, TagVec.Length);
return tagVec[x-1]; // 0 indexed vectors even in made up language,


NORMAL:
// Similar to EBGREEN above
sum = 0;
ForEach(TagLine in TagLines) {
   sum += TagLine.noOfPurhcases;
}
x = random(1, sum);
ForEach(TagLine in TagLines) {
   x -= TagLine.noOfPurchase;
   if ( x > 0) return TagLine; // Find the TagLine that represent our random number
}

さて、セットアップとして、1回の購入で本当に大きな偏りが生じるのを避けるために、すべての新しいタグラインに10回の購入を与えます.

老化プロセス 1 週間以上経過した購入は、1 週間あたり 0.8 購入として数えます。つまり、生後 1 週間で 0.8 ポイント、2 週間で 0.8*0.8 = 0.64 などとなります。

自分に合ったものを見つけるには、初期購入パラメーター (私の例では 10) と老化速度 (ここでは 1 週間) と老化係数 (ここでは 0.8) をいじる必要があります。

于 2008-10-17T15:08:23.340 に答える
0

以前の販売に基づいた重み係数でランダムに選択することをお勧めします。だから、あなたがこれを持っていたとしましょう:

  • tag1 = 1 セール
  • tag2 = 0 売上
  • tag3 = 1 セール
  • tag4 = 2 売上
  • tag5 = 3 売上

単純な重み付け式は 1 + 販売数になるため、これが各タグを選択する確率になります。

  • tag1 = 2/12 = 16.7%
  • tag2 = 1/12 = 8.3%
  • tag3 = 2/12 = 16.6%
  • tag4 = 3/12 = 25%
  • tag5 = 4/12 = 33.3%

重み付け式を簡単に変更して、必要な分布だけを取得できます。

于 2008-10-16T19:09:27.927 に答える
0

これは JavaScript の例です。このクライアント側を実行することを提案しているわけではありません...また、実行できる最適化がたくさんあります。

注: createMemberInNormalDistribution() はここで実装されています一様分布から正規分布への変換

/*
 * an example set of taglines
 * hits are sales
 * views are times its been shown
 */
var taglines = [
    {"tag":"tagline 1","hits":1,"views":234},
    {"tag":"tagline 2","hits":5,"views":566},
    {"tag":"tagline 3","hits":3,"views":421},
    {"tag":"tagline 4","hits":1,"views":120},   
    {"tag":"tagline 5","hits":7,"views":200}
];

/*set up our stat model for the tags*/
var TagModel = function(set){ 
    var  hits, views, sumOfDiff, sumOfSqDiff; 
    hits = views = sumOfDiff = sumOfSqDiff = 0;
    /*find average*/
    for (n in set){
        hits += set[n].hits;
        views += set[n].views;  
    }
    this.avg = hits/views;
    /*find standard deviation and variance*/
    for (n in set){
        var diff =((set[n].hits/set[n].views)-this.avg);
        sumOfDiff += diff;
        sumOfSqDiff += diff*diff;   
    }
    this.variance = sumOfDiff;
    this.std_dev = Math.sqrt(sumOfSqDiff/set.length);
    /*return tag to use fChooser determines likelyhood of tag*/
    this.getTag = function(fChooser){
        var m = this;
        set.sort(function(a,b){
                return fChooser((a.hits/a.views),(b.hits/b.views), m);
            });
        return set[0];
    };
};

var config = {

    "uniformDistribution":function(a,b,model){
        return Math.random()*b-Math.random()*a;
    },
    "normalDistribution":function(a,b,model){
        var a1 = createMemberInNormalDistribution(model.avg,model.std_dev)* a;
        var b1 = createMemberInNormalDistribution(model.avg,model.std_dev)* b;
        return b1-a1;
    },
    //say weight = 10^n... higher n is the more even the distribution will be.
    "weight": .5,
    "weightedDistribution":function(a,b,model){
        var a1 = createMemberInNormalDistribution(model.avg,model.std_dev*config.weight)* a;
        var b1 = createMemberInNormalDistribution(model.avg,model.std_dev*config.weight)* b;
        return b1-a1;
    }
}

var model = new TagModel(taglines);

//to use
model.getTag(config.uniformDistribution).tag;
//running 10000 times: ({'tagline 4':836, 'tagline 5':7608, 'tagline 1':100, 'tagline 2':924, 'tagline 3':532})

model.getTag(config.normalDistribution).tag;
//running 10000 times: ({'tagline 4':1775, 'tagline 5':3471, 'tagline 1':1273, 'tagline 2':1857, 'tagline 3':1624})

model.getTag(config.weightedDistribution).tag;
//running 10000 times: ({'tagline 4':1514, 'tagline 5':5045, 'tagline 1':577, 'tagline 2':1627, 'tagline 3':1237})

config.weight = 2;
model.getTag(config.weightedDistribution).tag;
//running 10000 times: {'tagline 4':1941, 'tagline 5':2715, 'tagline 1':1559, 'tagline 2':1957, 'tagline 3':1828})
于 2008-10-20T03:59:53.313 に答える
0

売上に基づく重み付け式を考え出す必要があります。

ここに「統計的に正確な」式などというものはないと思います - それはすべてあなたの好みに基づいています.

モデル化しようとしている最終結果がないため、「これは正しい重み付けで、他の重み付けは間違っている」とは誰も言えません。将来起こることを表現するために結果をモデル化しようとしています)。

于 2008-10-16T20:09:56.353 に答える