A figura abaixo mostra 7 pontos em torno da origem. Um deles foi selecionado por um humano com base em regras e experiência e é colorido de vermelho (aquele no quadrante inferior esquerdo).
Agora, temos mais de 1000 desses conjuntos de pontos e, para cada conjunto, um humano selecionou um único ponto. Essas condições se aplicam a todos os conjuntos:
- Cada conjunto tem cerca de 3 a 10 pontos
- Não há outliers
- Os pontos podem ter valores positivos e negativos
- Nenhum erro foi cometido ao selecionar um ponto
Minha pergunta é: Existe um algoritmo de aprendizado de máquina para aprender com esses conjuntos e seleções feitas por seres humanos, para que ele possa decidir automaticamente qual ponto selecionar quando um novo conjunto de pontos for fornecido? Este novo conjunto satisfaz as 3 primeiras condições de cima, é claro.
2 considerações finais:
- O exemplo que dei é apenas um exemplo construído aleatoriamente para apoiar a ideia de pontos em um plano em torno da origem, juntamente com um selecionado. Na vida real, pode haver mais estrutura, mas por enquanto estou curioso e gostaria de saber o que é possível para este caso.
- Seriam possíveis variações? Digamos que sejam cerca de 2 pontos selecionados ou você tenha círculos com um raio especificado em vez de pontos.
machine-learning
Elmex80s
fonte
fonte
Respostas:
Este é um problema fascinante! Duas coisas tornam isso especialmente desafiador:
age
eheight
(em centímetros). Cada amostra tem uma entrada para cada uma e,(age, height) = (22, 180)
é claro, não é a mesma coisa que(age, height) = (180, 22)
. Nem é verdade no seu problema. Um conjunto de pontos tem entre 3 e 10 pontos, e a ordem em que inserimos os pontos não deve fazer diferença ao comparar dois conjuntos de pontos.Deixe-me descrever um algoritmo que lida com os dois desafios. A precisão da previsão não é muito boa; mas talvez você veja uma maneira de melhorar isso. E pelo menos prevê algo , certo?
1. Simulando amostras
Para poder testar o algoritmo, escrevi funções que geram amostras e rótulos.
Gerando amostras: Cada amostra contém entre 3 e 10 pontos. O número de pontos é aleatório, obtido de uma distribuição uniforme. Cada ponto é da forma
(x_coordinate, y_coordinate)
. As coordenadas são novamente aleatórias, extraídas de uma distribuição normal.Gerando rótulos: Como exemplo de brinquedo, vamos assumir que a regra para escolher um ponto é: sempre escolha o ponto mais próximo
(0, 0)
, onde 'mais próximo' deve ser entendido em termos da norma euclidiana.Agora podemos criar nossos conjuntos de trem e teste:
2. Comparação de conjuntos de pontos via distância de Hausdorff
Vamos abordar o primeiro problema: como devemos comparar diferentes conjuntos de pontos? O número de pontos nos conjuntos de pontos é diferente. Lembre-se também de que a ordem na qual anotamos os pontos não deve importar: a comparação com o conjunto de pontos
[(0,0), (1,1), (2,2)]
deve produzir o mesmo resultado que a comparação com o conjunto de pontos[(2,2), (0,0), (1,1)]
. Minha abordagem é comparar conjuntos de pontos pela distância de Hausdorff :3. Previsão através de k-vizinhos mais próximos e média
Agora temos uma noção de distância entre conjuntos de pontos. Isso torna possível usar a classificação de vizinhos k-mais próximos: dado um conjunto de pontos de teste, encontramos
k
na nossa amostra de treinamento os conjuntos de pontos que têm a menor distância de Hausdorff em relação ao conjunto de pontos de teste e obtemos seus rótulos. Agora vem o segundo problema: como transformamos essesk
rótulos em uma previsão para o conjunto de pontos de teste? Adotei a abordagem mais simples: calcule a média dos rótulos e preveja o ponto no conjunto de pontos de teste mais próximo da média.4. Teste
Está tudo pronto para testar o desempenho do nosso algoritmo.
Para a função de decisão fornecida e
num_neighbors = 70
, obtemos uma precisão de previsão de 84%. Isso não é muito bom e, é claro, é específico da nossa função de decisão, que parece bastante fácil de prever.Para ver isso, defina uma função de decisão diferente:
O uso desta função via
dec_fun = decision_function_maxaverage
reduz a precisão da previsão para 45%. Isso mostra o quão importante é pensar nas regras de decisão que geram seus rótulos. Se você tem uma idéia de por que as pessoas escolhem determinados pontos, isso o ajudará a encontrar o melhor algoritmo.Algumas maneiras de melhorar esse algoritmo: (1) Use uma função de distância diferente em vez da distância de Hausdorff, (2) use algo mais sofisticado do que os vizinhos mais próximos, (3) melhore como as etiquetas de treinamento selecionadas são transformadas em previsão.
fonte
Aqui estão algumas maneiras pelas quais você pode usar redes neurais para resolver esse problema:
Com uma rede neural simples de feedforward:
Com uma rede neural convolucional:
A CNN pode ter um desempenho melhor, já que seus dados são inerentemente espaciais. No entanto, você deve decidir o que fazer se dois ou mais pontos se sobreporem. A solução mais simples é escolher uma aleatoriamente, o que pode ser bom dependendo da sua tarefa específica.
Com uma rede neural recorrente:
Sim, é tão fácil quanto isso com as RNNs! Eles lidam bem com entradas de comprimento variável, mas ainda não possuem as vantagens das CNNs para lidar com dados espaciais.
Ressalvas:
Se estiver usando um FNN ou um RNN, também há a questão de como você solicita seus dados de entrada. Se não houver ordem inerente nos seus dados reais, não queremos que nossa rede faça previsões diferentes para os mesmos dados codificados em ordens diferentes. Uma maneira de lidar com isso é com o aumento de dados : duplique cada exemplo de treinamento algumas vezes com diferentes pedidos de entrada, para que sua rede possa aprender as simetrias apropriadas.
Se você tiver apenas tempo para tentar uma abordagem, eu escolheria a CNN. As CNNs são projetadas para funcionar bem com dados espaciais e não há problema com os pedidos de entrada.
fonte
(0,0), (1,1), (2,2)
terá um efeito diferente de alimentar um conjunto de pontos(1,1), (2,2), (0,0)
.