Вот байесовские вычисления и один пример / тест:
def estimateProbability(priorProbs, buyCount, noBuyCount):
# first, estimate the prob that the actual buy/nobuy counts would be observed
# given each of the priors (times a constant that's the same in each case and
# not worth the effort of computing;-)`
condProbs = [p**buyCount * (1.0-p)**noBuyCount for p in priorProbs]
# the normalization factor for the above-mentioned neglected constant
# can most easily be computed just once
normalize = 1.0 / sum(condProbs)
# so here's the probability for each of the prior (starting from a uniform
# metaprior)
priorMeta = [normalize * cp for cp in condProbs]
# so the result is the sum of prior probs weighed by prior metaprobs
return sum(pm * pp for pm, pp in zip(priorMeta, priorProbs))
def example(numProspects=4):
# the a priori prob of buying was either 0.3 or 0.7, how does it change
# depending on how 4 prospects bought or didn't?
for bought in range(0, numProspects+1):
result = estimateProbability([0.3, 0.7], bought, numProspects-bought)
print 'b=%d, p=%.2f' % (bought, result)
example()
вывод:
b=0, p=0.31
b=1, p=0.36
b=2, p=0.50
b=3, p=0.64
b=4, p=0.69
, что согласуется с моим ручным вычислением для этого простого случая. Обратите внимание, что вероятность покупки по определению всегда будет между самой низкой и самой высокой среди множества априорных вероятностей; если это не то, что вам нужно, вы можете захотеть ввести немного выдумки, введя два «псевдопродукта», один, который никто никогда не купит (p = 0.0), тот, который каждый всегда купит (p = 1.0) - это дает больший вес для фактических наблюдений, как бы мало они ни были, и меньше для статистики о прошлых продуктах. Если мы сделаем это здесь, мы получим:
b=0, p=0.06
b=1, p=0.36
b=2, p=0.50
b=3, p=0.64
b=4, p=0.94
Промежуточные уровни обмана (чтобы учесть маловероятный, но не невозможный шанс того, что этот новый продукт может быть хуже, чем любой, когда-либо ранее проданный, или лучше, чем любой из них), можно легко представить (придать искусственному 0,0 меньший вес). и вероятности 1,0 путем добавления вектора priorWeights к аргументам estimateProbability
).
Подобные вещи являются существенной частью того, что я делаю весь день, сейчас, когда я работаю над разработкой приложений в Business Intelligence, но мне просто не хватает этого ...! -)