Introdução de Álgebra Linear para Data Science

Aprenda os conceitos básicos de Álgebra Linear, domínio muito importante para quem trabalha ou pretende aprofundar na área.

Arthur Lamblet Vaz
Data Hackers
9 min readJan 30, 2019

--

A maioria das operações de deep learning e machine learning são em vetores. Seu ganho em performance são bem superiores quando comparado à operações escalares. Os conceitos que envolvem tais operações são do domínio da Álgebra Linear, disciplina amada e odiada nos cursos superiores de exatas.

Esse artigo vem com intuito de fornecer um quickview sobre as principais operações matriciais e termos que podem vim a ser útil, para quem trabalha com modelos de DL ou ML.

Antes em entrar no tema, vale recapitular sobre estruturação de dados.

ESTRUTURA DOS DADOS

1 — LISTA: Armazena uma sequencia de itens, pode ser números, palavras, frases. Apenas adicionar em python [] e separar os elementos da lista por vírgula. Já em R deve-se usar o comando c(), separando os elementos por vírgula.

2 — DATA FRAME: É a maneira mais comum de armazenar dados, se usado sistematicamente, facilita a análise de dados. Data frame pode ser definido como uma lista de vetores de comprimento iguais. Isso faz com que seja uma estrutura bidimensional, por isso compartilha propriedades de matriz e de lista. Em python basta importar a biblioteca pandas e utilizar a linha de comando pandas.DataFrame(), já em R pode usar o comando data.frame() direto.

3 — DICIONÁRIO: Em outras palavras uma lista especial, onde você coloca um “nome” em cada posição e armazena o que você quiser dentro. Para usar basta chamar esse “nome” que será acionado o que se encontra dentro dele. Exemplo:

d = {nome1: uma lista, nome2: uma função, nome3: um número}

Essa é uma estrutura nativa do python , entretanto para replicar no R não é nem um pouco complicado. Particulamente eu até prefiro, mesmo que tenha que escrever um pouco mais de código.

Exemplo:

dicionario <- vector(mode="list", length=3)
names(dicionario) <- c("nome1", "nome2", "nome3")
foo[[1]] <- uma lista; foo[[2]] <- uma função; foo[[3]] <- um número

Para acionar um dos elementos em python do dicionário, apenas escreva d['nome1'] e no R a mesma coisa ou dicionario$nome1 . Existe uma outra função no R muito útil que utiliza o mesmo conceito chamada nest() , para separar grandes data frame é bastante útil.

Abaixo segue uma ilustração bastante intuitiva que resume algums estruturas de dados:

Estrutura de dados — escrita em inglês

Mas afinal, qual a diferença entre um DATA FRAME e uma MATRIZ?

De forma simples e direta, todas as colunas em uma matriz devem ter o mesmo tipo de dados (numérico, caractere etc.) e o mesmo comprimento. Já no data frame não é necessário.

4 — TENSOR: Em geral, um tensor engloba o escalar, o vetor e a matriz. Mas não será uma estrutura vista com frequência, apenas bom saber que existe.

Nesse post é destinado as operações matriciais, que por sua vez são as mais utilizadas e podem ser bastantes úteis.

OPERAÇÕES MATRICIAIS

ADIÇÃO/SUBTRAÇÃO

Definindo uma matriz exemplo1[linha_X, coluna_Y] e exemplo2 [linha_A, coluna_B], portanto só é possível realizar a soma matricial quando linha_X = linha_A e coluna_Y = coluna_B

MULTIPLICAÇÃO

Existe três tipos de multiplicação: entre matrizes, vetor com uma matriz e um escalar com uma matriz.

1 — Entre matrizes: Seguindo o mesmo exemplo anterior só é possível multiplicar duas matrizes quando, coluna_Y = linha_A e a matriz resultando deverá ter uma dimensão [linha_X, coluna_B] .

E como de fato, efetua a multiplicação? Para facilitar, sempre trave a linha da primeira matriz e faça a soma dos produtos dos elementos. Em seguida passe para a proxima linha da primeira matriz até a última linha. Cada soma dos produtos irá ocupar um lugar de cima para baixo, esquerda para direita na nova matriz.

No exemplo superior, ficaria da seguinte maneira:

[[(2*1 + 3*0 + 1*4), (2*-2 + 3*5 + 1*1)],[(-1*1 + 0*0 + 2*4), (-1*-2 + 0*5 + 2*1)]]

2 — Vetor com uma matriz: O exemplo com vetor deve respeitar as mesmas regras da multiplicação matricial. Exemplo, se for um vetor [linha_V1 , 1] multiplicado com [linha_X, coluna_Y], portanto a linha_X deve ser igual a 1 e resultar em uma dimensão [ linha_V1, coluna_Y].

3 — Escalar com uma matriz: Simplesmente a multiplicação dos elementos da matriz pelo número escalar.

BROADCASTING

Broadcasting é um método existente na biblioteca python para operações matriciais. A figura abaixo descreve o funcionamento da lógica do broadcasting.

É uma maneira de ganhar desempenho de máquina, já que as operações matriciais quadráticas possuem uma melhor performance. Além de possibilitar executar operações onde “burla” os princípios visto anteriormente.

MATRIZ IDENTIDADE

Quando falamos em matrizes identidades, nos referimos às matrizes quadradas, cujos elementos da diagonal principal é 1 e os demais elementos são todos zeros.

MATRIZ INVERSA

A matriz inversa é um tipo de matriz que utiliza a propriedade da multiplicação:

A . B = B . A = I (quando a matriz B é inversa da matriz A)

Com os conhecimentos apriori já conseguimos pensar nos possíveis valores dos elementos da matriz inversa.

A matriz inversa pode ser calculada de diferentes maneiras, segue um outro método usando cofatores e matriz adjuntas.

Para quem é da área de ciência de dados já ouviu falar de regressão linear certo? Segue um exemplo utilizando matrizes para chegar no mesmo valor que a função existente. — Script em R

y <- c(9.3, 4.8, 8.9, 6.5, 4.2, 6.2, 7.4, 6, 7.6, 6.1)
x0 <- c(1,1,1,1,1,1,1,1,1,1)
x1 <- c(100,50,100,100,50,80,75,65,90,90)
x2 <- c(4,3,4,2,2,2,3,4,3,2)
Y <- as.matrix(y)
X <- as.matrix(cbind(x0,x1,x2))

beta = solve(t(X) %*% X) %*% (t(X) %*% Y);beta
[,1]
x0 -0.8687015
x1 0.0611346
x2 0.9234254
model <- lm(y~+x1+x2) ; model$coefficients(Intercept) x1 x2
-0.8687015 0.0611346 0.9234254

MATRIZ TRANPOSTA

Definindo uma matriz exemplo1[linha_X, coluna_Y], a sua transposta será exemplo1[coluna_Y, linha_X].

MATRIZ DETERMINANTE

Calculamos o determinante de matrizes quadradas, isto é, aquelas em que o número de linhas é igual ao número de colunas.

Se a matriz possuir duas linhas e colunas (2 x 2), então o determinante (det 2 x 2) será dado pela diferença entre os produtos da diagonal principal da matriz A pelo produto dos elementos que compõem a sua diagonal secundária. Veja abaixo como é feito o cálculo do determinante de uma matriz 2 por 2 (2 X 2).

Caso a matriz quadrada seja do tipo M 3 X 3, M 4 X 4, M 5 X 5 e assim por diante, calculamos o seu determinante executando os passos descritos abaixo:

  1. Faça o espelhamento da primeira e da segunda coluna da matriz, ou seja, repita a primeira e a segunda coluna;
  2. Realize os produtos de cada diagonal principal e secundária separadamente;
  3. Efetue a soma entre os termos obtidos dos produtos de cada diagonal;
  4. Realize a diferença entre os resultados obtidos referente à soma dos termos das diagonais principais e das secundárias. No fim desses cálculos, teremos o determinante da matriz.

Existe muitas demonstrações em Deep Learning — Redes Neurais, segue dois trabalhos que pode ajudar a entender a aplicabilidade.

MATRIZ ORTOGONAL

Uma matriz quadrada é dita ortogonal se sua matriz inversa coincide com sua matriz transposta.

Para exercitar , existe o site reshishi e nele é possível gerar matrizes e observar como foi contruída a solução dela. Uma boa forma de treinar e não se preocupe também em gravar nos detalhes e se aprofundar. As api de otmizadores e algoritmos já tem essa parte toda pronta, entretanto é importante saber para ajudar o estudo na área de data science.

Matriz com dados escassos, para quem trabalha com text mining pode ser uma rotina. Por isso, existe maneiras de se trabalhar e quanto em R quanto em Pyhton existe bibliotecas para se trabalhar nesse modelo, se chama sparce matrix.

Próximo tópico aborda outras duas propriedades super relevante: auto valor e auto vetor.

Se está familiarizado com o algoritmo de análise de componente principal, deve saber qual é a importância do algoritmo ao lidar com um grande conjunto de dados. Vocês já se perguntou o que está acontecendo por trás desse algoritmo? Então, o conceito de autovetor é a espinha dorsal do PCA. E digo mais, não só no PCA mas é utilizado também no SVD com mesmo intuito, ajudar em redimensionar os dados, em outras palavras, tirar redudancia.

Fiz o mesmo exemplo usando Python e R , segue o print abaixo:

Em geral, o autovetor de uma matriz é o vetor para o qual as seguintes premissas são válidas:

Onde o lambda é um valor escalar chamado de “autovalor”. Rescrevendo a esquação acima em outra maneira:

onde I é a matriz de identidade das mesmas dimensões que a matriz A.

No entanto, assumindo que vetor não é um vetor nulo, a equação acima só pode ser definida se (A — lambda I) não for invertível. Se uma matriz quadrada não é invertível, isso significa que seu determinante deve ser igual a zero. Portanto, para encontrar os autovetores de A, nós simplesmente temos que resolver a seguinte equação:

Assim encerra uma breve explicações dos tópicos em álgebra linear, que eu acho mais pertinente para entender o funcionamentos dos algoritmos.

Abaixo segue um exemplo simples demonstrando como as operações em matriz podem gerar ganho em desempenho.

FONTES:

https://www.analyticsvidhya.com/blog/2017/05/comprehensive-guide-to-linear-algebra/

--

--

Arthur Lamblet Vaz
Data Hackers

Surfista, natureba e engenheiro de produção com ênfase em Data Science🌱🌍♻️