Receita real para resolver o problema apresentado (uma solução possível)
É simples resolver esse problema usando minha ferramenta favorita de aprendizado de máquina, o vowpal wabbit, que suporta recursos quadráticos (cruzados) por meio da opção -q .
fundo de wabbit vowpal
Antes de entrarmos nos detalhes de uso. O vowpal wabbit é um software de aprendizado de máquina on-line rápido e escalável para classificação e regressão. Recebo taxas de aprendizado (treinamento) de cerca de 5 milhões de recursos por segundo na minha área de trabalho, sem limite de tamanho de dados (número de exemplos), pois como ferramenta de aprendizado on-line, não é necessário carregar os dados completos na memória. Ele tem muitos outros recursos atraentes: suporte a diferentes algoritmos de aprendizado, múltiplas funções de perda, recursos esparsos, tipos de recursos mistos e muito mais, que estão além do escopo desta pergunta.
Aqui estão as 3 etapas para resolver o problema com comentários:
Etapa 0: Faça o download e crie o vowpal wabbit no github (veja a nota na parte inferior dos ambientes suportados)
Etapa 1: prepare um conjunto de treinamento em que cada linha se pareça com isto:
1.0 protein1/protein2|A p1_feature1 p1_feature2 ... |B p2_feature1 ...
...
explicação do formato do conjunto de treinamento:
O número mais à esquerda, 1.0 , é o rótulo (força da interação, que pode ser qualquer valor numérico), a segunda sequência ' protein1 / protein2 ' é uma tag para dar identidade à linha, IOW: "essa linha representa a interação entre a proteína1 e protein2 "; É opcional e você pode pensar nisso como um comentário. Essa string de tag também é ecoada nas previsões de modelos para identificar qual previsão pertence a qual exemplo, mas não estamos prevendo aqui, estamos apenas modelando e estudando nosso modelo. Em seguida, vem o espaço de nome do recurso de entrada para protein1 |A(precisamos definir um espaço de nome para que possamos cruzar entre diferentes espaços de nome, ele não precisa serA, pode ser qualquer palavra de fato, mas a primeira letra deve diferir entre os espaços de nome para que possamos cruzá-los na chamada de comando) seguida pela lista de recursos de entrada para protein1 p1_.... Por último, vem o espaço de nomes para protein2: |Bseguido pelos nomes dos recursos de protein2 p2_....
Uma das belezas do vowpal wabbit é que você pode usar seqüências arbitrárias para nomes de recursos (ele os mistura internamente, mas você não se importa). Os únicos caracteres especiais no conjunto de treinamento são:
- espaços (obviamente)
|, para prefixar recursos de entrada e espaços de nome e
: separar nomes de recursos de seus valores
O :não é usado aqui, porque assumimos que todo nome de recurso de proteína representa um booleano (existência), portanto seus valores são padronizados 1e eles não precisam de valores explícitos.
Agora você pode executar vowpal_wabbit (o nome do executável é vw) com -q ABpara criar automaticamente recursos cruzados (termos de interação) entre todos os pares possíveis de recursos em que um recurso é selecionado a partir de protein1 ( namespace começando com A) e outro a partir de protein2 ( espaço de nome começando com B). O vowpal_wabbit lerá os dados, aprenderá e criará um modelo com pesos para cada combinação de recursos que resulta em alguma interação entre o par de proteínas. Aqui, em vez de executar vwdiretamente, executamos o vw-varinfoutilitário wrapper, que vem com o vowpal wabbit, como nosso último passo. vw-varinfoé executado vwpara criar o modelo e despeja o modelo na forma legível por humanos.
Etapa 3: chame vw-varinfo assim:
vw-varinfo -q AB -c --passes 20 your_data_set_file
vw-varinfo passará todas as opções ( -q ... -c --passes ...) como estão vw. Somente o -q ABcruzamento dos dois espaços de nome dos recursos é essencial. Eu adicionei mais uma opção acima (execute várias passagens), que acredito que daria melhores resultados.
Este comando chamará vowpal wabbit ( vw) para treinar no conjunto de dados e imprimirá a saída que acredito estar procurando: todas as interações de recursos em ordem de força e seus pesos relativos.
Exemplo de entrada e saída
Suponha que sua entrada prot.datinclua uma interação de três vias entre três proteínas:
1.0 protein1/protein2|A a b |B k m
0.6 protein2/protein3|A k m |B b c d
2.2 protein1/protein3|A a b |B b c d
Este é deliberadamente um exemplo muito minimalista. vwnão deveria ter nenhum problema com conjuntos de dados muito maiores (por exemplo, milhões de linhas, centenas de recursos); também variei os rótulos de força da interação nos exemplos. Se, no seu caso, a interação for um "sim" ou "não" booleano, basta usar 0(sem interação) ou 1(existe interação) como o primeiro campo em cada linha.
Corrida:
vw-varinfo -q AB -c --passes 20 prot.dat
Produziria todas as interações possíveis (ignore os espaços de nomes Ae Bna saída) e seus pesos:
FeatureName HashVal MinVal MaxVal Weight RelScore
A^k 220268 0.00 1.00 +0.3804 100.00%
A^k^B^k 254241 0.00 0.00 +0.3804 100.00%
A^k^B^m 93047 0.00 0.00 +0.3804 100.00%
B^k 178789 0.00 1.00 +0.1011 26.58%
B^m 17595 0.00 1.00 +0.1011 26.58%
[... trimmed for brevity ...]
A^m^B^m 141879 0.00 0.00 +0.0000 0.00%
Constant 116060 0.00 0.00 +0.1515 0.00%
A^b 139167 0.00 1.00 -0.0641 -16.86%
A^b^B^k 204424 0.00 0.00 -0.1233 -32.43%
A^b^B^m 43230 0.00 0.00 -0.1233 -32.43%
Mostrando que nesses dados os contribuintes mais fortes para qualquer interação em geral são 1) a mera presença do krecurso, 2) o krecurso interagindo consigo mesmo (supondo que ambas as proteínas o tenham) e 3) kinteragindo m. enquanto os mais fracos (contribuição negativa para a interação de proteínas) são o brecurso emparelhado com o mrecurso.
Aqui está uma página HOWTO em vw-varinfo
O vowpal wabbit constrói a partir da fonte (veja o link acima) e roda no Linux (e possivelmente outros unixes), Mac OS-X e Windows.
HTH