2008-10-16 84 views
0

我希望能夠向用戶隨機顯示的數據庫中引入新的「標籤行」。 (這些標記行顯示爲動畫文本的介紹。)基於最終銷售訂購「標籤行」廣告系列的算法

根據這些標語所產生的銷售數量,我希望好的標語向上流淌,但仍然不太頻繁地顯示其他標語。

我可以很容易地想出一個基本的算法,但我想要的東西多一點'統計準確'。

我真的不知道從哪裏開始。它已經有一段時間了,因爲我做了比基本統計更多的事情。我的模型需要對容差敏感,但顯然它不需要值得PHD。

編輯:我目前正在跟蹤「轉化率」 - 即每個訂單的點擊量。這個值可能是計算出來的最好的累計「全時間」轉換率,然後送入算法。

回答

0

我會建議隨機選擇一個權重因素爲基礎的以前的銷售。因此,讓我們說你有這樣的:

  • 標記1 = 1個銷售
  • 標籤2 = 0銷售
  • 標籤3 = 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%

你可以很容易地改變加權公式來得到你想要的分佈。

0

你必須想出一個基於銷售量的加權公式。

我不認爲這裏有任何「統計準確」的公式 - 這一切都基於您的偏好。

沒有人可以說「這是正確的加權和其他權重是錯誤的」,因爲沒有最終的結果,你試圖建模 - 這不像是試圖衡量對即將到來的民意調查的反應選舉(您正在試圖對結果進行建模以表示將來會發生的事情)。你的問題

1

看,我將修改的要求一點 -

1)最流行的一個最應該顯示的頻率。 2)標語應該是「年齡」,所以過去得到很多選票(購買),但最近沒有應該顯示較少的經常 3)全新標語應該在第一天更頻繁地顯示。

如果你對這些一致的話,算法可以是這樣的:

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 
} 

現在,作爲建立我會給每一個新的口號10次購買,以避免得到非常大的傾斜爲一個單一的購買。

老化過程中,我會將購買年齡超過一週的購物計爲每週0.8個禮盒。所以1周齡給出0.8分,2周給出0.8 * 0.8 = 0,64等等......

你將不得不玩弄初始purhcases參數(在我的例子中爲10)和老化速度(在這裏1周)和老化因子(0.8這裏)找到適合你的東西。

0

繼承人在JavaScript中的一個例子。不是我不建議運行這個客戶端... 也有很多可以完成的優化。

注:createMemberInNormalDistribution()在這裏實現Converting a Uniform Distribution to a Normal Distribution

/* 
* 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})