Combinaciones de características binarias (vectores)

La fuente de datos para el sujeto es una matriz binaria m-por-n (solo se permiten 0 y 1). m Las filas representan observaciones, n columnas - características. Algunas observaciones se marcan como objetivos que deben separarse del resto.

Si bien parece un problema típico de NN, SVM, etc., no necesito generalizaciones. Lo que necesito es un algoritmo eficiente para encontrar la mayor cantidad posible de combinaciones de columnas (características) que separen completamente los objetivos de otras observaciones, clasificar, es decir.

Por ejemplo:

    f1 f2 f3
o1   1  1  0
t1   1  0  1
o2   0  1  1

Aquí {f1, f3} es un combo aceptable que separa el objetivo t1 del resto (o1, o2) (por cierto, {f2} NO es porque, por definición de tarea, una característica DEBE estar presente en un objetivo). En otras palabras,

t1(f1) & t1(f3) = 1 and o1(f1) & o1(f3) = 0, o2(f1) & o2(f3) = 0
where '&' represents logical conjunction (AND).

El m es aproximadamente 100,000, n es 1,000. Actualmente, los datos están empaquetados en palabras de 128 bits a lo largo de my la búsqueda está optimizada con sse4 y otras cosas. Sin embargo, lleva demasiado tiempo obtener esas combinaciones de funciones. Después de 2 mil millones de llamadas a la rutina de descenso de árboles, ha cubierto aproximadamente el 15% de los nodos raíz. Y encontré alrededor de 8,000 combos, que es un resultado decente para mi aplicación particular.

Utilizo algunos criterios empíricos para cortar caminos de descenso menos probables, no sin un éxito limitado, pero ¿hay algo radicalmente mejor? Estoy bastante seguro de que tiene que haberlo ... Cualquier ayuda, en cualquier forma, referencia o sugerencia, será apreciada.

preguntado el 01 de febrero de 12 a las 14:02

Solicitud de aclaración: suponga que tiene t1, t2, o1, o2. Usted: a) buscará una vez para separar t1, t2 de o1, o2 b) buscará dos veces, una para separar t1 de o1, o2 y la otra para separar t2 de o1, o2 c) buscará dos veces una para separar t1 de o1, o2, t2 y el otro para separar t2 de o1, o2, t1? -

Ali: actualmente, la búsqueda se realiza de forma recursiva descendiendo un árbol y eliminando las combinaciones ya procesadas, por lo que cada combo se considera solo una vez. -

No entiendo. Suponga que hay tres características f1, f2, f3. Escribiré estas características en binario, por ejemplo, 101 significa f1, no f2, f3. Suponga que t1 = 110 t2 = 101 o1 = 010 o2 = 011. Ahora bien, ¿{f1} es una solución ya que separa t1 y t2 del resto? ¿O necesitamos dos soluciones diferentes, s1 = {f1, f2} para separar t1 y s2 = {f1, f3} para separar t2? -

Ali: veo lo que quieres decir. No quiero contaminar mi pregunta con detalles adicionales, pero supongo que eso lo hizo confuso. la tarea real requiere encontrar cualquier f-combo que separe al menos un cierto número de objetivos del resto. suponga que este número, digamos, mint, es 1. luego, en su ejemplo, f1 es una solución. todavía lo sería si hubiera un t3 = 001 o t2 no estuviera separado. pero si mint = 3, entonces f1 en su ejemplo no sería una solución válida. -

1 Respuestas

Creo que el problema que describe es NP-Hard, por lo que no debe esperar encontrar la solución óptima en un tiempo razonable. No entiendo su algoritmo actual, pero aquí hay algunas sugerencias en la parte superior de mi cabeza:

1) Construya un árbol de decisiones. Etiquete los objetivos como A y los no objetivos como B y deje que el árbol de decisiones aprenda la categorización. En cada nodo, seleccione la característica de modo que una función de P (objetivo | característica) y P (objetivo '| característica') sea máxima. (es decir, tantos objetivos como sea posible caen en el lado positivo y tantos no objetivos como sea posible caen en el lado negativo)

2) Utilice un algoritmo codicioso. Comience desde el conjunto vacío y en cada paso de tiempo agregue la característica que elimina la mayoría de las filas no objetivo.

3) Utilice un algoritmo aleatorio. Comience con un pequeño subconjunto de características positivas de algún objetivo, use el conjunto como semilla para el algoritmo codicioso. Repite muchas veces. Elija la mejor solución. El algoritmo codicioso será rápido, por lo que estará bien.

4) Utilice un algoritmo genético. Genere semillas aleatorias para el algoritmo codicioso como en 3 para generar buenas soluciones y productos cruzados (bit a bit y probablemente) para generar nuevas semillas candidatas. Recuerda la mejor solución. Mantenga buenas soluciones como la población actual. Repita por muchas generaciones.

Necesitará encontrar la respuesta "cuántas de las filas dadas tienen la característica dada f" rápidamente, por lo que probablemente necesitará estructuras de datos especializadas, tal vez usando un BitArray para cada característica.

Respondido 01 Feb 12, 19:02

¿No responderá a su pregunta y hablará sobre el algoritmo de tiempo lineal que encontró? - Ali Ferhat

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.