Principal Component Analysis in C#

Principal Component Analysis (PCA) is an exploratory tool designed by Karl Pearson in 1901 to identify unknown trends in a multidimensional data set. It involves a mathematical procedure that transforms a number of possibly correlated variables into a smaller number of uncorrelated variables called principal components.

Foreword

Before you read this article, please keep in mind that it was written before the Accord.NET Framework was created and became popular. As such, if you would like to do Principal Component Analysis in your projects, download the accord-net framework from NuGet and either follow the starting guide or download the PCA sample application from the sample gallery in order to get up and running quickly with the framework.

Introduction

PCA essentially rotates the set of points around their mean in order to align with the first few principal components. This moves as much of the variance as possible (using a linear transformation) into the first few dimensions. The values in the remaining dimensions, therefore, tend to be highly correlated and may be dropped with minimal loss of information. Please note that the signs of the columns of the rotation matrix are arbitrary, and so may differ between different programs for PCA.

For a more complete explanation for PCA, please visit Lindsay Smith excellent Tutorial On Principal Component Analysis (2002).

Accord.NET Framework

This new library, which I called Accord.NET, was initially intended to extend the AForge.NET Framework through the addition of new features such as Principal Component Analysis, numerical decompositions, and a few other mathematical transformations and tools. However, the library I created grew larger than the original framework I was trying to extend. In a few months, both libraries will merge under Accord.NET. (Update April 2015)

Design decisions

As people who want to use PCA in their projects usually already have their own Matrix classes definitions, I decided to avoid using custom Matrix and Vector classes in order to make the code more flexible. I also tried to avoid dependencies on other methods whenever possible, to make the code very independent. I think this also made the code simpler to understand.

The code is divided into two projects:

  • Accord.Math, which provides mathematical tools, decompositions and transformations, and
  • Accord.Statistics, which provides the statistical analysis, statistical tools and visualizations.

Both of them depends on the AForge.NET core. Also, their internal structure and organization tries to mimic AForge’s wherever possible.

The given source code doesn’t include the full source of the Accord Framework, which remains as a test bed for new features I’d like to see in AForge.NET. Rather, it includes only limited portions of the code to support PCA. It also contains code for Kernel Principal Component Analysis, as both share the same framework. Please be sure to look for the correct project when testing.

Code overview

Below is the main code behind PCA.

Using the code

To perform a simple analysis, you can simple instantiate a new PrincipalComponentAnalysis object passing your data and call its Compute method to compute the model. Then you can simply call the Transform method to project the data into the principal component space.

A sample sample code demonstrating its usage is presented below.

Example application

To demonstrate the use of PCA, I created a simple Windows Forms Application which performs simple statistical analysis and PCA transformations.

input_thumb-5B2-5D

The application can open Excel workbooks. Here we are loading some random Gaussian data, some random Poisson data, and a linear multiplication of the first variable (thus also being Gaussian).
 
univariate_thumb-5B4-5D
Simple descriptive analysis of the source data, with a histogram plot of the first variable. We can see it fits a Gaussian distribution with 1.0 mean and 1.0 standard deviation.
 
principal_thumb-5B9-5D
Here we perform PCA by using the Correlation method. Actually, the transformation uses SVD on the standardized data rather than on the correlation matrix, the effect being the same. As the third variable is a linear multiplication of the first, the analysis detected it as irrelevant, thus having a zero importance level.
 
projection_thumb-5B4-5D
Now we can make a projection of the source data using only the first two components.
 

 

Note: The principal components are not unique because the Singular Value Decomposition is not unique. Also the signs of the columns of the rotation matrix are arbitrary, and so may differ between different programs for PCA.

Together with the demo application comes an Excel spreadsheet containing several data examples. The first example is the same used by Lindsay on his Tutorial on Principal Component Analysis. The others include Gaussian data, uncorrelated data and linear combinations of Gaussian data to further exemplify the analysis.

I hope this code and example can be useful! If you have any comments about the code or the article, please let me know.

See also

A Tutorial On Principal Component Analysis with the Accord.NET Framework

This is a tutorial for those who are interested in learning how PCA works and how each step of Lindsay’s tutorial can be computed in the Accord.NET Framework, in C#.

Kernel Principal Component Analysis in C#

This is the non-linear extension of Principal Component Analysis. While linear PCA is restricted to rotating or scaling the data, kernel PCA can do arbitrary transformations (such as folding and twisting the data and the space that contains the data).

IX Congresso Brasileiro de Redes Neurais e Inteligência Computacional

Hoje foi o terceiro dia (propriamente dito) do IX Congresso Brasileiro de Redes Neurais e Inteligência Computacional (CBRN 2009), sendo realizado aqui em Ouro Preto.

Neste mesmo dia, apresentei o meu singelo trabalho de graduação entre tantos outros trabalhos de mestrado e doutorado. E graças a Deus, tudo deu certo!

E além disto, o melhor de tudo foi ter a oportunidade de assistir a trabalhos muito interessantes apresentados nessa conferência. A começar pelo trabalho da primeira sessão plenária, muito bem elaborado e muito, muito bem apresentado.

Os trabalhos que assisti e que mais me chamaram a atenção foram:

Redes Neurais sob Criterios de Entropia: Previsão de Potência Eólica e Outras Aplicações

Ao invés de minimizar os erros, o autor minimiza a entropia dos erros das redes neurais. Muito genial, pois evita que erros de medição contaminem o aprendizado. Professor Vladimiro Miranda, INESC Porto.

Analise de Desempenho de Cursos de Pós-Graduação Utilizando Mapas Auto-Organizáveis Parciais

Mostra o como podemos analisar o conceito CAPES de diversas maneiras para ter uma visão melhor sobre a pós-graduação no país. Muito interessante observar os resultados graficamente! Flavius da L. Gorgônio, José A. F. Costa

Uma Interface Humano-Máquina Inteligente Baseada no Rastreamento Ocular para comunicação Escrita de Pacientes com Síndrome Locked-In

A construção de um sistema de comunicação pra pessoas com paralisia total em que a única forma de comunicação seja o movimento e piscar de olhos. Graduação. Amanda L. Nascimento, Fernando B. L. Neto, Sérgio C. Oliveira, Hugo S. B. Filho

E também o meu, é claro 😛

Avaliação Prognóstica de Complicações Pós-Operatórias em Pacientes Submetidos à Cirurgia de Revascularização do Miocárdio

Uma investigação de aplicabilidade de redes neurais no problema específico do prognóstico de complicações pós-operatórias desta cirurgia cardíaca, utilizando análise de componente principal, regularização bayesiana e curvas ROC. Graduação. César Roberto de Souza, Ednaldo B. Pizzolato, Renata Mendes, Audrey B. Silva, Maurício Machado, Paulo Correa

Recebi algumas sugestões de como melhorar a pesquisa. Afinal, a apresentação foi produtiva!

Como Remover o Adobe Drive do Context Menu no Windows Explorer (Windows Seven ou Windows Vista)

Se você instalou o Adobe Creative Suite CS4 em seu computador, deve ter tido uma agradável surpresa ao saber que o instalador resolveu adicionar uma entrada em seu menu de contexto do Windows Explorer para o Adobe Drive.

Bom, nem me dei ao trabalho de saber para que servia a ferramenta para saber que era inútil e deveria removê-la. Ainda mais porque ninguém me perguntou se eu a queria ali.

 

Removendo o Adobe Drive do Context Menu no Windows Explorer do Windows Seven ou Windows Vista, edição 32-bits ou 64-bits:

Para remover a entrada indesejada, primeiro abra o prompt de comando em modo de administrador. Para isto, vá até o menu Iniciar, procure pelo prompt de comando (command prompt), clique-o com o botão direito e selecione Executar como Administrador. O caminho, então, fica:

Start > All Programs > Accessories > clique direito no Command Prompt e selecione “Run As Administrator”

 

Uma vez dentro do prompt, digite:

regsvr32 /u “C:Program FilesCommon FilesAdobeAdobe Drive CS4ADFSMenu.dll”

 

A seguir, dê enter e clique OK. Pronto!

Instalando o Debian no Notebook HP DV5 1251

Este é um tutorial de como instalar o sistema operacional Debian GNU/Linux versões testing ou unstable em um notebook HP dv5 1251. Este notebook possui processador Intel Core 2 Duo e adaptador gráfico NVIDIA com memória dedicada. Este tutorial possivelmente se aplica a outros modelos da série dv5-1000.

Especificacões do notebook HP dv5 1251nr:

  • Processador: Intel Core 2 Duo Processor T6400
  • Sistema Operacional: Windows Vista Home Premium 64-bit
  • Tela: 15.4" (diagonal) high-definition widescreen
  • Memória: 4GB RAM
  • Disco Rígido: 320GB
  • Memória Gráfica: Memória dedicada de 512MB
  • Duracão da Bateria: Até 2 horas e 15 minutos
  • Dispositivos:
    • Leitor de Cartões 5-em-1
    • Webcam de 2.0 megapixels
  • Dimensões: 14.05" (W) x 10.2" (D) x 1.37" (min H)/1.65"(max H)
  • Cores: Onyx / Bronze

 

Índice

  1. Obtendo a mídia de instalação
  2. Instalando o Debian GNU/Linux
  3. Configurando o Gerenciador de Pacotes
  4. Configurando os Dispositivos
    1. Adaptador Wireless (Intel WiFi Link 5100)
    2. Adaptador Gráfico (GeForce 9200M GS)
    3. Adaptador de Áudio (Intel IHT High Definition Audio)
  5. Dispositivo de Toque (Synaptics Touchpad)
  6. Configurações Adicionais
    1. Acessando outras partições
    2. Configurando layout de teclado e idioma
  7. Sugestões Adicionais

 

 

Obtendo a mídia de instalacão

Baixe o cd de instalação da distribuição testing com KDE embutido. Este manual se refere à versão com KDE, porém outras versões também podem funcionar. O CD de instalação da distribuição testing é gerado automaticamente a cada semana, portanto não se preocupe em gravar um CD-R, grave num CD-RW para evitar o desperdício de discos.

Após gravado, deixe o CD na tray e reinicie seu notebook.

 

Instalando o Debian GNU/Linux

Após colocar o cd na bandeja, aguarde para cair na tela inicial de instalação. Selecione o modo texto, pois o gráfico não funcionou quando tentei. Na build particular do instalador que utilizei, a Wireless também não funcionou durante a instalação. Na verdade, o chipset wireless é reconhecido sem problemas, mas o botão de ligar não funciona, o que a deixa desabilitada e consequentemente nos deixa sem rede.

Adicionalmente, encontrei alguns problemas com o particionador pois, quando instalei o Windows 7, criei uma partição adicional no disco. Como o Windows 7 também criou uma partição especial extra, e como a HP coloca uma partição de restore em todos seus notebooks, isto me deixou com 4 partições primárias. Assim, por mais que houvesse espaço não alocado disponível no disco para se criar uma nova partição ext4, o instalador não conseguia criar uma partição a mais, pois este é o limite de partições primárias que um disco com particionamento DOS pode ter.

A solução foi remover a partição de restore da HP e criar uma nova partição extendida no espaço restante para acomodar duas novas partições lógicas, uma partição ext4 para servir de root e a swap.

Feito isso, a instalação seguiu sem mais problemas.

 

Configurando o Gerenciador de Pacotes

No meu caso, utilizei a distribuição unstable para pegar o restante dos pacotes. Mas você também pode continuar com a versão testing se preferir.

De qualquer forma, adicione as seguintes linhas a seu /etc/apt/sources.list:

deb http://http.us.debian.org/debian/ testing main contrib non-free
deb http://deb.opera.com/opera/ testing non-free
deb http://dl.google.com/linux/deb/ stable non-free main

A seguir prosseguiremos configurando cada componente do notebook em separado. Ao final deste tutorial, todos os dispositivos, como vídeo, webcam, áudio, microfone e touchpad estarão funcionando corretamente.

 

Configurando os Dispositivos

Adaptador Wireless (Intel WiFi Link 5100)

O chipset wireless Intel 5100 funciona bem no linux. Tanto que já deve ter sido instalado por padrão durante a instalação. No entanto, muito provavelmente ele ainda não deve estar funcionando.

O problema aqui é que, por alguma razão, o botão touch que habilita/desabilita a wireless (que fica azul e laranja em cima do teclado) não funciona corretamente. Se você executar o comando dmesg para ver as mensagens do kernel, certamente irá encontrar a linha "Radio disabled by HW RF Kill switch".

Para contornar este problema enquanto não temos uma solução definitiva, digite:

sudo modprobe -r iwlagn && sudo modprobe iwlagn

Isto deverá reabilitar a sua wireless. Contudo, tenha em mente que, toda vez a wireless for desligada através do touchbutton este comando terá de ser executado de novo.

 

Adaptador Gráfico (NVIDIA GeForce 9200M GS)

Instalar placas de vídeo nvidia geralmente é um procedimento simples no linux, ainda mais no Debian. Primeiro, instale os pacotes module-assistant e nvidia-kernel-common:

# apt-get install module-assistant nvidia-kernel-common nvidia-glx

Em seguida, execute o module-assistant digitando m-a no terminal como root:

# m-a

Basta então preparar, selecionar, compilar e instalar o modulo nvidia seguindo o assistente.

 

Após instalar o módulo nvidia e o pacote nvidia-glx, faltará pouco para concluir a instalação. O Debian não inclui mais o arquivo padrão /etc/X11/xorg.conf contendo as configurações básicas do xorg porque, ao menos teoricamente, agora o xorg seria capaz de identificar automaticamente qual driver deve ser utilizado com cada adaptador gráfico. O problema é que, como ele não tenta utilizar o driver oficial da nvidia, acaba falhando miseravelmente neste processo e nos deixando na mão.

Será necessário, então, criar este arquivo e inserir nele as seguintes linhas:

Para finalizar, salve o arquivo e reinicie o X. Recomendo também a instalação do pacote nvidia-settings para ajustar configurações adicionais de sua placa de vídeo, como o dual display e o twinview.

 

Adaptador de Áudio (Intel IDT High Definition Audio)

Para que o dispositivo de áudio funcione corretamente será necessário adicionar uma linha de configuração no final do arquivo alsabase.conf localizado no diretório /etc/modprobe.d/. Para isto, é possível abrir o arquivo com:

nano /etc/modprobe.d/alsabase.conf

Após abrir, navegue até sua ultima entrada e então insira a seguinte linha:

options snd-hda-intel model=hp-dv5 enable_msi=1

Após editar o arquivo, reinicie o sistema ou digite update-modules -f.

Habilitando o suporte a arquivos MP3

Para tocarmos arquivos mp3 é preciso instalar o decoder de áudio ffmpeg e seu respectivo plugin para a engine de áudio xine. Para isto, digite:

sudo apt-get install libxine1-ffmpeg ffmpeg

 

Dispositivo de Toque (Synaptics Touchpad)

Para configurarmos o touchpad, primeiro precisamos habilitar seu compartilhamento de configuração. Para isto, você precisa criar um arquivo texto de nome shmconfig.fdi no diretório /etc/hal/fdi/policy/ e inserir nele as configurações desejadas. Para isto, podemos criar este arquivo utilizando o nano:

# nano /etc/hal/fdi/policy/shmconfig.fdi

Para em seguida inserir, dentro do arquivo, o seguinte código:

Em seguida, baixe o pacote kcm_touchpad para obter um modulo do painel de controle do KDE capaz de gerenciar seu touchpad. No momento da elaboração deste tutorial o pacote ainda não estava disponível via apt-get, mas podia ser obtido em:

http://opendesktop.org/content/show.php/kcm_touchpad

Para instalar, baixe a versão para Ubuntu e a instale utilizando o comando dpkg –i <pacote.deb>.

 

Configurações Adicionais

Acessando outras partições do sistema

Para configurar rapidamente a montagem das outras partições de seu sistema, como por exemplo a partição do Windows, baixe os pacotes ntfs-3g e ntfs-config pelo apt-get:

apt-get install ntfs-3g ntfs-config

E então digite:

sudo ntfs-config

Basta então seguir as instruções na tela para configurar o acesso a cada partição detectada.

 

Configurando layout do teclado e idioma

Para o teclado funcionar corretamente deve-se utilizar o layout de teclado USA variante International (with dead keys). O comando resultante na janela do System Settings (KDE) deverá ser:

setxkbmap -model pc104 -layout us -variant intl

 

Sugestões Adicionais

Wine (para executar aplicativos windows)

apt-get install wine

Mono (para executar aplicativos .NET)

apt-get install mono-runtime

GTK-QT Engine (para aplicar estilos QT em aplicativos GTK)

apt-get install gtk-qt-engine system-config-gtk-kde

Sun Java 6 (máquina virtual java)

apt-get install sun-java6-bin sun-java6-plugin

Flash plugin (para visualizar sites em flash)

apt-get install flashplugin-nonfree

Splashy (para exibir uma splash screen durante o boot do sistema)

apt-get install splashy startupmanager

Dicionário de Correção Ortográfica em Português para o Windows Live Writer

Se você prefere utilizar o Windows Live Writer em inglês, mas gostaria de ter a correção ortográfica em português do brasil disponível para quando precisar, baixe o dicionário de correção ortográfica em pt-br disponibilizado no link abaixo, descompacte-o e copie os dois arquivos contidos para dentro da pasta C:Program Files (x86)Windows LiveWriterDictionaries

Dicionário pt-br para correção ortográfica no Windows Live Writer

 

Após isto, basta reiniciar o Windows Live Writer e selecionar o idioma desejado nas opções do programa!

Pendrive Para Não Perder

sukavog-pendrive3

É sempre bom andar com um pendrive à mão, mas nem sempre isso é possível. Acaba se tornando uma tranqueira a mais para se carregar nos bolsos. E o medo de quebrar?

Bom, isso com certeza não seria problema se pendrives fossem feitos de borracha.

 

E não é que existem?

Acabei de conseguir um pendrive novo, com corpo de borracha, perfeito para se juntar ao molho de chaves e estar sempre à mão. No MercadoLivre, pendrives úteis como este estão disponíveis a preços bastante convidativos! Opções incluem pulseiras-usb, canetas, pingentes, e muitos novos tipos que difilmente vejo por aí. Inclusive outras curiosidades como latinhas, instrumentos musicais e outras coisas engraçadinhas boas para se dar de presente.


Se for adquirir um, recomendo o vendedor Sukavog. Muito atencioso, e de extrema confiança! Bom, pelo menos oferece garantia de 3 meses… 😛