Saltar para o conteúdo

Interpolação por vizinho mais próximo

Origem: Wikipédia, a enciclopédia livre.

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.

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 a localização a interpolar e as amostras as amostra é feita o cálculo da distância (no exemplo seguinte é feita a distância euclidiana):

O valor interpolado é retirado da função da posição das amostras reais, , neste caso considerando o mínimo:

A interpolação pode ser feita em várias dimensões da qual se mostra um exemplo unidimensional na imagem seguinte:

Interpolação por vizinho mais próximo (linhas azuis) numa dimensão usando algumas amostras espacialmente dispersas (pontos vermelhos).

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.[1]

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

[editar | editar código-fonte]

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):

from __future__ import division
import numpy as np
import matplotlib.pyplot as plt

A implementação, de facto, do algoritmo é:

def VMP(dados,blocos):
    resultado = np.zeros(blocos)
    for x in xrange(resultado.shape[0]):
        for y in xrange(resultado.shape[1]):
            dist = np.sqrt((x-dados[:,0])**2+(y-dados[:,1])**2)
            ind = np.where(dist == dist.min())
            resultado[x,y] = dados[ind[0][0],2]
    return resultado

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:

Dados utilizados no exemplo de estimação.

Da função resultou o seguinte por comparação com a imagem original de onde foram retirados os dados:

Objectivo
Imagem objectivo
Previsão
Interpolação
Interpolação utilizando o vizinho mais próximo implementado no código acima.

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:

Add caption here

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:

Add caption here
  1. Izbicki, Mendonça (2018). «Machine Learning sob a ótica estatística» (PDF)