Estou pensando em usar redes neurais artificiais (RNA) para prever as taxas de reação no meu fluido, em vez de resolver o sistema completo de ODEs rígidas. Algumas pessoas do meu laboratório já fizeram algum trabalho para não começar do zero, mas estou tendo problemas com meus aplicativos. Acho que um deles diz respeito à qualidade do meu conjunto de dados para treinamento. Geralmente, extraímos dados de treinamento de simulações de CFD que são 1D / 2D / 3D. Não importa o que aconteça, acabamos com uma matriz multidimensional de dados para alimentar a rede neural. Para ter uma idéia do tamanho do problema, estou estudando o treinamento de 8 redes com 10 entradas e uma saída para cada uma. Sinto que um conjunto de treinamento de cerca de 100.000 pontos seria razoável, mas o problema é que esses 100.000 pontos precisam cobrir uma região específica do meu espaço multidimensional.
- Para cada instantâneo, apenas uma pequena parte dos pontos fica na região em que preciso de uma amostragem alta para garantir que meu treinamento seja preciso
- Ao compilar os instantâneos, acabo com muitos pontos quase duplicados que (acredito) têm um efeito negativo no meu treinamento da ANN: a) influenciando o treinamento colocando mais peso nessas regiões; b) adicionando pontos desnecessários.
Então, eu tentei filtrar os pontos que gravei antes de incluí-los no meu conjunto de treinamento. A meu ver, isso envolve verificar se um novo ponto está dentro de um determinado raio n-dimensional de cada ponto do meu conjunto de dados. Essa abordagem de força bruta, com exceção de alguns truques, como n ^ 2, funciona mais ou menos para extrair 10.000 pontos de 100.000 (leva 30 minutos, digamos), mas se decompõe à medida que eu aumento os tamanhos e números dos instantâneos ... Claramente , deve haver uma maneira mais inteligente de fazer isso, mas não sei em que direção começar a procurar. Tentei pela primeira vez com python e poderia mudar para o FORTRAN para acelerar as coisas, mas acho que devo procurar uma estratégia melhor primeiro. Minha única esperança é algum tipo de árvore kd? Tenho pouca ou nenhuma experiência com eles e o problema que vejo é que minha árvore crescerá à medida que construo meu conjunto de dados e isso só pode aumentar a complexidade. Uma biblioteca em árvore python kd se adequa à minha necessidade? Devo mudar para FORTRAN, considerando o tamanho do meu problema? Qualquer conselho é apreciado, obrigado!
fonte
O problema que você declarou é um problema clássico em Geometria computacional: consultas de intervalo. Isso é:
Entrada: um subconjunto S do espaço euclidiano n-dimensional e um conjunto de pontos nesse espaço P.
Saída: o subconjunto de P que cruza S.
O algoritmo envolve uma estratégia de dividir e conquistar (recursão) e uma estrutura de dados especial (kd-tree). Aqui está um esboço do algoritmo:
-source: Algoritmos em poucas palavras, página 298
A chave para o caso retangular é que podemos definir facilmente a estrutura de dados para incluir um subconjunto inteiro de uma só vez ... daí a árvore KD. A árvore KD simplesmente divide seu espaço n-dimensional cortando-o sucessivamente por hiperplanos, da mesma forma que um espaço 3D pode ser dividido por planos.
Para o seu problema específico que envolve consultas de alcance na direção radial (não caixas retangulares), você pode encontrar uma divisão recursiva de espaço semelhante baseada na esfera n ... Há uma estrutura de dados semelhante chamada de árvore vp, projetada para implementação de particionamento de espaço em coordenadas hiperesféricas. Você pode querer ver
"> nesta publicação para obter mais detalhes sobre a teoria das árvores vp.
Obviamente, a codificação pode ser um aborrecimento se seu objetivo é realmente usar o algoritmo como uma ferramenta para conduzir a ciência. Nesse caso, sugiro procurar em bibliotecas que já implementam essas estruturas de dados que você pode usar. Uma biblioteca de geometria computacional seria muito útil nessa situação. A biblioteca CGAL possui sub-rotinas para pesquisas no intervalo d-dimensional que podem ser do seu interesse. Aqui está outra lista de bibliotecas com sub-rotinas de consulta de intervalo.
Como alternativa, se você concorda em obter a maioria dos pontos no intervalo esférico que está pesquisando (mas não exatamente todos), convém considerar o uso de um algoritmo de aproximação como o deste artigo .
fonte