Interpolação por vizinho mais próximo

Origem: Wikipédia, a enciclopédia livre.
Ir para: navegação, pesquisa

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[editar | editar código-fonte]

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:

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

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çao parece corresponder razoávelmente à distribuição da área de estudo:

Add caption here

Ver também[editar | editar código-fonte]