2012-01-30 15 views
7

Podczas analizy sieci społecznej natknąłem się na problem dopasowania rozkładu prawdopodobieństwa na poziomie sieci.Oszacować wykładniczy limit w dystrybucji prawa mocy

Tak więc, mam rozkład prawdopodobieństwa P(X >= x), który po kontroli wizualnej jest zgodny z prawem mocy z wykładniczym odcięciem, a nie czystym prawem mocy (linia prosta).

Tak więc, biorąc pod uwagę, że równanie prawa podziału mocy z wykładniczej cut-off to:

F (x) = a ** * exp (P * x)

Jak mogę oszacować parametry alpha i beta używając Pythona?

Wiem, że pakiet scipy.stats.powerlaw istnieje i ma funkcję .fit(), ale to nie działa, ponieważ zwraca tylko lokalizację i skalę wykresu, co wydaje się przydatne tylko w przypadku normalnej dystrybucji ? Nie ma również wystarczającej liczby samouczków na temat tego pakietu.

P.S. Jestem świadomy implementacji CLauset et al, ale wydaje się, że nie zapewniają one sposobów oszacowania parametrów alternatywnych dystrybucji.

+2

Papier Clauset jest * najlepszym odnośnikiem do praktycznego dopasowania funkcji power law. Jeśli naprawdę uważasz, że masz problem, który nie jest rozwiązany, rozważ wysłanie e-maila do autorów: –

+0

Nie jestem statystykiem, więc nie jestem pewien, czy całkowicie rozumiem cały artykuł. Myślę, że kod Ginsberga jest świetny i bardzo pomocny. Chcę tylko wiedzieć, czy istnieją narzędzia, które pomogą w oszacowaniu parametrów innych rozkładów prawdopodobieństwa. – Mike

+0

http://en.wikipedia.org/wiki/Power_law Gdzie jest linia prosta, o której mówisz? –

Odpowiedz

3

Funkcja scipy.stats.powerlaw.fit może nadal działać zgodnie z Twoimi celami. To trochę mylące, jak działają dystrybucje w scipy.stats (dokumentacja dla każdego odnosi się do opcjonalnych parametrów loc i scale, nawet jeśli nie wszystkie z nich używają tych parametrów, a każdy z nich używa ich inaczej). Jeśli spojrzeć na docs:

http://docs.scipy.org/doc/scipy/reference/generated/scipy.stats.powerlaw.html

istnieje również drugi zakaz opcjonalny parametr „a”, która jest „parametry kształtu”. W przypadku powerlaw zawiera on pojedynczy parametr. Nie martw się o "loc" i "skalę".

Edycja: Przepraszam, zapomniałem, że chciałbyś również mieć parametr beta. Najlepiej, możesz zdefiniować funkcję powerlaw, którą sam chcesz, a następnie użyj ogólnych algorytmów dopasowania scipy, aby poznać parametry.Na przykład: http://www.scipy.org/Cookbook/FittingData#head-5eba0779a34c07f5a596bbcf99dbc7886eac18e5

+0

czy istnieje jakiś kod zabawkowy do przetestowania? –

1

Oto sposoby szacowania wykładnik skalowania i wykładniczo prawa energetycznego z gwałtownym odcięciu poprzez maksymalizację prawdopodobieństwa w R:

# Input: Data vector, lower threshold 
# Output: List, giving type ("powerexp"), scaling exponent, exponential rate, lower threshold, log-likelihood 


powerexp.fit <- function(data,threshold=1,method="constrOptim",initial_rate=-1) { 
    x <- data[data>=threshold] 
    negloglike <- function(theta) { 
    -powerexp.loglike(x,threshold,exponent=theta[1],rate=theta[2]) 
    } 
    # Fit a pure power-law distribution 
    pure_powerlaw <- pareto.fit(data,threshold) 
    # Use this as a first guess at the exponent 
    initial_exponent <- pure_powerlaw$exponent 
    if (initial_rate < 0) { initial_rate <- exp.fit(data,threshold)$rate } 
    minute_rate <- 1e-6 
    theta_0 <- as.vector(c(initial_exponent,initial_rate)) 
    theta_1 <- as.vector(c(initial_exponent,minute_rate)) 
    switch(method, 
    constrOptim = { 
     # Impose the constraint that rate >= 0 
     # and that exponent >= -1 
     ui <- rbind(c(1,0),c(0,1)) 
     ci <- c(-1,0) 
     # Can't start with values on the boundary of the feasible set so add 
     # tiny amounts just in case 
     if (theta_0[1] == -1) {theta_0[1] <- theta_0[1] + minute_rate} 
     if (theta_0[2] == 0) {theta_0[2] <- theta_0[2] + minute_rate} 
     est <- constrOptim(theta=theta_0,f=negloglike,grad=NULL,ui=ui,ci=ci) 
     alpha <- est$par[1] 
     lambda <- est$par[2] 
     loglike <- -est$value}, 
    optim = { 
     est <- optim(par=theta_0,fn=negloglike) 
     alpha <- est$par[1] 
     lambda <- est$par[2] 
     loglike <- -est$value}, 
    nlm = { 
     est.0 <- nlm(f=negloglike,p=theta_0) 
     est.1 <- nlm(f=negloglike,p=theta_1) 
     est <- est.0 
     if (-est.1$minimum > -est.0$minimum) { est <- est.1;cat("NLM had to switch\n") } 
     alpha <- est$estimate[1] 
     lambda <- est$estimate[2] 
     loglike <- -est$minimum}, 
    {cat("Unknown method",method,"\n"); alpha<-NA; lambda<-NA; loglike<-NA} 
) 
    fit <- list(type="powerexp", exponent=alpha, rate=lambda, xmin=threshold, 
       loglike=loglike, samples.over.threshold=length(x)) 
    return(fit) 
} 

Wyjazd https://github.com/jeffalstott/powerlaw/ uzyskać więcej informacji

+0

Odpowiedź jest przydatna, ale niekompletna, proszę sprawdzić moją odpowiedź na proste pytanie używając R na https://stackoverflow.com/a/45800141/4928558 dla kroków, aby móc uruchomić kod udostępniony w tej odpowiedzi. – atfornes

0

Powerlaw biblioteki mogą być bezpośrednio wykorzystywane do szacowania parametrów w sposób następujący:

  1. zainstalować wszystkie pytony zależności:

    pip install powerlaw mpmath scipy 
    
  2. uruchomić pakiet potęgowym zmieścić się w środowisku Pythona:

    import powerlaw 
    data = [5, 4, ... ] 
    results = powerlaw.Fit(data) 
    
  3. uzyskać parametry z wynikami

    results.truncated_power_law.parameter1 # power law parameter (alpha) 
    results.truncated_power_law.parameter2 # exponential cut-off parameter (beta) 
    
Powiązane problemy