A Decomposição em Valores Singulares
Autor: Lucas Vinícius | Publicado: 2012-01-31T15:47:00-02:00

Neste post eu quero mostrar uma técnica muito interessante, a Decomposição em Valores Singulares (SVD) e para demonstrá-la vou usar o exemplo mais comum que é a compressão de imagem.
Usar a Decomposição em Valores Singulares é muito simples, porém entendê-la não é tão simples assim logo, neste post, eu focarei na utilização, mas no futuro pretendo tratar do assunto novamente de maneira mais teórica e mostrar outras aplicações desta técnica.

Neste tutorial eu utilizei o MATLAB, porém outros softwares que trabalham com matrizes também fazem a mesma coisa com poucas modificações (como o Scilab). 
Inicialmente temos uma imagem, que quando em preto e branco é representada por uma matriz. 

\[&nbsp;Img = \begin{bmatrix}&nbsp;0 &amp;&nbsp;255 &amp; 0 \\&nbsp;255 &amp;&nbsp;0 &amp; 255\\ 0 &amp; 255 &amp; 0\end{bmatrix} \]
A decomposição por valores Singulares é feita desse modo: 

\[&nbsp;[ U,S,V ] = svd ( Img ) \]
Para o caso da matriz&nbsp;\(&nbsp;Img \)
 acima temos:

\[&nbsp;U = \begin{bmatrix}&nbsp;-0.71 &amp;&nbsp;0 &amp; -0.71
 \\&nbsp;0 &amp;&nbsp;1 &amp; 0\\ -0.71

 &amp;&nbsp;0 &amp; -0.71
\end{bmatrix} \]

\[&nbsp;S = \begin{bmatrix} 510 &amp; 0 &amp; 0 \\ 0 &amp;&nbsp;250 &amp; 0\\&nbsp;0 &amp; 0 &amp; 0\end{bmatrix} \]

\[&nbsp;V = \begin{bmatrix} -0.71 &amp; 0 &amp; -0.71 \\ 0 &amp; 1 &amp; 0\\ -0.71 &amp; 0 &amp; -0.71\end{bmatrix} \]

Para quem não sabe uma decomposição matricial é transformar uma matriz em um produto de matrizes assim temos que: 

\[&nbsp;Img = U * S * V^T \]
Essas matrizes têm características especiais, porém neste caso somente precisamos entender um pouco da matriz \( S \), que possui os valores singulares. A matriz S é uma matriz diagonal e sua diagonal contém os valores singulares em ordem decrescente. De uma forma bem simplificada podemos dizer que os valores singulares representam a importância que determinada informação tem para a matriz logo nossa compressão se refere a trocar valores singulares pequenos por zero. Na verdade o que faremos é eliminar as linhas e colunas de S a partir de determinado valor. Para quem se lembra da multiplicação matricial (ensino médio) podemos ver que, quando eliminamos linhas e colunas de \( S \)
, podemos eliminar de&nbsp;\(&nbsp;U \)
 e&nbsp;\(&nbsp;V \) também, pois estaremos multiplicando por zero logo elas são desnecessárias, desse modo teremos as matrizes \( S_k \)
, \(&nbsp;U_k \)
 e&nbsp;\(&nbsp;V_k \)
 onde k é o número de valores singulares que você deseja manter (quanto mais valores, melhor a qualidade). 

\[&nbsp; S_k = S(1:k,1:k)&nbsp;
\]
\[&nbsp; U_k = S(:,1:k) \]

\[&nbsp; V_k = S(:,1:k) \]

O produto destas matrizes será parecido com a imagem original. 

\[ Img
\simeq U_k * S_k * V_k^T \]
A imagem formada é uma compressão da imagem original, porém como as matrizes terão o mesmo tamanho, ambas ocuparão o mesmo espaço no seu HD, então para que essa compressão tenha algum resultado devemos armazenar a matriz \(&nbsp;U_k \)
 e uma matriz \(&nbsp;P_k=S_k*V_k^T \), pois elas ocuparão menos espaço que o produto das mesmas.
Para entenderem melhor, fiz um exemplo com o logotipo do blog, a imagem original é:

 

A tabela a seguir mostra o numero de valores singulares utilizados, a imagem resultante e a porcentagem de compressão:

 
   
 k=25 / tamanho 12.6% k=75 / tamanho 37.9% k=125 / tamanho 63.1%
   
 k=175 / tamanho 88.3% k=200 / tamanho 100.9%
 

Podemos observar que a partir de 200 valores singulares, a técnica não compensa, pois armazenar as matrizes \(&nbsp;P_k \)
 e \(&nbsp;U_k \)
 gasta mais espaço que armazenar imagem original. Outro ponto interessante é percebermos que a imagem com k=75 não é tão ruim e pode ser armazenada em 38% do espaço ocupado pela imagem original&nbsp;         



var cdf = new cdfplugin();cdf.embed('http://dl.dropbox.com/u/57764601/SVD/SVD.cdf', 588, 530);

Clique aqui para baixar o script que fiz para o MATLAB.
Para baixar o Scilab (que é gratuito!!!) &gt;&gt; Scilab

Lembre-se: Sempre que baixar algum arquivo da internet verifique-o com seu antivírus.