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
[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 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:
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:
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:
Ver também
[editar | editar código-fonte]- ↑ Izbicki, Mendonça (2018). «Machine Learning sob a ótica estatística» (PDF)