문제

사람이 특정 제품을 구매하는지 여부, 구매 1 개, 구매하지 않는 경우 0, 구매하지 않는 경우에 대한 데이터가 많이 있습니다 (자동 콜 센터로의 통화).

이 데이터를 사용하여 사람이 특정 제품을 구입할 예상 확률을 만들고 싶지만 문제는 그 제품을 사거나 구매하지 않은 사람의 수에 대한 비교적 적은 역사적 데이터로 수행해야 할 수도 있다는 것입니다.

친구는 베이지안 확률로 "사전 확률 분포"를 제시함으로써 확률 추정을 "도울 수있다"고 권고했다. 본질적으로 이것은 실제 데이터를 고려하기 전에 기대할 수있는 것에 대한 정보이다.

그래서 내가하고 싶은 것은이 서명 (Java)과 같은 방법을 만드는 것입니다.

double estimateProbability(double[] priorProbabilities, int buyCount, int noBuyCount);

Prior -Probabilities는 이전 제품에 대해 본 일련의 확률입니다.이 방법은이 확률에 대한 사전 분포를 생성하는 데 사용할 것입니다. BuyCount 및 NobuyCount는이 제품과 관련된 실제 데이터로, 데이터와 사전에 사용자 구매 확률을 추정하고자합니다. 이것은 메소드에서 이중으로 반환됩니다.

나는 수학적으로 완벽한 솔루션이 필요하지 않습니다. 확률 = BuyCount / (BuyCount+NobuyCount)). 수학 표기법보다 소스 코드에 훨씬 더 익숙하기 때문에 사람들이 설명에 코드를 사용할 수 있다면 감사합니다.

도움이 되었습니까?

해결책

베이지안 계산과 하나의 예/테스트는 다음과 같습니다.

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

이 간단한 사례에 대한 나의 직접 계산에 동의합니다. 정의상 구매 확률은 항상 선험적 확률 세트 중에서 가장 낮은 것과 가장 높은 것입니다. 그것이 당신이 원하는 것이 아니라면, 당신은 두 개의 "의사 제품"을 소개하여 약간의 퍼지를 소개하고 싶을 것입니다. 실제 관찰에 대한 무게가 더 많고, 과거의 제품에 대한 통계에 대한 통계에 대한 무게. 우리가 여기서 그렇게한다면, 우리는 다음을 얻습니다.

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의 주장).

이런 종류의 일은 내가 하루 종일하는 일의 실질적인 부분입니다. 이제 비즈니스 인텔리전스에서 응용 프로그램을 개발하고 있지만 충분히 얻을 수는 없습니다 ...!-)

다른 팁

어려운 수학 없이이 작업을 수행하는 간단한 방법은 제품을 구매하거나 구매하지 않은 가상 고객을 추가하여 BuyCount 및 NobuyCount를 인위적으로 높이는 것입니다. 당신은 당신이 가치가 있다고 생각하는 가상 고객의 수에 관해 각각의 특정 사전 확률에 대해 얼마나 많이 믿는지 조정할 수 있습니다.

의사 코드에서 :

def estimateProbability(priorProbs, buyCount, noBuyCount, faithInPrior=None):
    if faithInPrior is None: faithInPrior = [10 for x in buyCount]
    adjustedBuyCount = [b + p*f for b,p,f in 
                                zip(buyCount, priorProbs, faithInPrior]
    adjustedNoBuyCount = [n + (1-p)*f for n,p,f in 
                                zip(noBuyCount, priorProbs, faithInPrior]
    return [b/(b+n) for b,n in zip(adjustedBuyCount, adjustedNoBuyCount]

당신이하려는 것 같네요 협회 규칙 학습. 나는 지금 당신에게 어떤 코드를 제공 할 시간이 없지만, 나는 당신을 다음의 방향으로 지적 할 것입니다. Weka Java를위한 환상적인 오픈 소스 데이터 마이닝 툴킷입니다. 문제를 해결하는 데 도움이되는 흥미로운 것들을 많이 찾아야합니다.

내가 알 수 있듯이, 당신이 할 수있는 최선은 분포에 관한 단서가 없다면 통일 분포를 사용하는 것입니다. 아니면 아마존 패션에서 같은 사람이 이전에 구입 한이 제품과 제품 사이의 관계를 만드는 것에 대해 이야기하고 있습니까?

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top