Алгоритм заказа рекламных кампаний на основе итоговых продаж - PullRequest
0 голосов
/ 16 октября 2008

Я хочу иметь возможность вводить новые «строки тегов» в базу данных, которые показываются «случайным образом» пользователям. (Эти строки тегов показаны как введение в виде анимированного текста.)

Исходя из количества продаж, полученных в результате этих слоганов, я бы хотел, чтобы хорошие просочились вверх, но все же показывали другие реже.

Я мог бы довольно просто придумать базовый алгоритм, но мне нужно что-то более «статистически точное».

Я действительно не знаю, с чего начать. Прошло много времени с тех пор, как я сделал больше, чем просто статистику. Моя модель должна быть чувствительной к допускам, но, очевидно, она не должна быть достойной доктора философии.

Редактировать: В настоящее время я отслеживаю «коэффициент конверсии» - то есть попадания по заказу. Это значение, вероятно, лучше всего рассчитать как совокупный коэффициент конвертации за все время, который будет подан в алгоритм.

Ответы [ 4 ]

1 голос
/ 17 октября 2008

Глядя на вашу проблему, я бы немного изменил требования -

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 и так далее ...

Вам придется поиграться с параметром Initial purhcases (10 в моем примере), скоростью старения (1 неделя здесь) и коэффициентом старения (0,8 здесь), чтобы найти то, что вам подходит.

0 голосов
/ 20 октября 2008

Вот пример в 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})
0 голосов
/ 17 октября 2008

Вы должны придумать формулу взвешивания, основанную на продажах.

Я не думаю, что здесь есть такая вещь, как "статистически точная" формула - все зависит от ваших предпочтений.

Никто не может сказать «это правильное взвешивание, а другое взвешивание неверно», потому что нет конечного результата, который вы пытаетесь смоделировать - это не то же самое, что пытаться взвесить ответы на опрос о предстоящих выборах (где вы пытаетесь смоделировать результаты для представления того, что произойдет в будущем).

0 голосов
/ 16 октября 2008

Я бы предложил случайный выбор с весовым коэффициентом, основанным на предыдущих продажах. Допустим, у вас было это:

  • 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%

Вы можете легко изменить формулу взвешивания, чтобы получить именно то распределение, которое вам нужно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...