Trouvez des paires proches dans un espace de dimension très élevé avec des vecteurs clairsemés


9

J'ai (~ un million) de vecteurs de caractéristiques. Il y a (~ un million) d'entités binaires, mais dans chaque vecteur, seulement (~ un millier) d'entre elles seraient égales à , les autres étant . Je recherche les paires de vecteurs qui ont au moins (~ cent) traits en commun ( dans les deux). Le nombre de ces paires est d'une ampleur similaire à (~ un million).M K 1 0 L 1 NNMK10L1N

Je pense que cela pourrait être envisagé comme la recherche de paires de points proches dans un espace de très grande dimension. La fonction de distance pourrait être telle qu'elle est basée sur le nombre de caractéristiques que les deux vecteurs ont en commun. Mais il serait probablement utile avec une métrique de distance plus conventionnelle (comme Euclidienne) également.

Quels algorithmes bien connus seraient utiles pour aborder ce problème? Tout ce qui est quadratique en ou ne sera pas pratique.MNM


Un exemple de formulation du problème dans le monde réel est de considérer personnes se déplaçant entre plusieurs endroits. Si deux personnes se trouvaient au même endroit en même temps, nous disons qu'elles se sont rencontrées. (Le nombre de combinaisons emplacement-temps avec au moins 1 personne présente est ) Nous recherchons des amis: des personnes qui se sont rencontrées au moins fois.M LNML


1
Si le vecteur 1, l'entité 1 est , et le vecteur 2, l'entité 1 est également , ont-ils cette caractéristique "en commun"? 000
gung - Rétablir Monica

@ user777, je suppose que non , auquel cas votre réponse est parfaite, mais ce serait bien que cela soit explicitement indiqué par le PO.
gung - Rétablir Monica

@gung, vous supposez bien. J'ai édité la question pour clarifier. Merci!
Daniel Darabos

1
Environ combien de paires de vecteurs ont> 100 caractéristiques en commun - échantillon aléatoire + force brute? Les tailles 1M x 1M sont-elles un vrai problème, ou maquillées? Voir aussi l'approche dans la recherche de chaîne de bits la plus proche sur le stackoverflow.
denis

1
Une suggestion peut-être folle: visualisez vos vecteurs de fonctionnalité de 1 Mbit de long comme des images de 1 000 x 1 000 pixels et recherchez des méthodes de regroupement d'images, par exemple stackoverflow.com/search?q==image image++ clustertering . Afaik, vous devez trouver de bonnes fonctionnalités (pas des pixels simples) pour que cela fonctionne, mais je ne suis pas un expert.
denis

Réponses:


6

Il semble que l'approche que vous recherchez est une combinaison de signatures minhash et de hachage sensible à la localité (LSH); le pdf (disponible gratuitement) de Mining Massive Datasets décrit cette approche (et d'autres mesures de similitude) en détail dans le chapitre 3, mais brièvement:

Une signature minhash est une représentation condensée de votre matrice d'origine qui est construite en appliquant un certain nombre n de fonctions de hachage aux entités, réduisant ainsi le nombre d'entités par observation. Cela réduit la taille de vos données, mais vous remarquerez probablement que cela vous laisse toujours avec un problème .O(N2)

Pour résoudre ce problème, MMDS conseille que si tout ce que vous voulez trouver est des paires au-dessus d'un certain seuil de similitude (qui semblerait s'appliquer dans votre cas), alors vous pouvez vous concentrer uniquement sur les paires qui sont les plus susceptibles d'être similaires - cette approche s'appelle Locality Sensitive Hashing , et dans la section 3.4, ils expliquent comment combiner l'approche de signature minhash avec LSH.

En plus du texte, des cours sont également disponibles sur le cours Coursera du même nom.


7

Je recherche les paires de vecteurs qui ont au moins caractéristiques en commun.L

Ce n'est qu'un produit intérieur de vecteurs de caractéristiques binaires. Lorsque le produit intérieur est supérieur à , la paire aura au moins éléments en commun. Cela devrait être un calcul relativement rapide - au moins, plus rapide que la distance euclidienne, ce qui serait inutile et lent pour ces données. Parce que vous stipulez que vous recherchez des paires, cela signifie par nature que vous devez effectuer des calculs pour comparer chaque vecteur.L ( NL-1L(N2)

Trouver des points proches les uns des autres est en effet un problème de regroupement. Mais la première étape des algorithmes de clustering que je connais est le calcul des distances par paires ou des similitudes. Je suis sûr que quelqu'un a développé des alternatives plus efficaces. Un point sur la terminologie: avoir au moins voisins communs est formulé comme une similitude , pas une distance! Les produits internes sont, dans ce cas, des similitudes de cosinus non normalisés.L

Vous pouvez rendre cela plus maniable en effectuant le calcul du produit interne uniquement lorsque la somme du vecteur de caractéristique (qui est dans ce cas la même que la norme) pour une observation est supérieure à , car il est impossible pour ce vecteur de caractéristique binaire d'avoir un produit intérieur avec un autre vecteur caractéristique binaire qui satisfera mon critère lorsque cette somme est inférieure à . De toute évidence, le calcul de ces sommes n'est qu'une complexité , c'est donc un moyen bon marché de réduire l'ampleur de l'étape de produit interne.L O ( N )L-1LO(N)

Mais la manière classique de réduire l'étendue de ce problème consiste à effectuer un préfiltrage supplémentaire. Êtes-vous particulièrement intéressé par le fait qu'une fonctionnalité quelque peu inhabituelle prenne la valeur 1? Si tel est le cas, effectuez uniquement le calcul pour ces vecteurs de caractéristiques.

Ou peut-être pourriez-vous bénéficier d'un recadrage de votre problème. Par exemple, l'échantillonnage est connu pour avoir de belles propriétés; des statistiques inférentielles développent cette idée assez en profondeur. Il est donc peut-être impossible d'analyser l'ensemble des données, mais il est parfaitement possible d'examiner un petit échantillon. Je ne sais pas à quelle question vous essayez de répondre, mais si vous concevez soigneusement votre expérience, vous pouvez vous en tirer avec seulement quelques milliers d'observations, avec plus que suffisamment de données restantes à des fins de validation.

Après une réflexion supplémentaire, j'ai une intuition forte que les données que vous travaillez avec une sorte de graphique . Il est très plausible que soit composé de plusieurs composants connectés, auquel cas vous pouvez décomposer en un ensemble de graphiques, avec l'effet secondaire heureux de réduire la dimensionnalité des données. Même si le graphique n'est que deux composants connectés de la même taille, cela signifie que vos comparaisons par paires ont à peu près le coût total!G G O ( N 2 ) 1gggO(N2)14

Si le graphique est symétrique, les observations suivantes peuvent être utiles:

  1. Définissez le laplacien de votre graphique comme , où est une matrice diagonale de degré (la somme de chaque vecteur de caractéristique) et est la matrice d'adjacence (l'empilement de vecteurs de caractéristique dans une matrice).D AP=-UNEUNE
  2. Le nombre de fois de apparaît comme étant une valeur propre de est le nombre de composantes connexes de . Décomposer le graphique en ses composants connectés et travailler uniquement avec ces composants aura pour effet secondaire de réduire la dimension de vos données; le calcul de votre quantité d'intérêt sera plus facile. Mais le calcul de la composition par eigend sera coûteux pour un million de sommets ...P G0Pg
  3. (Après une permutation complète) est une matrice diagonale par blocs des laplaciens des composantes connexes de .GPg
  4. P est semi-défini positif. Ceci est presque certainement utile d'une manière ou d'une autre.
  5. La connectivité algébrique de est la valeur de la deuxième plus petite valeur propre de . Cela vous indique à quel point est bien connecté . Cela répondra peut-être à certaines des questions qui vous intéressent: les vecteurs qui ont des caractéristiques en commun. La théorie des graphes spectraux développe cette idée plus en détail.P GgPg

"Est-ce un problème SNA?" Je ne suis pas sûr. Dans une application, les fonctionnalités décrivent le comportement et nous cherchons à connecter des personnes ayant des comportements similaires. Est-ce que cela en fait un problème SNA?

Si vous avez un graphique bipartite reliant les personnes aux comportements, vous pouvez le considérer comme un réseau d'affiliation , avec des personnes comme des lignes et des comportements comme des colonnes. Si vous voulez connecter les gens à des gens via les comportements qu'ils ont en commun, vous pouvez calculer . est le nombre de comportements que les gens ont en commun. Évidemment, l'ensemble des sommets où répond à votre question.BBBT=UNEUNEjejUNEjejL


Merci pour l'excellente réponse! C'est beaucoup de choses que je devrai approfondir. Je ne suis cependant pas convaincu que les comparaisons par paire soient inévitables. N'est-ce pas un problème de clustering où je recherche des clusters de taille> 1? Je m'attendais à ce qu'une approche de partitionnement spatial puisse réduire considérablement le nombre de comparaisons par paires.
Daniel Darabos

Désolé, je ne connais pas grand-chose à la science des données. Mais n'est-ce pas un problème de clustering quand on cherche à regrouper des points proches les uns des autres? J'ai une distance maximale (L) et je veux trouver des groupes (paires) de points qui se trouvent à cette distance les uns des autres. Est-ce que cela étire trop la définition du clustering?
Daniel Darabos

1
Il peut en effet être formulé comme un problème graphique. Dans ce cas, nous avons un graphique bipartite de N points et M entités et voulons trouver des paires de points qui ont au moins L voisins communs. Je regarde spécifiquement le phrasé basé sur un vecteur d'entité maintenant, en espérant qu'il existe une méthode de clustering qui pourrait être utile pour moi. K-SVD a été suggéré pour un problème similaire dans stats.stackexchange.com/questions/93366/… , donc je lis à ce sujet en ce moment. Merci!
Daniel Darabos

"Est-ce un problème SNA?" Je ne suis pas sûr. Dans une application, les fonctionnalités décrivent le comportement et nous cherchons à connecter des personnes ayant des comportements similaires. Est-ce que cela en fait un problème SNA? Merci de m'avoir présenté la terminologie, il est très utile de guider ma recherche.
Daniel Darabos

J'ai révisé ma réponse. Votre but ultime est-il simplement d'énumérer les personnes ayant de nombreux comportements en commun, ou s'agit-il d'autre chose?
Sycorax dit Réintégrer Monica le

2

À la recherche de personnes se réunissant en blocs spatio-temporels:
espace en blocs (blocs de ville, km2, ) et le temps en blocs . Il y a de fortes chances que si les gens se rencontrent, ils se rencontreront dans le même bloc. Exécutez donc NN dans chaque bloc. Les temps d'exécution et les taux d'erreur dépendront bien sûr de la taille et de la forme des blocs (également de ce que vous pouvez paralléliser / MapReduce), mais vous avez des paramètres avec lesquels jouer - ingénierie, pas ouvert .NspuneceNtjeme
O(N2)

Voir aussi:
voisins les plus proches recherche de données de très haute dimension sur datascience.stackexchange

pairwise.py :

utilise la bibliothèque Python Gensim et le tas de la bibliothèque standard pour effectuer des comparaisons par paires massivement rapides et évolutives entre un nombre généralement important de documents utilisant TF-IDF et la distance cosinusoïdale.


1

xfeat1:value1,feat101:value101KKK

Pour chaque fonctionnalité, créez un dictionnaire contenant les index partageant cette fonctionnalité. Espérons que ce nombre ne sera pas trop grand (si vous avez une fonctionnalité partagée par tous les index, cette approche est ruinée, vous pouvez arrêter de lire ici).

feat1:{1,101,202},feat2:{7,202},feat3:{202}...featM:{3,45,6}feat3O(NK)

XXXPO(N2)

Xy(X,y)<X,y>XyO(K)

O(NPK)O(MN2)

J'ai appliqué cette méthode pour implémenter un KNN sur un grand ensemble de texte (train: 2 000 000 lignes, tester 35 000 lignes, nombre d'entités: 10 000, nombre moyen d'entités par élément: 20), qui a fonctionné en une heure environ. .


Je ne comprends pas entièrement cette approche - ce n'est pas parce que je ne vous crois pas, c'est entièrement dû à mon manque de connaissance des différentes stratégies de représentation des données. Peut-être pourriez-vous développer davantage ce que vous couvrez dans les deux premiers paragraphes?
Sycorax dit Réintégrer Monica le

O(N2)

1

kO(LNJournal(N))

L. Erotz, M. Steinbach et V. Kumar. "Un nouvel algorithme de clustering de voisins les plus proches et ses applications." Actes du 1er atelier sur le regroupement des données de haute dimension et leurs applications, 2002.


Merci, c'est une lecture intéressante. Comment avez-vous obtenu l'heure O (LN log (N))? Ça sonne bien. Mais la description de l'algorithme commence par "Construire la matrice de similitude" et ce serait une matrice NxN pour autant que je sache.
Daniel Darabos

@DanielDarabos La complexité est décrite dans le livre Practical Graph Mining with R.
Sycorax dit Reinstate Monica

1

O(kJournaln)k<<n

Étant donné que votre k est 100 et votre n est 1e6, cela devrait vous donner une vitesse de ~ 1e4x par rapport à la FFT classique.

Si vous avez besoin de 20 fois plus de vitesse et que vous êtes un preneur de risques, au lieu de convoluer toutes les lignes contre le domaine et de rechercher le pic, vous pouvez démarrer un sous-ensemble de lignes.

Vous pouvez également préfiltrer les colonnes en supprimant les colonnes dont les sommes sont inférieures à 50, ou tout autre seuil qui est de l'ordre de la moitié du nombre de lignes que vous cherchez à faire correspondre. Au minimum, vous devez supprimer les colonnes de tous les zéros et de tous les 1 comme non informatifs. Idem avec des lignes entièrement vides ou suffisamment vides, ou des lignes si pleines qu'elles ne sont pas pertinentes.

À faire: je devrais mettre un exemple ici en utilisant des données synthétiques et comparer certaines des méthodes.


0

Je viens de tomber sur un document qui est directement pertinent.

Algorithmes randomisés et PNL: utilisation de la fonction de hachage sensible à la localité pour le regroupement de noms à grande vitesse (Ravichandran et al, 2005)

Il est en fait implémenté dans https://github.com/soundcloud/cosine-lsh-join-spark où je l'ai trouvé.

Il est basé sur un hachage sensible à la localité (déjà mentionné dans d'autres réponses). Après avoir réduit les vecteurs de caractéristiques à un espace de faible dimension, il utilise une jointure de distance de Hamming rapide pour trouver les voisins les plus proches.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.