Olá pessoas, aqui quem fala é o Cairo e vamos embarcar numa curta jornada sobre Geometria Analítica com SymPy. “Mas, Cairo, onde que eu vou utilizar isso? Eu só quero vender minha arte na praia, ops, ser um cientista de dados.“. Confia, mais a frente nós vamos precisar disso pra entender as próximas postagens sobre decomposição de matrizes e cálculo vetorial. Portanto vamos conhecer alguns conceitos importantes da geometria analítica.
Em primeiro lugar vamos conhecer uma ferramenta para nos auxiliar nesse estudo. O SymPy é uma biblioteca em Python para matemática simbólica (uso de computadores para manipular equações matemáticas e expressões em forma simbólica, ou seja, contrário de numérica) . É uma biblioteca de software livre e vai desde a aritmética simbólica básica, cálculo, álgebra, matemática discreta e física quântica. Ela também é capaz de formatar os resultados em código LaTeX.
Devidamente apresentados ao SymPy, agora vamos ao nosso primeiro conceito da geometria analítica, a norma.
A norma de um vetor x é uma função que atribui a cada vetor a sua distância
Assim vamos ver como aplicar esse conceito com o SymPy.
Para matrizes, é utilizada a norma de Frobenius ou norma matricial, que é uma extensão da norma euclidiana para matrizes. Ela é calculada aplicando a função norm a uma matrix. Para retornar o resultado numérico, basta chamar a função evalf.
from sympy.matrices import Matrix a = Matrix([[3, 2, 1],[0, 2, 3]]) a Matrix([ [3, 2, 1], [0, 2, 3]]) a.norm() 3*sqrt(3) n = a.norm() n.evalf() 5.19615242270663
Agora que já estamos entendidos com a norma, podemos seguir para as matrizes simétricas positivas definidas.
Uma matriz é chamada de simétrica positiva definida, ou só matriz positiva definida, quando satisfaz (3):
“O que??”. Calma, vamos devagarzinho. Lê-se “para todo x pertencente a V (espaço vetorial), x transposta vezes A vezes x é maior que 0”. Caso for
Podemos notar que, aplicada a fórmula, enquanto o primeiro exemplo é sempre positivo, o segundo exemplo existe x onde o valor é menor que 0. Então apenas a primeira é uma matriz positiva definida.
Mas eu consigo aplicar esse conceito usando o SymPy? Claro!
Abaixo segue o exemplo acima traduzido para código SymPy. Como podem ver é uma tradução bem direta. A função simplify “simplifica” a função aplicando algumas regras, enquanto a função factor fatora um polinômio em fatores irredutíveis. Mas como podem observar, nenhum deles chegou no resultado que precisávamos.
from sympy.matrices import Matrix from sympy import simplify, Symbol, factor x1= Symbol('x1') x2 = Symbol('x2') x = Matrix([x1,x2]) x Matrix([ [x1], [x2]]) A1 = Matrix([[9,6],[6,5]]) d = x.T*A1*x Matrix([[x1*(9*x1 + 6*x2) + x2*(6*x1 + 5*x2)]]) simplify(d) Matrix([[9*x1**2 + 12*x1*x2 + 5*x2**2]]) factor(d) Matrix([[x1*(9*x1 + 6*x2) + x2*(6*x1 + 5*x2)]])
Agora que já estamos entendidos com a norma e conhecemos a matriz simétrica positiva definida, então estamos prontos para entender sobre os ângulos e ortogonalidade.
Existe
Onde <x,y> é o produto interno de x e y e ||x|| é a norma euclidiana. Vamos pro exemplo:
Vetores ortogonais: Dois vetores são ortogonais se
Mas o python já tem biblioteca pronta para isso também? Sim! Vamos ver no SymPy como fica.
Por exemplo, podemos calcular o coseno do ângulo de forma bem direta, usando o produto interno através da função dot. O SymPy também já vem com o método de Gram-Schmidt implementado, gerando matrizes ortogonais. É só passar como argumento a lista de matrizes.
x = Matrix([[1],[1]]) y = Matrix([[1],[2]]) x.T.dot(y)/sqrt(x.T.dot(x)*y.T.dot(y)) 3*sqrt(10)/10 GramSchmidt([x,y]) [Matrix([ [1], [1]]), Matrix([ [-1/2], [ 1/2]])]
O método de Gram-Schmidt utiliza projeções para transformar qualquer base de um espaço vetorial n-dimensional em uma base ortogonal/ortonormal. Então vamos a seguir falar um poucos dessas projeções.
Projeções são uma classe importante de transformações lineares, e tem um papel importante em gráficos, teoria dos códigos, estatística e aprendizado de máquina. No aprendizado de máquina as projeções podem servir para, por exemplo, redução de dimensionalidade. Dois algoritmos que podem executar essa redução são o PCA (Principal Component Analysis – Análise de Componentes Principais)e os Autoencoders.
Uma projeção ortogonal pode ser sobre uma reta, sobre um plano, etc. A projeção ortogonal sobre um plano pode ser comparada à sombra desse mesmo objeto no horário em que o sol está mais alto no dia. Nesse horário, a sombra possui dimensões iguais às do objeto, mas não possui profundidade alguma.
Assim também podemos aplicar estes conceitos com o SymPy, vejamos.
Utilizando o sympy, podemos obter a projeção ortogonal através da função project da matriz passando como argumento sobre qual plano pretende fazer a projeção.
from sympy import Matrix, sqrt V = Matrix([sqrt(3)/2, 1/2]) x = Matrix([[1, 0]]) V.project(x) Matrix([[sqrt(3)/2, 0]])
Por fim, vamos falar das rotações para fechar esse conceitos sobre a geometria analítica.
Rotações são mapeamentos lineares que rotaciona um plano por um ângulo
De acordo com os conceitos acima vamos ver como aplicar com o SymPy.
No SymPy, temos as funções rot_axis1, rot_axis2 e rot_axis3 para rotacionar no primeiro, segundo e terceiro eixo, respectivamente. Veja abaixo como utilizar as funções rotacionando nos eixos 1 e 2:
from sympy import pi from sympy.matrices import rot_axis1, rot_axis2 theta = pi/3 rot_axis1(theta) Matrix([ [1, 0, 0], [0, 1/2, sqrt(3)/2], [0, -sqrt(3)/2, 1/2]]) rot_axis2(theta) Matrix([ [ 1/2, 0, -sqrt(3)/2], [ 0, 1, 0], [sqrt(3)/2, 0, 1/2]]) rot_axis2(pi/2) # 90º Matrix([ [0, 0, -1], [0, 1, 0], [1, 0, 0]])
Enfim, por hoje é só, pe-pessoal. Sendo assim, abaixo algumas referências pra vocês e um tutorialzinho do SymPy. Abraços e até a próxima!
Mas não esquece de deixar um feedback aí nos comentários ou se preferir manda uma mensagem para o Dados ao Cubo.
Por fim, deixo algumas sugestões de conteúdos que você pode encontrar no Dados ao Cubo, sempre falando sobre o mundo dos dados.
Finalizo com um convite para você ser Parceiro de Publicação Dados ao Cubo e escrever o próximo artigo, compartilhando conhecimento para toda a comunidade de dados. Não esqueça de assinar a nossa Newsletter para ficar por dentro de todas as novidades.
Programador e cozinheiro. Formado pela Universidade Federal do Piauí e com um mestrado (interrompido) pela UFRGS. Com uma grande sede de conhecimento, está sempre se perguntando os porquês e tentando dar o melhor naquilo que faz. Desde pequeno diz que vai ser cientista, seja da computação, de dados ou na cozinha. O conhecimento é a única esperança.
“Um homem não é outra coisa senão o que faz de si mesmo.” Sartre
Fala Galera do mundo dos dados, hora de manipular dados no MongoDB com Python. Dessa…
Fala Galera do mundo dos dados, hora de manipular dados no Cassandra com Python. Dessa…
Fala galera do mundo dos dados, hoje é dia de aprender a função Select do Spark.…
Fala galera do mundo dos dados, hoje é dia de transformar consultas SQL em visualizações…
Fala galera do mundo dos dados, dando continuidade às consultas de banco de dados com…
Fala galera do mundo dos dados, hora de conhecer os bancos de dados NoSQL com…