[PYTHON] Une méthode pour regrouper des points distribués sur une hypersphère, qui est pratique pour l'exploration de texte et l'extraction de caractéristiques des informations de direction.

en premier

En raison de la recherche, il était nécessaire d'utiliser des données vectorielles tridimensionnelles comme entrée pour l'apprentissage automatique. En tant que format de données, nous obtenons un vecteur tridimensionnel avec des longueurs différentes toutes les quelques secondes.

En nous concentrant uniquement sur la direction du vecteur, nous normalisons la longueur du vecteur composite à 1. Le contenu principal est de savoir comment extraire la quantité de caractéristiques des données de direction obtenues dans une si grande quantité de séries chronologiques. En conclusion, les paramètres sont très probablement estimés à partir de la distribution de von Mises-Fisher (vMFD), et les données de direction sur l'hypersphère sont regroupées par mélange de vMFD (movMFD). Cette valeur modélisée peut être considérée comme une sorte de quantité d'entités dans les données de direction. Comme le comprendront ceux qui font du traitement du langage naturel, il s'agit d'une méthode étroitement liée à l'indice de fréquence des mots tf-idf dans les documents. Il peut également être utilisé dans des systèmes où la «direction du vecteur» change avec le temps dans l'espace physique.

Le livre auquel j'ai fait référence cette fois est le chapitre 7, "Détection d'anomalie des données de direction" dans "Détection d'anomalie et détection de changement". Le programme utilisé est cluster de sphères clara-labs. De plus, j'ai utilisé une partie de l'explication détaillée de cet article ("Clustering on the Unit Hypersphere using von Mises-Fisher Distributions"). Il est. Le but est d'extraire la quantité de caractéristiques des données vectorielles D-dimensionnelles, mais selon l'exemple de spherecluster, nous ferons tout jusqu'au clustering après avoir extrait la quantité de caractéristiques. Grâce à ce package, l'efficacité du travail s'est immédiatement améliorée. Merci beaucoup.

** C'est la première fois que vous utilisez les informations de distribution et de direction de von Mises-Fisher, donc si vous avez des opinions sur le développement ou des malentendus, je vous serais reconnaissant si vous pouviez commenter. ** **

Essayez d'utiliser un cluster de sphères

Aperçu du package

spherecluster est un package python créé sur la base de l'algorithme introduit dans cet article. Il est principalement composé de deux algorithmes, Spherical K-means (spkmeans) et movMF, et il existe deux types de movMF, soft- et hard-. Tout d'abord, installez ce cluster de sphères.

pip install spherecluster

c'est simple. À propos, cela dépend de packages tels que sklearn et numpy.

Algorithms Spherical Clustering Une méthode qui étend le concept de K Means sur une surface sphérique. La méthode de calcul est la même que celle des KMeans, seul l'espace d'entrée est défini comme une surface sphérique.

À propos de vMFD

vMFD est une méthode d'expression générale qui exprime des points distribués sur une hypersphère comme une distribution de probabilité comme une distribution normale. Voir wikipedia

Screen Shot 2017-01-27 at 13.26.54.png

Si vous regardez la formule, vous pouvez voir qu'elle est représentée par deux paramètres [$ \ mu $, $ \ kappa $] pour l'entrée x. $ \ Mu $ est la direction moyenne des points distribués, et $ \ kappa $ est le degré de concentration autour de $ \ mu $. En d'autres termes, comme le montre la figure ci-dessous, lorsque le degré de concentration $ \ kappa $ augmente, des points existent jusqu'à une position éloignée de la direction moyenne $ \ mu $ (trait plein).

Image du wiki \kappaEt relation de distribution(\thetaEst l'angle de la direction moyenne)
Screen Shot 2017-01-26 at 8.09.47.png

De plus, comme vous pouvez le voir à partir de la formule mathématique, le calcul de la constante de régularisation comprend une fonction compliquée appelée la fonction Vessel de transformation de première classe, et il semble que cela prendra un certain temps à comprendre.

Le MFD mov utilisé cette fois est cette distribution mixte de vMFD (Mixture Distribution). Dans cet article, nous nous concentrerons sur des exemples d'utilisation réels plutôt que sur la compréhension des formules mathématiques.

movMFD La probabilité d'une distribution mixte composée d'un modèle de distribution mixte (Mixture Model) et de vMFD est résolue par l'algorithme EM.

Screen Shot 2017-01-27 at 7.43.35.png

Une approche similaire au [modèle gaussien mixte] commun (http://scikit-learn.org/stable/modules/mixture.html). En d'autres termes, il sera regroupé en tant que vMFD indépendant sur la surface sphérique de cette manière.

sphere_w_clusters.png

Example1: small-mix Les données factices bidimensionnelles sont regroupées de quatre manières: K moyennes, KMeans sphériques, soft-movMF et hard-mov MF. Le programme actuel est ici.

Tout d'abord, installez la bibliothèque.

import numpy as np
from matplotlib import pyplot as plt
from sklearn.cluster import KMeans
from sklearn import metrics

import sys
sys.path.append('../spherecluster')

from spherecluster import SphericalKMeans
from spherecluster import VonMisesFisherMixture
from spherecluster import sample_vMF

Ensuite, il génère des données basées sur les deux vMF suivants. \mu_0=[-0.251, -0.968], \kappa_0=8 \mu_1=[0.399, 0.917], \kappa_1=2 Le nombre de données num_points_per_class est de 100.

# Generate small-mix dataset
mu_0 = np.array([-0.251, -0.968])
mu_1 = np.array([0.399, 0.917])
mus = [mu_0, mu_1]
kappa_0 = 8 # concentration parameter
kappa_1 = 2 # concentration parameter
kappas = [kappa_0, kappa_1]
num_points_per_class = 100

X_0 = sample_vMF(mu_0, kappa_0, num_points_per_class)
X_1 = sample_vMF(mu_1, kappa_1, num_points_per_class)
X = np.zeros((2 * num_points_per_class, 2))
X[:num_points_per_class, :] = X_0
X[num_points_per_class:, :] = X_1
labels = np.zeros((2 * num_points_per_class, ))
labels[num_points_per_class:] = 1

Ensuite, montez sur K Mean, K-Means sphériques, soft-movMF, hard-mov MF.

À ce stade, l'erreur suivante peut se produire.

ValueError: Data l2-norm must be 1

Dans la fonction movMF, les données d'entrée sont calculées comme une valeur unique pour chaque ensemble, mais la valeur absolue de la valeur unique peut être supérieure à 1e-4 avec une probabilité d'environ 5% dans les données générées par le sample_vMF d'origine. À ce stade, le programme s'arrêtera en raison du traitement des erreurs, nous allons donc calculer de force la valeur unique et éliminer la cause de l'erreur.

Si vous exécutez le programme suivant avant l'installation, l'erreur disparaîtra. (Cependant, les données à l'origine de l'erreur disparaîtront également, de sorte que le nombre total d'échantillons diminuera également.)

import scipy.sparse as sp
dummy = []
n_samples = X.shape[0]
for ee in range(n_samples):
    if sp.issparse(X):
        n = sp.linalg.norm(X[ee, :])
    else:
        n = np.linalg.norm(X[ee, :])

    if np.abs(n - 1.) > 1e-4:
        dummy.append([ee, n])

X = np.delete(X, np.array(dummy)[:, 0], 0)

Le résultat de l'exécution est le suivant.

small_mix_2d.png

Étant donné que les données d'origine sont soigneusement divisées en deux groupes, il n'y a pas de différence notable entre les méthodes.

Example2: small-mix_3d Regroupons sur des données 3D avec le même contenu que Example1. Cliquez ici pour le code original.

Si vous regardez le script, vous pouvez voir qu'il est presque le même que Examaple1. Voici le résultat de son exécution.

figure_2.png

Au fait, le résultat de l'estimation est comme ça.

Screen Shot 2017-01-27 at 10.58.06.png Au moins pour les données générées à portée de main, il semble montrer de meilleures performances que les kmeans et les spkmeans.

Introduction des données

Présentation des données traitées cette fois.

Screen Shot 2017-01-26 at 6.56.25.png

id est une valeur associée à chaque nœud, et cette fois c'est une valeur fixe. [x, y, z] est un vecteur tridimensionnel, l'azimut, l'angle est mis de côté et la norme est la "longueur" combinée de [x, y, z]. Supposons qu'il y ait environ 3000 échantillons de ces données.

EDA

Pour le moment, seule une simple visualisation est nécessaire.

L'histogramme et le diagramme de corrélation de chaque variable sont les suivants. D'une certaine manière, il semble que chaque paramètre a ses propres caractéristiques, mais je ne sais pas comment extraire ces caractéristiques.

download (4).png

Voici le résultat de la visualisation en 3D. Je ne comprends pas de plus en plus.

download (5).png

En référence à exemple de cluster de sphères (créer un graphique de sphère), extrayez uniquement les données de direction du diagramme de dispersion ci-dessus. Tracons-le sur une surface sphérique 3D.

Graphique sphérique de toutes les données Graphique sphérique de la première moitié et de la seconde moitié
download.png download.png

D'une manière ou d'une autre, les fonctionnalités sont sorties. Compte tenu de l'influence du temps, j'ai essayé de tracer l'horodatage des données séparément pour la première moitié (bleu) et la seconde moitié (rouge), mais il semble qu'il n'y ait pas de changement d'heure en particulier dans la première moitié et la seconde moitié.

Ajuster à movMF

Enfin, movMF est adapté aux données de test.

###############################################################################
# Mixture of von Mises Fisher clustering (soft)
vmf_soft = VonMisesFisherMixture(n_clusters=1, posterior_type='soft', n_init=20)
vmf_soft.fit(X)

print "center:{}".format(vmf_soft.cluster_centers_)
print "kappa:{}".format(vmf_soft.concentrations_[0])

Le résultat est le suivant.

center:[[-0.82651971  0.17847126  0.53386626]]
kappa:3.91851479297

Nous avons réussi à modéliser la direction et le degré de dispersion du vecteur tridimensionnel avec la distribution de densité de probabilité. Par exemple, si le nombre de dimensions de X correspond au nombre de mots apparaissant dans le document, il est possible de modéliser la répartition des points répartis sur l'hypersphère de dimension D avec movMF et de les regrouper.

Recommended Posts

Une méthode pour regrouper des points distribués sur une hypersphère, qui est pratique pour l'exploration de texte et l'extraction de caractéristiques des informations de direction.
Text mining: distribution de densité de probabilité sur hypersphère et clustering de texte avec KMeans
Quelle est la meilleure méthode pour le traitement asynchrone du serveur TCP?