[PYTHON] Essayons à nouveau Estimation de la plupart des probabilités et ajustement du modèle (distribution de probabilité) ① Distribution de probabilité discrète

introduction

En parlant d'analyse de données, c'est la construction d'un modèle statistique qui peut expliquer les relations cachées dans les données observées. La compréhension de la distribution de probabilité est essentielle pour construire des modèles statistiques. Dans l'idée d'analyse des données, les données d'une variable proviennent d'un phénomène probabiliste. Inversement, quel type de distribution de probabilité peut être utilisé pour représenter le modèle de données observé? </ b>

Méthode d'estimation la plus probable

Une façon de faire est d'appliquer une distribution de probabilité. Cependant, la forme de la distribution de probabilité change en fonction des paramètres, il est donc nécessaire de déterminer les valeurs de paramètre appropriées en fonction des données observées pour l'ajustement. La méthode d'estimation la plus probable est une méthode majeure de calcul de la valeur du paramètre.

Décrivant grossièrement la méthode de la méthode d'estimation la plus probable, en supposant que les données obtenues sont N données Y extraites d'une distribution de probabilité avec un certain paramètre θ, la probabilité d'extraction de chaque valeur est $ p (y_i | θ). ) Soit la fonction de vraisemblance L le produit de $ par N pièces. $L(θ|{y_i}) = p(y_1|θ) × p(y_2|θ) × ··· × p(y_N|θ)=\prod_{i=1}^{N}p(y_N|θ)$ Calculez la valeur du paramètre qui maximise la fonction de vraisemblance L. Le flux consiste à convertir (en logarithmisation) en une forme facile à calculer, à différencier partiellement par le nombre de paramètres et à résoudre analytiquement.

Essayez en fait

Il existe deux types de distribution de probabilité, de type discret et de type continu, selon les données. Cette fois-ci, à titre d'exemple de distribution de probabilité de type discret, nous effectuons l'estimation la plus probable de la distribution de Poisson et l'ajustement de la distribution de probabilité.

  • Distribution de probabilité discrète: distribution de Poisson (cette fois)
  • ~~ Distribution de probabilité continue: Distribution normale ~~ (la prochaine fois)

Distribution de probabilité discrète: distribution de Poisson

La distribution de Poisson est principalement utilisée pour les données de dénombrement. La fonction de probabilité qui représente la distribution est la suivante. $ P (y) = \ frac {λ ^ ye ^ {-λ}} {y!} (Paramètre représentant la moyenne de λ = y, y = 0,1,2,3 ...) $

Les données de test pour estimer et ajuster le modèle sont créées à l'avance à partir de la distribution de probabilité cible afin que les réponses puissent être appariées.

Python


"""Nombres aléatoires de la distribution de Poisson"""
import numpy as np
import matplotlib.pyplot as plt

np.random.seed(seed=10)
#Paramètre λ=2.4
poisson_values = np.random.poisson(lam=2.4, size=1000)
p_y, bin_edges, patches = plt.hist(poisson_values , bins=11, range=[-0.5, 10.5], normed=True)
y_k = 0.5*(bin_edges[1:] + bin_edges[:-1])
y_k #y
p_y #p(y)

image.png

Vous pouvez voir les valeurs et les nombres des 1000 pseudo données obtenues. Maintenant, appliquons la distribution de Poisson à de telles données et estimons ses paramètres les plus probables.

Python


"""Estimation des paramètres par différenciation partielle de la fonction de vraisemblance logarithmique"""
import sympy #Bibliothèque de calculs algébriques (résolution de différenciation et d'équations)
#Définir des variables
sympy.var('λ y ')
#Responsabilité p(Paramètres|y)Définir
f = (λ**y)*sympy.exp(-λ)/sympy.factorial(y)
#Logistique
logf=sympy.log(f)
#Différencier partiellement f et développer l'équation
pdff = sympy.expand(sympy.diff(logf, λ))

La formule pdff, qui est la différenciation partielle de la vraisemblance logarithmique par rapport au paramètre λ, est $ \ frac {y_i} {λ} -1 $. Puisque cela peut être calculé comme λ, qui est $ \ sum_ {i = 1} ^ {1000} (\ frac {y_i} {λ} -1) = 0 $, qui est la somme des données.

Python


def L_sympy(f,var,values):       
    likelihood = 0 #Valeur initiale de la vraisemblance
    for i in np.arange(len(values)): #Pour le nombre de données
        # model output 
        # print(values[i])
        likelihood += f.subs(var,values[i]) #Remplacez y par une valeur
        # print(likelihood)
    param = sympy.solve(likelihood, λ) #Résous l'équation pour λ
    # print(param)
    return param

L_sympy(pdff,"y",poisson_values)

Estimation des paramètres:[289/125]=2.312

Le paramètre λ a été estimé à 2,312. Le réglage de λ de ces pseudo-données est 2,4, vous pouvez donc bien l'estimer.

Si le modèle statistique est complexe

Comme pour la méthode du manuel, vous pouvez obtenir directement la formule qui permet de calculer les paramètres en résolvant la formule partiellement différenciée (dérivée) comme décrit ci-dessus. Cependant, dans la modélisation statistique générale, il y a plusieurs paramètres à estimer, et la formule de la distribution de probabilité est plus compliquée, elle n'est donc pas facile à résoudre.

Modèle statistique et distribution de probabilité

Dans le modèle linéaire généralisé (GLM) couramment utilisé, le modèle statistique qui décrit les données est représenté par la forme de distribution de probabilité et de prédiction linéaire (et fonction de lien). 統計モデル_図01.png

L'exemple donné ci-dessus ne traite que Y comme Y ... On peut dire que c'est un modèle statistique.

Estimation des paramètres lorsque le modèle statistique est compliqué

En passant, ce n'est pas facile à résoudre car il y a plusieurs paramètres à estimer comme un modèle statistique général et la formule est compliquée (pas une formule linéaire comme ce qu'on appelle $ \ frac {y} {λ} -1 $, mais $ λ Non-linéaire comme ^ 2 + θ ^ 3 + ... $). Par conséquent, nous utilisons la méthode de résolution d'équations non linéaires.

Python


"""Fonction de distribution de probabilité discrète (fonction de masse de probabilité)"""
def probability_poisson(y,λ):
    from scipy.special import factorial
    # λ:Paramètres
    # y:Données y: se produit y fois
    # return:Données Y probabilité P(y|Paramètres) 
    return (λ**y)*np.exp(-λ)/factorial(y)

"""Fonction de vraisemblance de type journal: type discret"""
def L_func(param,y):       
    likelihood = 0 #Valeur initiale de la vraisemblance
    for i in np.arange(len(y)):
        # model output 
        p = probability_poisson(y[i], param)
        # likelihood
        likelihood += -np.log(p) #Responsabilité
    return likelihood 

"""Estimation des paramètres"""
"""
Méthode Semi-Newton (BFGS, L)-Méthode BFGS: la mémoire peut être sauvegardée dans les cas compliqués)
"""
from scipy import optimize
x0 = [2] #Valeurs initiales des paramètres
bound = [(0, None)] #Portée de la recherche de paramètres optimale(min,max)

params_MLE = optimize.minimize(L_func,x0,args=(poisson_values),method='l-bfgs-b',
                       jac=None, bounds=bound, tol=None, callback=None,
                        options={'disp': None, 'maxls': 20, 'iprint': -1,
                                 'gtol': 1e-05, 'eps': 1e-08, 'maxiter': 15000,
                                 'ftol': 2.220446049250313e-09, 'maxcor': 10,
                                 'maxfun': 15000})

#Estimation la plus probable du paramètre
print('Paramètres:',params_MLE.x)
#Nombre de paramètres
k=1
#AIC (le modèle avec la plus petite valeur est un bon ajustement)
print('AIC:',params_MLE.fun*(2)+2*k)

Paramètres:[2.31200054]
AIC: [3607.0081302]

De même, le paramètre λ a été estimé à 2,312.

Je veux connaître les paramètres rapidement ...

Python


"""curve_Il existe également un calcul de paramètres avec ajustement pour le moment"""
from scipy.optimize import curve_fit
parameters, cov_matrix = curve_fit(f=probability_poisson, xdata=y_k, ydata=p_y) 
print("Paramètres:",parameters, "Co-distribué:",cov_matrix)

Paramètres: [2.31643586]Co-distribué: [[0.00043928]]

Appliquer aux données et essayer d'illustrer

Appliquons le modèle (distribution de Poisson) aux données avec le paramètre estimé λ = 2,312.

Python


"""Illustration de son application"""
acc_mle = probability_poisson(y_k, params_MLE.x)
plt.hist(poisson_values , bins=11, range=[-0.5, 10.5], normed=True)
plt.plot(y_k,acc_mle)

image.png

Ça fait du bien.

Recommended Posts

Essayons à nouveau Estimation de la plupart des probabilités et ajustement du modèle (distribution de probabilité) ① Distribution de probabilité discrète
Essayons à nouveau La plupart des estimations de probabilité et ajustement du modèle (distribution de probabilité) ② Distribution de probabilité continue
Avantages et inconvénients de la méthode d'estimation la plus probable
Méthode du carré minimum et méthode d'estimation la plus probable (comparaison par ajustement du modèle)
Exemple de code python pour la distribution exponentielle et l'estimation la plus probable (MLE)
Concept de raisonnement bayésien (2) ... Estimation bayésienne et distribution de probabilité
Implémentation d'estimation la plus probable du modèle de sujet en python
Estimation la plus probable de la moyenne et de la variance avec TensorFlow
Super introduction à l'apprentissage automatique Modèle probabiliste et estimation la plus probable
Estimation la plus probable de diverses distributions avec Pyro