

As traduções são geradas por tradução automática. Em caso de conflito entre o conteúdo da tradução e da versão original em inglês, a versão em inglês prevalecerá.

# Como funciona o algoritmo k-NN
<a name="kNN_how-it-works"></a>

O algoritmo de k-Nearest Neighbors (k-NN) da Amazon SageMaker AI segue um processo de treinamento de várias etapas que inclui a amostragem dos dados de entrada, a redução da dimensão e a criação de um índice. Os dados indexados são em seguida usados durante a inferência para encontrar com eficiência os k-nearest neighbors de um determinado ponto de dados e fazer predições com base nos rótulos ou valores vizinhos.

## Etapa 1: Amostra
<a name="step1-k-NN-sampling"></a>

Para especificar o número total de pontos de dados dos quais obter uma amostra com base no conjunto de dados de treinamento, use o parâmetro `sample_size`. Por exemplo, se o conjunto de dados inicial tivesse 1.000 pontos de dados e `sample_size` estivesse definido como 100, em que o número total de instâncias é 2, cada operador obteria a amostra de 50 pontos. Um conjunto total de 100 pontos de dados seria coletado. A amostragem é executada em tempo linear em relação ao número de pontos de dados. 

## Etapa 2: Executar a redução da dimensão
<a name="step2-kNN-dim-reduction"></a>

A implementação atual do algoritmo k-NN tem dois métodos de redução de dimensão. Você especifica o método no hiperparâmetro `dimension_reduction_type`. O método `sign` especifica uma projeção aleatória, que usa uma projeção linear com uma matriz de sinais aleatórios, enquanto o método `fjlt` especifica uma transformação rápida de Johnson-Lindenstrauss, um método baseado na transformação de Fourier. Ambos os métodos preservam as distâncias L2 e interna do produto. O método `fjlt` deve ser usado quando a dimensão de destino é grande e tem melhor desempenho com inferência de CPU. Os métodos diferem em sua complexidade computacional. O método `sign` requer um tempo de O(ndk) para reduzir a dimensão de um lote de n pontos de dimensão d para uma dimensão de destino k. O método `fjlt` requer um tempo de O(nd log(d)), mas as constantes envolvidas são maiores. O uso da redução de dimensão introduz ruído nos dados, e esse ruído pode reduzir a precisão da predição.

## Etapa 3: Construir um índice
<a name="step3-kNN-build-index"></a>

Durante a inferência, o algoritmo consulta o índice de um ponto k-nearest-neighbors de amostra. Com base nas referências aos pontos, o algoritmo faz a predição de classificação ou regressão. Ele faz a predição com base nos rótulos de classe ou nos valores fornecidos. O algoritmo k-NN fornece três tipos diferentes de índices: um índice fixo, um índice invertido e um índice invertido com quantização de produto. Você especifica o tipo com o parâmetro `index_type`.

## Serializar o modelo
<a name="kNN-model-serialization"></a>

Quando o algoritmo k-NN termina o treinamento, ele serializa três arquivos para preparar a inferência. 
+ model\$1algo-1: contém o índice serializado para calcular os vizinhos mais próximos.
+ model\$1algo-1.labels: contém rótulos serializados (formato binário np.float32) para calcular o rótulo previsto com base no resultado da consulta do índice.
+ model\$1algo-1.json: Contém os metadados do modelo em formato JSON que armazena os hiperparâmetros `k` e `predictor_type` do treinamento para inferência junto com outros estados relevantes.

Com a implementação atual do k-NN, você pode modificar o arquivo de metadados para alterar a maneira como as predições são calculadas. Por exemplo, você pode alterar `k` para 10 ou alterar `predictor_type` para *regressor*.

```
{
  "k": 5,
  "predictor_type": "classifier",
  "dimension_reduction": {"type": "sign", "seed": 3, "target_dim": 10, "input_dim": 20},
  "normalize": False,
  "version": "1.0"
}
```