2008-10-16 83 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})