probabilidad - simular variables aleatorias en python
¿Cómo encontrar la distribución de probabilidad y los parámetros para datos reales?(Python 3) (3)
Puede usar ese código para ajustar (según la probabilidad máxima) diferentes distribuciones con sus datos:
import matplotlib.pyplot as plt
import scipy
import scipy.stats
dist_names = [''gamma'', ''beta'', ''rayleigh'', ''norm'', ''pareto'']
for dist_name in dist_names:
dist = getattr(scipy.stats, dist_name)
param = dist.fit(y)
# here''s the parameters of your distribution, scale, location
Puede ver un fragmento de muestra sobre cómo usar los parámetros obtenidos aquí: ¿ Ajustar la distribución empírica a los teóricos con Scipy (Python)?
Luego, puede elegir la distribución con la mejor probabilidad de registro (también hay otros criterios para coincidir con la "mejor" distribución, como la probabilidad posterior bayesiana, los valores AIC, BIC o BICc, ...).
Para tu pregunta extra, no hay una respuesta genérica. Si su conjunto de datos es significativo y se obtiene en las mismas condiciones que los datos de la palabra real, puede hacerlo.
Tengo un conjunto de datos de sklearn
y sklearn
la distribución de los datos de load_diabetes.target
(es decir, los valores de la regresión que se utilizan para load_diabetes.data
).
Utilicé esto porque tiene el menor número de variables / atributos de la regresión sklearn.datasets
.
Utilizando Python 3, ¿cómo puedo obtener el tipo de distribución y los parámetros de la distribución que más se asemejan?
Todo lo que sé, los valores target
son todos positivos y sesgados (sesgo positivo / sesgo correcto). . . ¿Hay alguna manera en Python de proporcionar algunas distribuciones y luego obtener la mejor opción para el vector / datos de target
? O, ¿para realmente sugerir un ajuste basado en los datos que se dan? Eso sería realmente útil para las personas que tienen conocimientos estadísticos teóricos pero poca experiencia en la aplicación de "datos reales".
Bonificación ¿Tendría sentido utilizar este tipo de enfoque para averiguar cuál sería su distribución posterior con "datos reales"? Si no, ¿por qué no?
from sklearn.datasets import load_diabetes
import matplotlib.pyplot as plt
import seaborn as sns; sns.set()
import pandas as pd
#Get Data
data = load_diabetes()
X, y_ = data.data, data.target
#Organize Data
SR_y = pd.Series(y_, name="y_ (Target Vector Distribution)")
#Plot Data
fig, ax = plt.subplots()
sns.distplot(SR_y, bins=25, color="g", ax=ax)
plt.show()
Según mi conocimiento, no existe una forma automática de obtener el tipo de distribución y los parámetros de una muestra (ya que inferir la distribución de una muestra es un problema estadístico en sí mismo).
En mi opinión, lo mejor que puedes hacer es:
(para cada atributo)
Intente ajustar cada atributo a una lista razonablemente grande de posibles distribuciones (p. Ej., Ver Ajustar la distribución empírica a las teóricas con Scipy (Python)? Para ver un ejemplo con Scipy)
Evalúa todos tus ajustes y elige el mejor. Esto se puede hacer realizando una prueba de Kolmogorov-Smirnov entre su muestra y cada una de las distribuciones del ajuste (nuevamente tiene una implementación en Scipy), y seleccionando la que minimiza D, el estadístico de prueba (también conocida como la diferencia entre muestra y el ajuste).
Bonificación: Tendría sentido, ya que construirá un modelo en cada una de las variables a medida que elija un ajuste para cada una, aunque la bondad de su predicción dependerá de la calidad de sus datos y las distribuciones que esté utilizando para adecuado. Estás construyendo un modelo, después de todo.
Usa este enfoque
import scipy.stats as st
def get_best_distribution(data):
dist_names = ["norm", "exponweib", "weibull_max", "weibull_min", "pareto", "genextreme"]
dist_results = []
params = {}
for dist_name in dist_names:
dist = getattr(st, dist_name)
param = dist.fit(data)
params[dist_name] = param
# Applying the Kolmogorov-Smirnov test
D, p = st.kstest(data, dist_name, args=param)
print("p value for "+dist_name+" = "+str(p))
dist_results.append((dist_name, p))
# select the best fitted distribution
best_dist, best_p = (max(dist_results, key=lambda item: item[1]))
# store the name of the best fit and its p value
print("Best fitting distribution: "+str(best_dist))
print("Best p value: "+ str(best_p))
print("Parameters for the best fit: "+ str(params[best_dist]))
return best_dist, best_p, params[best_dist]