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!
fuente
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.
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:
-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 .
fuente