python scipy.stats.powerlaw exponente negativo
statistics idl-programming-language (3)
Si desea generar una distribución de ley de potencia, puede usar una desviación aleatoria. Solo debe generar un número aleatorio entre [0,1] y aplicar el método inverso ( Wolfran ). En este caso, la función de densidad de probabilidad es:
p (k) = k ^ (- gamma)
y y es la variable uniforme entre 0 y 1.
y ~ U (0,1)
import numpy as np
def power_law(k_min, k_max, y, gamma):
return ((k_max**(-gamma+1) - k_min**(-gamma+1))*y + k_min**(-gamma+1.0))**1.0/(-gamma + 1.0)
Ahora para generar una distribución, solo tienes que crear una matriz
nodes = 1000
scale_free_distribution = np.zeros(nodes, float)
k_min = 1.0
k_max = 100*k_min
gamma = 3.0
for n in range(nodes):
scale_free_distribution[n] = power_law(k_min, k_max,np.random.uniform(0,1), gamma)
Esto funcionará para generar una distribución de ley de potencia con gamma = 3.0, si desea arreglar el promedio de distribución, debe estudiar las redes complejas porque el k_min depende de k_max y la conectividad promedio.
Quiero proporcionar un exponente negativo para la rutina scipy.stats.powerlaw, por ejemplo, a = -1.5, para dibujar muestras aleatorias:
"""
powerlaw.pdf(x, a) = a * x**(a-1)
"""
from scipy.stats import powerlaw
R = powerlaw.rvs(a, size=100)
¿Por qué se requiere un> 0, cómo puedo suministrar un negativo a para generar las muestras aleatorias, y cómo puedo suministrar un coeficiente / transformación de normalización, es decir,
PDF(x,C,a) = C * x**a
La documentación está aquí
http://docs.scipy.org/doc/scipy/reference/generated/scipy.stats.powerlaw.html
¡Gracias!
EDIT: debería agregar que estoy tratando de replicar la función RANDOMP de IDL:
Si r es una desviación aleatoria uniforme de U (0,1), entonces x en la siguiente expresión es una desviación aleatoria distribuida de la ley de potencias:
x = xmin * (1-r) ** (-1/(alpha-1))
donde xmin es el valor más pequeño (positivo) por encima del cual se cumple la distribución de la ley de poder, y alfa es el exponente de la distribución.
Un PDF, integrado en su dominio, debe ser igual a uno. En otras palabras, el área bajo una curva de función de densidad de probabilidad debe ser igual a uno.
In [36]: import scipy.integrate as integrate
In [40]: y, err = integrate.quad(lambda x: 0.5*x**(-0.5), 0, 1)
In [41]: y
Out[41]: 0.9999999999999998 # The integral is close to 1
La función de densidad de powerlaw tiene un dominio de 0 <= x <= 1. En este dominio, la integral de x**b
es finita para cualquier b
> -1. Cuando b
es más pequeño, x**b
explota demasiado rápido cerca de x = 0
. Entonces, no es una función de densidad de probabilidad válida cuando b <= -1
.
In [38]: integrate.quad(lambda x: x**(-1), 0, 1)
UserWarning: The maximum number of subdivisions (50) has been achieved...
# The integral blows up
Por lo tanto, para x**(a-1)
, a
debe satisfacer a-1 > -1
o equivalentemente, a > 0
.
La primera constante a
en a * x**(a-1)
es la constante de normalización que hace que la integral de a * x**(a-1)
sobre el dominio [0,1] sea igual a 1. Así que no lo hace t puede elegir esta constante independientemente de a
.
Ahora bien, si cambia el dominio para que esté a una distancia medible de 0, entonces sí, podría definir un PDF de la forma C * x**a
para a negativo a
. Pero tendría que indicar qué dominio desea, y no creo que haya (todavía) un PDF disponible en scipy.stats
para esto.