Filtrar un conjunto de datos para obtener una distribución más uniforme para el entrenamiento de redes neuronales

8

Estoy investigando el uso de redes neuronales artificiales (ANN) para predecir las velocidades de reacción en mi fluido en lugar de resolver el sistema completo de EDO rígidas. Algunas personas de mi laboratorio ya han trabajado en eso, así que no empiezo desde cero, pero tengo problemas con mis aplicaciones. Creo que uno de ellos se relaciona con la calidad de mi conjunto de datos para la capacitación. Por lo general, extraemos datos de entrenamiento de simulaciones CFD que son 1D / 2D / 3D. No importa qué, terminamos con una matriz multidimensional de datos para alimentar a la red neuronal. Para darle una idea del tamaño del problema, estoy buscando entrenar 8 redes con 10 entradas y 1 salida para cada una. Siento que un conjunto de entrenamiento de aproximadamente 100,000 puntos sería razonable, pero el problema es que estos 100,000 puntos necesitan cubrir una región específica de mi espacio multidimensional.

  • Para cada instantánea, solo una pequeña porción de los puntos se encuentra en la región donde necesito una muestra alta para asegurarme de que mi entrenamiento sea preciso
  • A medida que recopilo instantáneas juntas, termino con muchos puntos casi duplicados que (creo) tienen un efecto negativo en mi entrenamiento ANN al a) sesgar el entrenamiento al poner más peso en estas regiones b) agregar puntos innecesarios.

Así que he estado tratando de filtrar los puntos que grabo antes de incluirlos en mi conjunto de entrenamiento. A mi modo de ver, eso implica verificar si un nuevo punto está dentro de un cierto radio n-dimensional de cada punto de mi conjunto de datos. Este enfoque de fuerza bruta, que salvo algunas escalas de trucos como n ^ 2, funciona de manera regular para extraer 10,000 puntos de 100,000 (toma 30 minutos, por ejemplo) pero se descompone a medida que aumento los tamaños y números de las instantáneas ... Claramente , debe haber una forma más inteligente de hacerlo, pero no estoy seguro de en qué dirección comenzar a buscar. Primero probé con python y pude pasar a FORTRAN para acelerar las cosas, pero siento que primero debería buscar una mejor estrategia. ¿Es mi única esperanza algún tipo de árbol kd? Tengo poca o ninguna experiencia con ellos y el problema que veo es que mi árbol crecerá a medida que construya mi conjunto de datos y esto solo puede aumentar la complejidad. ¿Una biblioteca de árbol de python kd satisfaría mis necesidades? ¿Debería mudarme a FORTRAN dado el tamaño de mi problema? Cualquier consejo es apreciado, gracias!

FrenchKheldar
fuente

Respuestas:

5

rcrcO(n)rcd3d1rc

rcO(n)O(1)O(1)rc

Todo el procedimiento se describe aquí . Si desea más detalles, intente buscar en Google "lista de celdas vinculadas" o "lista de celdas".

O(log2n)n

Pedro
fuente
Gracias, voy a investigar esto, aunque me temo que mi alta dimensionalidad podría ser un obstáculo. Considerando d = 10, y alrededor de 100 pts por "lado" (y no estoy seguro de que este no sea un número demasiado bajo), esa es una cuadrícula con 10 ^ 20 celdas ¿no? Incluso con 10 puntos por "lado", eso sigue siendo 10 ^ 10 celdas y tengo 59000 vecinos para cada celda :) Pero miraré sus enlaces. Gracias !
FrenchKheldar
En realidad, el número de celdas depende de su densidad de puntos en relación con la distancia de corte. ¡Nunca debes terminar con más celdas que puntos! El número de vecinos es un problema en grandes dimensiones, pero luego me mudaría a árboles kd.
Pedro
Me refería a 59000 células vecinas, lo siento. He encontrado un algoritmo de búsqueda de vecino más cercano kdtree bien documentado cs.umd.edu/~mount/ANN Le daré una oportunidad.
FrenchKheldar
3

El problema que ha indicado es un problema clásico en Geometría computacional: consultas de rango. Es decir:

Entrada: un subconjunto S del espacio euclidiano n-dimensional y un conjunto de puntos en ese espacio P.
Salida: el subconjunto de P que interseca S.

O(n11/d+r)O(n)O(n11d+r)O(n)

El algoritmo implica una estrategia de división y conquista (recursión) y una estructura de datos especial (árbol-kd). Aquí hay un resumen del algoritmo:

Begin MainProgram

    results = a new SET   (a kd-tree)
    search(space,root,results)
    return results
endMainProgram

Subroutine search(space,node,results)
    if (space contains node.region) then
        add node.point to the results
        for each descendant of node
            add d.point to results
        return
    if (space contains node.point) then 
        add node.point to results
    if (space extends below node.coordinate) then
        search(space,node.below,results)
    if (space extends above node.coordinate) then
        search(space,node.above,results)
endsubroutine

-Fuente: Algoritmos en una cáscara de nuez, pág. 298

La clave del caso rectangular es que podemos definir fácilmente la estructura de datos de manera que podamos incluir un subconjunto completo de una vez ... de ahí el árbol KD. El árbol KD simplemente divide su espacio n-dimensional cortándolo sucesivamente por hiperplanos, de la misma manera que un espacio 3D puede dividirse en planos.

Para su problema particular que involucra consultas de rango en la dirección radial (no en cajas rectangulares), es posible que pueda encontrar una división de espacio recursivo basada en n-esfera similar ... Hay una estructura de datos similar llamada vp-tree que está diseñada para la implementación de particiones espaciales en coordenadas hiperesféricas. Es posible que desee ver

"> esta publicación para más detalles sobre la teoría de vp-trees.

Por supuesto, la codificación puede ser una molestia si su objetivo es realmente utilizar el algoritmo como una herramienta para conducir la ciencia. En cuyo caso, sugeriría buscar bibliotecas que ya implementen estas estructuras de datos que puede usar. Una biblioteca de geometría computacional sería muy útil en esta situación. La biblioteca CGAL tiene subrutinas para búsquedas de rango d-dimensional que pueden ser de su interés. Aquí hay otra lista de bibliotecas con subrutinas de consulta de rango.

Alternativamente, si está de acuerdo con obtener la mayoría de los puntos en el rango esférico que está buscando (pero no exactamente todos), puede considerar usar un algoritmo de aproximación como el de este documento .

Paul
fuente
@gansub: arreglado!
Paul