# Interpolação por vizinho mais próximo

Interpolação pelo vizinho mais próximo é um método de interpolação determinista no qual o valor estimado é sempre igual à sua amostra mais próxima não considerando qualquer outra. Dada a sua simplicidade é regularmente utilizado para interpolações rápidas e em áreas de estudo bem amostradas.

## Definição

Para cada localização a ser interpolada deverá ser calculado a distância de todos os pontos amostrais a essa mesma localização e determinar qual deles terá a distância miníma sendo o valor correspondente a interpolação. Sendo $x_{o},y_{o}$ a localização a interpolar e as amostras $x_{i},y_{i}$ as amostra é feita o cálculo da distância (no exemplo seguinte é feita a distância euclidiana):
    $min(d={\sqrt {(x_{o}-x_{i})^{2}+(y_{o}-y_{i})^{2}}}\,)$
O valor interpolado é retirado da função da posição das amostras reais, $f(x_{i},y_{i})$, neste caso considerando o mínimo:
    $g(x_{o},y_{o})=f(x_{min},y_{min})$
A interpolação pode ser feita em várias dimensões da qual se mostra um exemplo unidimensional na imagem seguinte:
Este método pode ser generalizado para considerar k vizinhos mais próximos, e não apenas um único. Neste caso, não há uma interpolação, e sim uma suavização.

## Algoritmo da interpolação por vizinho mais próximo em Python

A implementação de interpolação bidimensional que se segue é feita na linguagem Python (versão 2.7.2) com recurso à biblioteca NumPy tendo por esse motivo o seguinte cabeçalho de importações (está considerado também a biblioteca matplotlib usada para visualização):
A implementação, de facto, do algoritmo é:
Para melhor compreensão do algoritmo descrito aqui é importante que se compreenda o que algumas das funções fazem:
* np.where - devolve um vector (ou vector de vectores, dependendo da dimensão do objecto) com as posições onde a condição que foi imposta é realizada, no nosso caso em particular onde o vector de distâncias tem o valor minimo do mesmo vector. Existe a possibilidade de haver mais do que uma posição onde isto aconteça devolvendo portanto vários índices. Por esse motivo o resultado do np.where, ind, é chamado como ind[0][0], o primeiro índice do primeiro vector.
* np.sqrt - calcula a raiz quadrada de um dado valor (ver formulação para o cálculo da Distância).
Na utilização da função o utilizador deverá introduzir como argumentos a matriz de dados (onde as colunas devem ser X, Y , valor, por esta ordem: 0,1,2), e uma tupla com o número de blocos na dimensão X e Y, por exemplo: (150,200). No exemplo seguinte a estimação vai ser feita numa matriz de 150 blocos na direção X e 200 blocos na direção Y com recurso à função transcrita acima e ao seguinte conjunto de dados:
Da função resultou o seguinte por comparação com a imagem original de onde foram retirados os dados:
Evidentemente no sentido de se atingir uma imagem objectivo (nesta experiência por nós conhecida) não só é importante a representação visual como também a reprodução estatística dos dados. Não existe qualquer ferramenta matemática que force à reprodução do histograma na interpolação por vizinho mais próximo. Mesmo na eventualidade disso se concretizar nada garante que os dados usados na interpolação tenham a mesma distribuição univariada (histograma) que a imagem objectivo (ou área de estudo) como podemos ver na comparação seguinte entre a distribuição dos dados e distribuição da imagem objectivo:
Analisando a reprodução do histograma na interpolação por oposição à imagem objectivo podemos observar que a distribuição dos dados usados na interpolação parece corresponder razoavelmente à distribuição da área de estudo: