我希望能够将新的“标记行”引入到“随机”显示给用户的数据库中。 (这些标记行显示为动画文本的介绍。)
根据这些标语产生的销售数量,我希望好的产品能够涓涓细流,但仍然不那么频繁地展示其他产品。
我可以很容易地提出一个基本的算法,但我想要的东西更具“统计上的准确性”。
我真的不知道从哪里开始。我已经做了一段时间,因为我做了比基本统计更多的事情。我的模型需要对容差敏感,但显然它不需要值得PHD。
编辑:我目前正在跟踪'转化率' - 即每个订单的点击次数。该值可能最好计算为累积的“所有时间”转换率,并将其输入算法。
答案 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 purhcase。所以1周龄给出0.8分,2周给出0.8 * 0.8 = 0,64等等......
你必须使用初始purhcases参数(在我的例子中为10)和老化速度(这里为1周)和老化因子(这里为0.8)来找到适合你的东西。
答案 1 :(得分:0)
我建议根据之前的销售额随机选择加权因子。所以,假设你有这个:
一个简单的加权公式是1 +销售数量,因此这是选择每个标签的概率:
您可以轻松更改加权公式,以获得所需的分布。
答案 2 :(得分:0)
你必须根据销售情况提出加权公式。
我认为这里没有任何“统计上准确”的公式 - 这完全取决于您的偏好。
没有人可以说“这是正确的加权而其他加权是错误的”,因为没有你试图建模的最终结果 - 这不像是试图权衡对即将到来的选举的民意调查的回应(您尝试对结果进行建模以表示将来会发生的事情)。
答案 3 :(得分: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})