• Nenhum resultado encontrado

A metodologia de quantização vetorial (Gersho & Gray, 1992) é amplamente conhecida e empregada para a compressão de sinais com o intuito de reduzir o volume da informação que deverá ser transmitida ou armazenada, mas com um objetivo bem claro: possibilitar a recuperação do sinal com uma distorção/ruído de quantização admissível. Na quantização vetorial é necessária a criação de um dicionário para codificação deste sinal – um conjunto de vetores, em menor quantidade que os da informação original, que a represente de uma forma aproximada. O vetor representante é transmitido e ao final da transmissão decodificado, recuperando assim o sinal com o nível de perdas desejado. Para isso é necessária a otimização desta aproximação de forma a contrabalançar seus dois principais parâmetros: tamanho da informação a ser enviada e nível de ruído desejado.

A etapa mais importante de uma quantização vetorial é a criação do dicionário de codificação, pois é nela que será definido o nível de compressão do sinal e o nível de ruído inserido na informação. Existem diversas técnicas utilizadas para a criação deste dicionário que são amplamente empregadas em análises de clusterização e quantização vetorial. As mais usuais são: Poda (Pruning), Vizinho mais próximo (Pairwise Nearest Neighbor - PNN), Partição (Splitting), Algoritmo Generalizado de Lloyd (Generalized Lloyd Algorithm – GLA), Relaxação Estocástica (Stochastic Relaxation) e Clusterização Fuzzy (Fuzzy Clustering).

Um dicionário é formado por centróides, que são os vetores centrais da clusterização de uma determinada classe, que por sua vez são as divisões entre os vetores de entrada que mais se assemelham, (mais próximos pela métrica adotada).

Na próxima seção apresentaremos o diagrama de Voronoi e a técnica do GLA combinada com a Partição.

3.3.1 Diagrama de Voronoi

O diagrama de Voronoi é uma divisão do espaço em regiões de acordo com a distância a determinados pontos. Para um dado conjunto 𝐴 = 𝑎1, 𝑎2, … , 𝑎𝑛 de 𝑛

pontos, existe uma divisão em 𝑛 regiões 𝑝, otimizando as distâncias, ou seja, as linhas que delimitam cada conjunto são encontradas de modo que os pontos pertencentes a este conjunto tenham uma distância menor em relação ao seu centróide do que em relação a qualquer outro centróide. Isso pode ser melhor entendido observando-se a Figura 3.7, que ilustra um diagrama de Voronoi para um conjunto de 𝑛 = 10 pontos. O conjunto delimitado pelas linhas em vermelho é o conjunto relacionado ao ponto 𝑎𝑖 formando uma região 𝑝𝑖. Os pontos dentro desta região apresentam menor distância à 𝑎𝑖 do que a

qualquer outro ponto do conjunto 𝐴. Ou seja, a delimitação encontrada pelo diagrama é a melhor possível em termos de distância.

Esse diagrama é utilizado para fazer a clusterização dos vetores de entrada de um quantizador vetorial em relação aos seus centróides. A próxima seção descreve isso mais detalhadamente.

29

Figura 3.7 – Diagrama de Voronoi

3.3.2 O Algoritmo Generalizado de Lloyd

O algoritmo generalizado de Lloyd, ou simplesmente GLA (será utilizada a sigla em inglês devido à maioria das referências no assunto serem em inglês), é baseado na modificação do dicionário através de um processo de iterações. Em princípio assumimos que a função densidade de probabilidade dos vetores de entrada é conhecida, continuamente e uniformemente distribuída.

O objetivo principal do algoritmo é criar um dicionário que apresente a menor distorção possível. Ou seja, a clusterização dos vetores de entrada é otimizada de acordo com a métrica de distância utilizada.

Inicialmente temos um conjunto de dados de entrada 𝐗 e um dicionário inicial 𝐘.

𝐗 ∈ ℝ𝑀×𝑁 (3.37)

𝐱 𝑛 ∈ ℝ𝑀, 𝑛 = 1, … , 𝑁 (3.38)

𝐘 ∈ ℝ𝑀×𝐾 (3.39)

𝐲 𝑘 ∈ ℝ𝑀, 𝑛 = 1, … , 𝐾 (3.40)

Cada iteração procura, para cada vetor de entrada, utilizando uma medida de distância 𝑑 𝐱, 𝐲 , como por exemplo, qual o centróide mais próximo e atribui a ele o

índice de indexação do centróide 𝐱 𝑛 como efeito de clusterização conforme as equações 𝑑 𝐱, 𝐲 = 𝐱 − 𝐲 2= 𝑥 𝑚 − 𝑦𝑚 2 𝑀 𝑚 =1 (3.41) 𝐱 𝑛 = 𝛽 𝛼 𝐱 𝑛 (3.42) 𝑑 𝐱, 𝐱 = min𝑘∈ 1,2,…,𝐾 𝑑 𝐱, 𝐲𝑘 (3.43)

Após analisar todos os centróides é calculada a distorção de todos os vetores de entrada em relação ao seu centróide, ou seja

𝐷 = 1 𝑁 𝑑 𝐱 𝑛 , 𝐱 𝑛 𝑁 𝑛=1 = 1 𝑁 𝐱 𝑛 − 𝐱 𝑛 2 𝑁 𝑛=1 = 𝐸 𝑑 𝐱, 𝐱 (3.44)

A clusterização dos vetores de entrada é feita, por exemplo, utilizando a condição do vizinho mais próximo, gerando um conjunto 𝑅𝑘 dado por

𝑅𝑘= 𝐱 ∈ 𝒯: 𝑑 𝐱, 𝐲𝑘 ≤ 𝑑 𝐱, 𝐲𝑗 ; ∀ 𝑗 ≠ 𝑘 (3.45)

Ao final desse processo tem-se tantos conjuntos 𝑅𝑖 quanto centróides, e a partir

desse agrupamento podemos calcular os novos valores de centróides, ou seja

𝐲𝑘 = 1

𝑁𝑘 𝐱 𝑛 ∈𝑅𝑘𝐱 𝑛

(3.46)

Esse processo minimiza a distâncias dos centróides aos vetores associados a ele. Feito isso para todos os 𝑘 conjuntos/classes o processo do GLA descrito acima é refeito gerando uma nova divisão das classes, com uma distorção menor ou igual à anterior.

A Figura 3.8 ilustra um diagrama esquemático do algoritmo, onde a condição de parada é definida pelo usuário. Pode ser usada, por exemplo, a diferença entre a distorção atual e a da iteração anterior; se for menor que certo valor pare, se não continue, ou então até que um certo número máximo de iterações seja alcançado.

31

Figura 3.8 – Diagrama esquemático do GLA

O GLA em sua formulação padrão apresenta um dicionário inicial do mesmo tamanho (quantidade de centróides) que o dicionário final. Uma modificação muito usual é a criação do dicionário através de Partição, ou seja, o dicionário é inicializado com um número menor de centróides e então estes são quebrados, conforme o algoritmo vai evoluindo, até que ao final de todas as iterações o tamanho final do dicionário seja o desejado. Contudo, o algoritmo pode ser aplicado sem perda de generalidade alguma. Na verdade, até ocorrer uma quebra, o algoritmo é executado normalmente para um dicionário com um número de centróides. No instante da quebra, o algoritmo é interrompido e então se dá início a um novo processo com um novo dicionário, agora com um tamanho maior. Ou seja, a cada quebra executamos o algoritmo independente do anterior.

O processo de quebra é feito adicionando um pequeno vetor 𝜖 ao dicionário anterior, por exemplo, inicialmente, temos um único centróide 𝑌0 que define uma única classe onde todos os vetores de entrada se encontram, após a partição, e antes de

executar o algoritmo, teremos 𝑌0+ 𝜖, 𝑌0 . Podemos notar que esse novo dicionário

conterá o dicionário anterior, ou seja, o passo seguinte apresentará uma perda menor ou igual à apresentada anteriormente. Esse processo é feito diversas vezes, até que o dicionário final seja do tamanho desejado ou um nível tolerável de ruído seja alcançado.

Documentos relacionados