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. ** **
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.
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
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 | |
---|---|
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.
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.
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.
# 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.
É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.
Au fait, le résultat de l'estimation est comme ça.
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.
Présentation des données traitées cette fois.
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.
Voici le résultat de la visualisation en 3D. Je ne comprends pas de plus en plus.
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é |
---|---|
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é.
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