O que você realmente precisa saber sobre métricas de similaridade atômica
A semelhança atômica é um conceito que aparece em praticamente qualquer pipeline de química computacional ou quimioinformática, mas a maioria dos tutoriais trata isso como se fosse simplesmente escolher uma distância de Mordell e pronto. Na prática, a escolha da métrica errada custa horas de refactoring e resultados que parecem plausíveis até você verificar contra dados experimentais. Vou explicar como isso funciona de verdade, incluindo onde os tutoriais erram e o que eu aprendi no campo.
Definição técnica de semelhança atômica
Em termos práticos, semelhança atômica mede o quanto dois átomos ou conjuntos de átomos compartilham características físicas e eletrônicas. O que isso significa na prática é que você codifica propriedades como carga parcial, raio iônico, eletronegatividade, número de coordenadas e, em alguns casos, informações topológicas locais num vetor. Aí aplica-se uma função de distância. As métricas mais comuns são Tanimoto, Dice, Cosine e as distâncias euclidianas ou de Manhattan, dependendo do tipo de fingerprint que você está usando. O problema é que ninguém explica direito por que a métrica Tanimoto é o padrão da indústria para fingerprints binários, enquanto a Similaridade de Cosine se sai melhor com vetores contínuos de descritores. Se você usar Tanimoto em vetores float de propriedades atômicas, vai obter valores inflados artificialmente porque a interseção sobreposta cresce desproporcionalmente quando os vetores são esparsos. Isso já me custou um projeto inteiro de QSAR onde os modelos pareciam bons no treino mas falhavam totalmente na validação externa.
Como eu implemento no dia a dia
Meu fluxo padrão começa com a geração de fingerprints moleculares, não fingerprints atômicos isolados. A razão é que similaridade atômica pura ignora contexto estrutural, o que gera falsos positivos massivos. Eu uso RDKit com ECFP4 para subestruturas circulares de raio 2, calculo matrizes de similaridade Tanimoto entre pares de compostos, e só depois faço o filtro ou clustering dependendo do objetivo. Para cálculos de similaridade entre conjuntos grandes, eu não faço a matriz completa. Se você tem 10 mil compostos, a matriz Tanimoto completa exige cerca de 50 milhões de comparações. Eu uso o algoritmo de minhash LSH (Locality Sensitive Hashing) do datasketch, que reduz isso para uns 15 minutos em vez de horas, com uma margem de erro aceitável de aproximadamente 5% nos valores de similaridade. Se você precisa de precisão exata para menos de 500 compostos, a matriz direta ainda é viável.
O código básico que eu uso é simples: from rdkit import Chem
from rdkit.Chem import SimilarityFingerprints
import numpy as np
mol_a = Chem.MolFromSmiles("CCO")
mol_b = Chem.MolFromSmiles("CCCO")
fp_a = Chem.RDKFingerprint(mol_a)
fp_b = Chem.RDKFingerprint(mol_b)
sim = DataStructs.TanimotoSimilarity(fp_a, fp_b)
Isso retorna 0.5 para etanol e propanol, o que é razoável mas não captura a diferença funcional real entre eles. Por isso eu costumo complementar com MACCS keys, que dão mais peso a grupos funcionais específicos. A combinação de ECFP4 + MACCS com média ponderada 70/30 funciona melhor na minha experiência do que qualquer métrica isolada.
👉 Clique no botão abaixo para saber mais sobre o assunto!
O caso que me ensinou a desconfiar dos resultados padrão
Eu estava trabalhando em um screening virtual de inibidores de quinase e a similaridade Tanimoto padrão classificou vários compostos como similares ao reference compound com scores acima de 0.85. Quando testamos no bioensaio, apenas 2 de 15 mostravam atividade significativa. O problema era isosterismo mal identificado: compostos com aril substituídos por tiopenos tinham fingerprints quase idênticos mas propriedades eletrônicas completamente diferentes. A solução foi adicionar um descritor de carga parcial derivado de cálculos semiempíricos PM6 antes de calcular a similaridade. O overhead foi de cerca de 3 segundos por molécula no pipeline, mas a taxa de acerto no screening subiu de 13% para 67%. Não é um custo alto quando você considera que cada falso positivo em triagem representa uns 20 minutos de trabalho laboratorial.
Parmetros e thresholds que realmente funcionam
A literatura sugere 0.7 como threshold de "similar" e 0.3 como "dissimilar", mas esses números são arbitrários demais para a maioria dos casos reais. Em screenings de ligantes, thresholds acima de 0.85 geralmente capturam apenas scaffolds idênticos ou quase idênticos, o que é inútil se você busca diversidade química. Thresholds abaixo de 0.3 geram ruido de fundo insustentável. O que eu recomendo é calibrar o threshold com base no conjunto de dados de treino. Se você tem milhares de compostos conhecidos com atividade, plot a distribuição de similaridades entre ativos e inativos e escolha o threshold que maximiza o índice de Youden (sensibilidade + especificidade - 1). Em meu último projeto, isso resultou num threshold de 0.62 para quinases e 0.55 para GPCRs, bem diferente do 0.7 genérico.
Limitações que ninguém menciona
A semelhança atômica baseada em fingerprints tem um ponto cego importante: ela não leva em conta conformações. Dois moléculas podem ter fingerprints idênticos mas atividades completamente diferentes porque ocupam espaços tridimensionais distintos. Isso é particularmente problemático com moléculas flexíveis onde o bioisótero ativo é uma conformação minoritária. Outro problema é a dependência do método de geração de fingerprint. Diferentes parametrizações do ECFP (raio 1 versus raio 2, tamanho de vetor 1024 versus 2048) produzem resultados não comparáveis entre si. Se você comparar similaridades calculadas com configurações diferentes, os valores são matematicamente inválidos. Eu já vi isso acontecendo em revisões sistemáticas onde autores usavam parâmetros distintos sem perceber.
Para casos onde a similaridade 2D falha, eu recomendo complementar com descrição propriedes farmacocinéticas (LogP, PSA, número de doadores/aceptores de H) usando Similaridade de Gini ou distância euclidiana normalizada. Essa abordagem híbrida cobre o gap entre similaridade estrutural e similaridade funcional.
Alternativas quando a similaridade atômica convencional não basta
Se o seu problema envolve séries de conformadores ou moléculas com mesma conectividade mas geometrias diferentes, a similaridade atômica 2D simplesmente não resolve. Nesse caso,eu uso score de docking como proxy de similaridade funcional, ou descritores 3D como Pharmacophore Fingerprints do MOE. O custo computacional sobe consideravelmente, mas a relevância biológica também. Para quem trabalha com dados muito grandes (milhões de compostos), a abordagem de embedding via redes neurais como Graph Neural Networks está substituindo fingerprints tradicionais em muitos casos. Modelos como MolCLR ou ChemBERTa geram vetores densos que capturam similaridade semântica muito além da similaridade estrutural pura. A desvantagem é que você precisa de GPU e o modelo precisa ser fine-tuned para o domínio específico, o que não é trivial.
Checklist prático antes de rodar sua análise de similaridade
Verifique se os smiles estão_canonizados corretamente antes de gerar fingerprints, pois SMILES canônicos e não-canônicos da mesma molécula produzem fingerprints idênticos mas a padronização evita erros de entrada. Remova sais e solventes com Chem.MolFromSmiles removendo padrões, senão a similaridade vai ser dominada por fragmentos irrelevantes. Normalize cargas e tautomeros quando apropriado, especialmente para screening de bibliotecas comerciais onde a forma predominante pode não ser a forma biologicamente ativa. E sempre valide seu threshold com dados conhecidos antes de aplicar ao novo conjunto. Se você está começando agora, o RDKit sozinho cobre 90% das necessidades. A parte difícil não é implementar a métrica, é decidir qual métrica se aplica ao seu problema específico e justificar a escolha criteriosamente. Isso faz diferença nos resultados finais.