[PYTHON] Comment trouver la quantité moyenne d'informations (entropie) de la distribution de probabilité d'origine à partir de l'échantillon

** Notes sur cet article ** C'est un graffiti amateur. Je pense qu'il y a de nombreuses erreurs, des termes inappropriés et aucune preuve. Merci de votre compréhension.

Objectif de cet article

Je veux trouver la quantité moyenne d'informations de la distribution de probabilité d'origine à partir de l'échantillon généré par la distribution de probabilité continue.

théorie

La quantité moyenne d'informations dans une distribution de probabilité continue avec une fonction de densité de probabilité $ , , f , $ $ , h (X) , $ est exprimée par l'équation 1, mais le nombre d'échantillons $ , N , $ S'il est suffisamment grand, il peut être obtenu à partir de la quantité d'informations de chaque échantillon $ , , x_i , $ comme indiqué dans l'équation 2 (devrait).

\begin{align}
&h(X) = \int_{\chi}^{}f(x)\,log\,f(x)\,dx\qquad\qquad ・ ・ ・ Équation 1\\
&h(X) \approx \frac{1}{N}\sum_{i=1}^{N}\,-logP(\,X = x_i\,)\,\qquad ・ ・ ・ Équation 2
\end{align}

Afin d'obtenir $ , h (X) $ à partir de l'équation 2, il est nécessaire d'obtenir $ , P (, X = x_i ,) , $ pour chaque échantillon $ , , x_i , $. .. De là, je vais expliquer un peu comment trouver $ P (, X = x_i ,) , $ et $ , h (X) , $.

Tout d'abord, nous définissons certaines quantités. -Réglez la distance entre chaque échantillon comme $ , d (x_i, , x_j) , $ $ ^ * $. -Pour chaque échantillon $ , , x_i , $, le nombre total d'échantillons dont la distance à $ x_i , $ est inférieure ou égale à $ , , d , $ est $ , n_i Définissez , $ (y compris vous-même). ・ Définissez le volume de la zone où la distance d'un certain $ , , x , $ est inférieure à $ , r , $ comme $ , V (r) , $ .. Selon cette définition, $ , P (, X = x_i ,) , $ peut être approximativement obtenu à partir de l'équation 3 en déterminant le $ , r , $ approprié.

P(\,X=x_i\,)\, \approx \frac{n_i}{NV(r)}\qquad ・ ・ ・ Équation 3

L'équation 4 est obtenue en remplaçant l'équation 3 par l'équation 2.

\begin{align}
h(X,r) &\approx \frac{1}{N}\sum_{i=1}^{N}\,-log\frac{n_i}{NV(r)}\\
&= \,logV(r) + logN - \frac{1}{N}\sum_{i=1}^{N}\,log\,n_i\qquad ・ ・ ・ Équation 4
\end{align}

Afin d'établir l'approximation de l'équation 3, il est préférable que $ r , $ prenne une valeur aussi petite que possible. Cependant, tant que le nombre d'échantillons est fini, si $ r , $ est extrêmement petit, la loi des grands nombres ne peut être satisfaite et l'approximation de l'équation 3 tombe en panne. Par conséquent, il est nécessaire de réfléchir à la manière de déterminer correctement $ r , $ tout en regardant les données réelles.     $ ^ * \ lim_ {d (x_i, , x_j) \ à 0} P (, X = x_i ,) = lim_ {d (x_i, , x_j) \ à 0} P (, X = x_j) Tout devrait bien se passer tant qu'il rencontre ,) , , $

application

Générez un échantillon à partir d'une distribution gaussienne bidimensionnelle appropriée et trouvez $ h (X) , $.

import numpy as np
from matplotlib import pyplot as plt


def calc_d(x):
    N = len(x)
    x_tiled = np.tile(x, (N, 1, 1))
    d = np.linalg.norm(x_tiled - x_tiled.transpose((1, 0, 2)), axis=2)
    return d


#Appliquez la formule pour l'aire du cercle car le nombre de dimensions est de 2.
def calc_v(r):
    v = np.pi * np.power(r, 2)
    return v


def calc_h(d, v, N, r):
    n = np.sum(d <= r, axis=0)
    h = np.log(v) + np.log(N) - np.sum(np.log(n)) / N
    return h


#Générer des données à partir d'une distribution gaussienne bidimensionnelle appropriée
data = np.random.normal(0, 1, (1000, 2))
#h en changeant r(X)Calculer
r_list = [(i + 1) * 0.01 for i in range(10000)]  #La plage de r a été décidée de manière appropriée
d = calc_d(data)
N = len(data)
h_list = [calc_h(d, calc_v(r), N, r) for r in r_list]
#Dessinez un graphique
#Tracez la valeur calculée avec une ligne bleue continue
plt.figure(0)
plt.plot(r_list, h_list, color='blue', linestyle='solid')
#Tracez la valeur calculée à partir de la variance de l'échantillon avec une ligne pointillée bleue
Z = np.cov(data[:, 0], data[:, 1])
h_s = 0.5 * np.log(np.linalg.det(2 * np.pi * np.e * Z))
plt.plot(r_list, [h_s for _ in range(len(r_list))], color='blue', linestyle='dotted')
#Tracez la valeur calculée à partir de la variance de la population avec une ligne pointillée orange
h_u = np.log(2 * np.pi * np.e)
plt.plot(r_list, [h_u for _ in range(len(r_list))], color='orange', linestyle='dotted')
plt.xlim([0, 3])
plt.ylim([0, 5])
plt.show()

Lorsqu'il est exécuté, un tel graphique est obtenu.

Figure_0.png

L'axe horizontal représente $ , r , $ et l'axe vertical représente $ , h (X, r) , $. Comme expliqué en théorie, plus $ r , $ est petit, plus $ , h (X, r) , $ sera proche de la valeur vraie, mais s'il est trop petit, il divergera à son tour vers l'infini négatif. J'irai. En regardant le graphique, il semble qu'il soit en quelque sorte bon de décider $ , r , $ pour que la pente soit la plus petite. En fait, si l'approximation de l'équation 3 est vraie, alors $ , \ frac {\ partial} {\ partial r} h (X, r) = 0 , $ est également valable, donc cette décision n'est pas si étrange. Je pense, mais il n'y a pas de preuve, donc l'excès de confiance est interdit.

Recommended Posts

Comment trouver la quantité moyenne d'informations (entropie) de la distribution de probabilité d'origine à partir de l'échantillon
Comment calculer la quantité de calcul appris de ABC134-D
Comment trouver le coefficient de mise à l'échelle d'une ondelette bipolaire
Comment représenter la distribution de la composition bactérienne à partir des données d'analyse Qiime2 dans un diagramme de moustaches
Comment trouver l'adresse mémoire de la valeur de la trame de données Pandas
Comment calculer la volatilité d'une marque
Comment trouver la zone du diagramme de Boronoi
[Circuit x Python] Comment trouver la fonction de transfert d'un circuit en utilisant Lcapy
Étapes pour calculer la probabilité d'une distribution normale
Comment publier un ticket depuis l'API Shogun
J'ai essayé de trouver l'entropie de l'image avec python
[Ubuntu] Comment supprimer tout le contenu du répertoire
Comment trouver le nombre optimal de clusters pour les k-moyennes
Hériter de la bibliothèque standard pour trouver la valeur moyenne de Queue
Comment compter rapidement la fréquence d'apparition des caractères à partir d'une chaîne de caractères en Python?
Comment échantillonner à partir de n'importe quelle fonction de densité de probabilité en Python
Comment obtenir une liste de liens à partir d'une page de wikipedia
Comment connecter le contenu de la liste dans une chaîne de caractères
Comment prendre une capture d'écran de l'écran Chrome (l'empêcher de se couper au milieu)
Comment déterminer l'existence d'un élément sélénium en Python
Comment vérifier la taille de la mémoire d'une variable en Python
Comment vérifier la taille de la mémoire d'un dictionnaire en Python
Comment afficher le résultat de sortie de la commande man Linux dans un fichier
Comment obtenir les coordonnées de sommet d'une entité dans ArcPy
Comment extraire la chaîne de caractères souhaitée à partir d'une ligne 4 commandes
Comment créer une grande quantité de données de test dans MySQL? ??
Trouvez tous les modèles pour extraire un nombre spécifique de l'ensemble
[NNabla] Comment supprimer le niveau intermédiaire d'un réseau prédéfini
[Python] Une fonction simple pour trouver les coordonnées du centre d'un cercle
De l'introduction de l'API GoogleCloudPlatform Natural Language à son utilisation
Comment connaître le nombre de processeurs sans utiliser la commande sar
[Introduction à Python] Comment trier efficacement le contenu d'une liste avec le tri par liste
[NNabla] Comment ajouter une couche de quantification à la couche intermédiaire d'un modèle entraîné
Comment mettre un numéro de ligne au début d'un fichier CSV
Comment obtenir un exemple de rapport à partir d'une valeur de hachage à l'aide de l'API de Virus Total
Comment créer un wrapper qui préserve la signature de la fonction à envelopper
Obtenez le salaire moyen d'un emploi avec des conditions spécifiées sur Indeed.com
Comment lire une vidéo tout en regardant le nombre d'images (Mac)
Comment créer un clone depuis Github
Comment vérifier la version de Django
Comment enregistrer les informations de point caractéristique de l'image dans un fichier et l'utiliser pour la mise en correspondance
Comment faire fonctionner Linux depuis la console
Comment créer un référentiel à partir d'un média
Comment accéder à la banque de données de l'extérieur
Utilisez Ruby et Python pour trouver la probabilité qu'une carte avec un nombre naturel de 1 à 100 soit un multiple de 3 et non un multiple de 5.
Comment passer le résultat de l'exécution d'une commande shell dans une liste en Python
Comment mentionner un groupe d'utilisateurs avec une notification de mou, comment vérifier l'ID d'un groupe d'utilisateurs
Un débutant en programmation a essayé de vérifier le temps d'exécution du tri, etc.
Découvrez comment diviser uniformément un fichier avec un certain nombre de lignes
[NNabla] Comment obtenir la sortie (variable) de la couche intermédiaire du réseau construit
Comment compter le nombre d'éléments dans Django et sortir dans le modèle
Un mémorandum expliquant comment exécuter la commande magique! Sudo dans Jupyter Notebook
Connexion SSH au serveur cible à partir de Windows en un clic sur un raccourci
[Numpy, scipy] Comment calculer la racine carrée d'une matrice Elmeet à valeur semi-régulière
Comment trouver le coefficient de la courbe approximative passant par les sommets en Python
Comment faire un Raspberry Pi qui parle les tweets d'un utilisateur spécifié
Comment obtenir une liste de fichiers dans le même répertoire avec python
J'ai essayé de créer un modèle avec l'exemple d'Amazon SageMaker Autopilot
[Introduction à Python] Comment obtenir l'index des données avec l'instruction for