
1ans en el lugar en Sigir Ecom Challenge 2020
Premio de 2ancias y mejor papel en WSDM Booking.com Challenge 2021
2minte lugar en Twitter Recsys Challenge 2021
3 pasamento⃣rd en la Copa KDD 2021
Cleora es un género de polillas en la familia Geometridae . Su nombre científico se deriva del antiguo geo γῆ o γαῖα "la tierra", y el metro μέτρον "mide" en referencia a la forma en que sus larvas, o "lombrices de pulgadas", parecen " medir la tierra " a medida que avanzan en un bucle en un bucle moda.
Cleora es un modelo de propósito general para un aprendizaje eficiente y escalable de integridades de entidades estables e inductivas para datos relacionales heterogéneos.
Instalación
pip install pycleora
Construir instrucciones
# prepare python env
pip install maturin
# Install pycleora in current env (meant for development)
maturin develop
# Usage example below. More examples in examples/ folder.
Cleora ahora está disponible como Python Package pycleora . Mejoras clave en comparación con la versión anterior:
iterators de Python además de los archivos tsvNumPyCambios de ruptura:
complex::reflexive para incrustaciones de hipergrafías, agrupados por la entidad transitoria, ofrece mejores resultados. from pycleora import SparseMatrix
import numpy as np
import pandas as pd
import random
# Generate example data
customers = [f"Customer_{i}" for i in range(1, 20)]
products = [f"Product_{j}" for j in range(1, 20)]
data = {
"customer": random.choices(customers, k=100),
"product": random.choices(products, k=100),
}
# Create DataFrame
df = pd.DataFrame(data)
# Create hyperedges
customer_products = df.groupby('customer')['product'].apply(list).values
# Convert to Cleora input format
cleora_input = map(lambda x: ' '.join(x), customer_products)
# Create Markov transition matrix for the hypergraph
mat = SparseMatrix.from_iterator(cleora_input, columns='complex::reflexive::product')
# Look at entity ids in the matrix, corresponding to embedding vectors
print(mat.entity_ids)
# ['Product_5', 'Product_3', 'Product_2', 'Product_4', 'Product_1']
# Initialize embedding vectors externally, using text, image, random vectors
# embeddings = ...
# Or use built-in random deterministic initialization
embeddings = mat.initialize_deterministically(1024)
# Perform Markov random walk, then normalize however many times we want
NUM_WALKS = 3 # The optimal number depends on the graph, typically between 3 and 7 yields good results
# lower values tend to capture co-occurrence, higher iterations capture substitutability in a context
for i in range(NUM_WALKS):
# Can propagate with a symmetric matrix as well, but left Markov is a great default
embeddings = mat.left_markov_propagate(embeddings)
# Normalize with L2 norm by default, for the embeddings to reside on a hypersphere. Can use standardization instead.
embeddings /= np.linalg.norm(embeddings, ord=2, axis=-1, keepdims=True)
# We're done, here are our embeddings
for entity, embedding in zip(mat.entity_ids, embeddings):
print(entity, embedding)
# We can now compare our embeddings with dot product (since they are L2 normalized)
print(np.dot(embeddings[0], embeddings[1]))
print(np.dot(embeddings[0], embeddings[2]))
print(np.dot(embeddings[0], embeddings[3]))
P: ¿Qué debo incrustar?
R: Cualquier entidad que interactúe entre sí, co-Oct o se puede decir que están presentes en un contexto dado. Los ejemplos pueden incluir: productos en una cesta de compras, ubicaciones frecuentadas por las mismas personas en momentos similares, empleados que colaboran juntos, las moléculas químicas están presentes en circunstancias específicas, proteínas producidas por las mismas bacterias, interacciones de drogas, coautores de los mismos documentos académicos , Empresas que ocurren juntas en los mismos perfiles de LinkedIn.
P: ¿Cómo debo construir la entrada?
R: Lo que funciona mejor es agrupar entidades concurrentes en un contexto similar, y alimentarlas en líneas separadas en blanco usando el modificador complex::reflexive es una buena idea. Por ejemplo, si tiene datos de productos, puede agrupar los productos comprando canastas o por los usuarios. Si tiene URL, puede agruparlas por sesiones de navegador, de pares (usuario, ventana de tiempo). Mira el ejemplo de uso anterior. Agrupar productos de los clientes es solo una posibilidad.
P: ¿Puedo incrustar a los usuarios y productos simultáneamente, para compararlos con similitud de coseno?
R: No, este es un enfoque metodológicamente incorrecto, derivado de los enfoques de factorización de matriz anticuados. Lo que debe hacer es encontrar buenos incrustaciones de productos primero, luego crear incrustaciones de usuarios de ellos. Alimentar dos columnas, por ejemplo, user product en Cleora dará como resultado un gráfico bipartito. Productos similares estarán cerca uno del otro, los usuarios similares estarán cerca uno del otro, pero los usuarios y los productos no necesariamente serán similares entre sí.
P: ¿Qué dimensionalidad de incrustación usar?
R: Cuanto más, mejor, pero generalmente trabajamos de 1024 a 4096 . La memoria es barata y las máquinas son poderosas, así que no escatima en el tamaño de la incrustación.
P: ¿Cuántas iteraciones de propagación de Markov debo usar?
R: Depende de lo que quieras lograr. Las iteraciones bajas (3) tienden a aproximar la matriz de concurrencia de co-ocurrencia, mientras que las altas iteraciones (7+) tienden a dar una similitud contextual (piense en omisión pero mucho más precisa y más rápida).
P: ¿Cómo incorporo información externa, por ejemplo, metadatos de entidad, imágenes, textos en los incrustaciones?
R: Simplemente inicialice la matriz de incrustación con sus propios vectores provenientes de un Vit, Setence-Transformers, de una proyección aleatoria de sus características numéricas. En ese escenario, los bajos números de iteraciones de Markov (1 a 3) tienden a funcionar mejor.
P: Mis incrustaciones no encajan en la memoria, ¿qué hago?
R: Cleora opera en dimensiones de forma independiente. Inicialice sus incrustaciones con un número menor de dimensiones, ejecute Cleora, persisten en disco y luego repita. Puede concatenar sus vectores de incrustación resultantes después, ¡pero recuerde normalizarlos después!
P: ¿Existe un número mínimo de entidades?
R: No, una entidad A Co-Ocrowing solo 1 vez con otra entidad B obtendrá una incrustación adecuada, es decir, B será la más similar a A Al revés, A estará altamente clasificado entre los vecinos más cercanos de B , que pueden o no ser deseables, dependiendo de su caso de uso. Siéntase libre de podar su opinión a Cleora para eliminar los elementos de baja frecuencia.
P: ¿Hay casos de borde en los que Cleora pueda fallar?
R: Cleora funciona mejor para hipergrafos relativamente escasos. Si todas sus hiperedias contienen una entidad muy común X , por ejemplo, una bolsa de compras , entonces degradará la calidad de los incrustaciones degenerando caminos más cortos en la caminata aleatoria. Es una buena práctica eliminar tales entidades del hipergrafo.
P: ¿Cómo puede Cleora ser tan rápida y precisa al mismo tiempo?
R: No usar muestreo negativo es una gran bendición. Al construir la matriz de transición de Markov (escasa), Cleora realiza explícitamente todas las caminatas aleatorias posibles en un hipergrafo en un gran paso (una sola multiplicación de la matriz). Eso es lo que llamamos una sola iteración . Realizamos más de 3 tales iteraciones. Gracias a una implementación altamente eficiente en Rust, con especial cuidado de la concurrencia, el diseño de la memoria y la coherencia de la caché, es muy rápido. El muestreo negativo o la selección al azar de caminatas aleatorias tienden a introducir mucho ruido: Cleora está libre de esas cargas.
Lea el documento técnico "Cleora: un esquema de incrustación de gráficos simple, fuerte y escalable"
Cleora incorpora entidades en espacios esféricos n-dimensionales que utilizan proyecciones aleatorias iterativas estables extremadamente rápidas, lo que permite un rendimiento y escalabilidad incomparables.
Los tipos de datos que se pueden integrar incluyen, por ejemplo:
! Descargo de responsabilidad: los números a continuación son para Cleora 1.x, la nueva versión es significativamente más rápida, pero tiene que volver a ejecutar los puntos de referencia
Ventajas competitivas clave de Cleora:
Tiempos de incrustación - Ejemplo:
| Algoritmo | Conjunto de datos FB | Conjunto de datos de Roadnet | Conjunto de datos LiveJournal |
| Cleora | 00:00:43 H | 00:21:59 H | 01:31:42 H |
| Pytorch-biggraph | 00: 04.33 H | 00:31:11 H | 07:10:00 H |
Resultados de predicción de enlace - Ejemplo:
| Conjunto de datos FB | Conjunto de datos de Roadnet | Conjunto de datos LiveJournal | ||||
| Algoritmo | MRR | HITRATE@10 | MRR | HITRATE@10 | MRR | HITRATE@10 |
| Cleora | 0.072 | 0.172 | 0.929 | 0.942 | 0.586 | 0.627 |
| Pytorch-biggraph | 0.035 | 0.072 | 0.850 | 0.866 | 0.565 | 0.672 |
Cleora se construye como una herramienta multipropósito "Just Inch It", adecuada para muchos tipos y formatos de datos diferentes.
Cleora ingiere una tabla relacional de filas que representa un hipergrafo heterogéneo escrito y no dirigido, que puede contener múltiples:
Por ejemplo, una tabla relacional que representa las canastas de compras puede tener las siguientes columnas:
user <t> product <t> store
Con el archivo de entrada que contiene valores:
user_id <t> product_id product_id product_id <t> store_id
Cada columna tiene un tipo, que se utiliza para determinar si los espacios de identificadores entre diferentes columnas son compartidos o distintos. Es posible que dos columnas compartan un tipo, que es el caso de los gráficos homogéneos:
user <t> user
Según la especificación del formato de columna, Cleora realiza:
La salida final de Cleora consta de múltiples archivos para cada par (no dirigido) de tipos de entidades en la tabla.
Esos incrustaciones se pueden utilizar de una manera novedosa gracias a su propiedad de independencia tenue, que se describe más adelante.
Las integridades producidas por Cleora son diferentes de las producidas por Node2Vec, Word2Vec, Deepwalk u otros sistemas en esta clase por varias propiedades clave:
Las propiedades técnicas descritas anteriormente implican una buena preparación de producción de Cleora, que desde la perspectiva del usuario final se puede resumir de la siguiente manera:
! Descargo de responsabilidad La documentación a continuación es para Cleora 1.x, para actualizarse para 2.x
Se puede encontrar más información en la documentación completa.
Para más detalles, contáctenos en [email protected]
Cite nuestro documento (y los documentos respectivos de los métodos utilizados) si usa este código en su propio trabajo:
@article{DBLP:journals/corr/abs-2102-02302,
author = {Barbara Rychalska, Piotr Babel, Konrad Goluchowski, Andrzej Michalowski, Jacek Dabrowski},
title = {Cleora: {A} Simple, Strong and Scalable Graph Embedding Scheme},
journal = {CoRR},
year = {2021}
}
Synerise Cleora tiene licencia MIT, como se encuentra en el archivo de licencia.
Las solicitudes de extracción son bienvenidas.