Preciso comparar duas curvas f (x) eg (x). Eles estão no mesmo intervalo de x (digamos -30 a 30). f (x) pode ter alguns picos agudos ou picos e vales suaves. g (x) pode ter os mesmos picos e vales. Nesse caso, quero uma medida de quão bem esses recursos coincidem sem inspeção visual. Eu tentei resolver esse problema da seguinte maneira.
- Normalize as duas funções dividindo cada ponto de dados pela área total da função. Agora a área da função normalizada é 1.0
- Em cada x, obtenha o valor mínimo de f (x) eg (x). Isso me dará uma nova função que é basicamente a área sobreposta entre f (x) eg (x).
- Quando integro a função resultante da etapa 2, obtenho a área sobreposta total de 1,0
No entanto, isso não me diz se os picos e vales coincidem ou não. Não tenho certeza se isso pode ser feito, mas se alguém souber um método, agradeceria sua ajuda.
== EDIT == Para esclarecimentos, incluí uma imagem.
A diferença entre as duas curvas (preto e azul) pode não ser a mesma, mas terá formas complementares.
Antecedentes: As funções são a densidade projetada de estados (PDOS) dos orbitais atômicos de um composto. Então, eu tenho estados para orbitais s, p, d. Quero determinar se o material possui hibridizações sp, pd ou dd (mistura orbital). Os únicos dados que tenho são os PDOS. Se, por exemplo, o PDOS do orbital s (função f (x)) tem picos e vales com as mesmas energias (valores x) do PDOS do orbital p (função g (x)), então existe sp misturando nesse material.
Respostas:
Esse é um problema comum e frequentemente difícil em química analítica, física, espectroscopia, etc. As abordagens usadas podem variar de comparação simples de RMSD a métodos muito sofisticados. Se a tarefa não for fácil de realizar por inspeção visual (os seres humanos são primorosamente desenvolvidos para o reconhecimento de recursos), provavelmente será difícil executar computacionalmente.
Uma abordagem é tentar remover as "linhas de base" para que as funções tenham valor zero, exceto onde houver recursos de pico ou vale. É melhor fazer isso com o ajuste de curvas usando um polinômio de baixa ordem ou, melhor ainda, um modelo de princípios mais apropriado de como a linha de base pode e deve parecer. Se os picos forem muito nítidos, você pode simplesmente suavizar a função e subtrair a função suavizada da função original.
Após remover a linha de base, você pode normalizar e gerar resíduos ou fazer RMSD (abordagens simples) ou tentar detectar recursos de pico / vale ajustando um gaussiano (ou qualquer modelo apropriado) para cada característica que você procura. Se você conseguir ajustar os picos, poderá comparar os locais dos picos e as meias larguras.
Dê uma olhada no SciPy se você conhece Python. Boa sorte.
fonte
Isso está "fora do topo da minha cabeça", então eu posso estar entendendo completamente o problema, mas talvez você possa aplicar uma distância quadrática média quadrática (RMSD) às funções. Se você está interessado apenas nos picos e vales, aplique-o nas áreas ao redor desses picos e vales (ou seja, para alguns x +/- algum epsilon em que a derivada de qualquer função é zero). Se o RMSD desse intervalo estiver próximo de zero, acho que você tem uma boa correspondência.
fonte
Pelo que entendi, as informações que você procura são transmitidas pelo "quadro de variações" da função - lamento muito não saber o nome em inglês para isso!
Esta tabela está associada a uma função diferenciável f e você a constrói encontrando as raízes de f ' e determina o sinal de f' em cada intervalo entre esses zeros.
Portanto, se os zeros de f ' e g' coincidirem mais ou menos e os sinais dessas funções concordarem, eles terão um perfil semelhante.
A primeira coisa que eu tentaria programar seria:
Desenhe aleatoriamente um grande número N de pontos x [i] no intervalo em que as funções são definidas.
Para cada nó, calcule as diferenças F [i] = f (x [i] + ε) - f (x [i] - ε) e G [i] = g (x [i] + ε) - g (x [i] - ε) .
Se em cada nó, F [i] e G [i] forem menores que ε² OU tiverem o mesmo sinal, conclua que as duas funções têm quase o mesmo perfil.
Funciona?
fonte
Força bruta: encontre o menor valor de flutuação diferente de zero com esse valor como etapa, passe por todo o domínio e verifique se os valores são iguais?
== EDIT ==
Hmmm ... Se por "a mesma forma" você quer dizer g (x) = c * f (x), esta solução deve ser modificada - para cada elemento do domínio você calcula f (x) / g (x) e verifica se O resultado é o mesmo para cada ponto (é claro, se g (x) == 0, então você verifica se f (x) == 0, você não está tentando dividir).
Se "a mesma forma" significa "ótimos locais e pontos de flexão são os mesmos" ... Bem, encontre ótimos locais e pontos de flexão para f (x) eg (x) (como conjuntos de elementos de domínio) e verifique, se esses conjuntos são iguais.
Terceira opção: f (x) = g (x) + c. Basta verificar se cada elemento do domínio tem a mesma diferença f (x) -g (x). É quase idêntico ao primeiro caso, mas em vez de divisão você tem diferença.
== AINDA OUTRA EDIÇÃO ==
Bem ... A segunda abordagem da edição acima pode ser útil. Além disso, você pode mesclá-lo com a comparação do sinal do primeiro dervativo (não simbólico, mas calculado como df (x) = f (x) - f (etapa x)). Se ambas as funções tiverem o mesmo sinal de derivada em todo o domínio, verifique as opções e os pontos de flexão, apenas para ter certeza. Eu diria que essas condições devem ser suficientes para fazer o que você precisa.
fonte
Provavelmente, a maneira mais direta é calcular o coeficiente de correlação de Pearson . Ou seja, use seu f (x) como X e g (x) como Y. Efetivamente "plote g (x) como função de f (x) e veja como ele forma uma linha reta".
O coeficiente de correlação é popular porque é fácil de calcular e geralmente é justificado apenas com um aceno de mãos. Pode ser uma boa aproximação inicial para alguns usos, mas definitivamente não é uma panacéia.
Para obter melhores resultados em aplicativos do mundo real, você precisa entender o que está acontecendo nos dados, ou seja, o processo que gera os dados. Freqüentemente, há algum tipo de plano de fundo , e os recursos interessantes ficam em cima desse plano de fundo. Se você jogar todos os dados em uma caixa preta, poderá acabar comparando principalmente os fundos: a caixa preta não sabe qual parte dos dados é a parte interessante. Portanto, para obter melhores resultados, geralmente é uma boa idéia remover os fundos de alguma forma e comparar o que resta. Ajustar linhas ou curvas ou médias e subtrair ou dividir por elas, filtragem baixa, banda ou passa alta, alimentando os dados através de alguma função não-linear ... você escolhe.
Definitivamente, não existe uma resposta certa. Você obterá tantos resultados diferentes quanto tentar métodos. Mas, alguns dos resultados são melhores do que alguns ofters. O raciocínio teórico pode ajudar a começar na direção certa, mas como definir parâmetros e ajustar seu método, pode ser encontrado apenas experimentando-os e comparando os resultados do mundo real.
fonte