Artigos

1.4: 04 Vetores aleatórios e independência - Matemática


1.4: 04 Vetores aleatórios e independência - Matemática

Problema 500

10 perguntas sobre matrizes não singulares, matrizes invertíveis e vetores linearmente independentes.

O questionário foi elaborado para testar sua compreensão das propriedades básicas desses tópicos.

Você pode fazer o teste quantas vezes quiser.

As soluções serão dadas após a conclusão de todos os 10 problemas.
Clique no Ver pergunta botão para ver as soluções.

por Yu & middot Publicado em 19/06/2017 e middot Última modificação em 23/08/2017


Problema 704

Deixe $ A = começar
2 & 4 & 6 & 8 \
1 ſ & 0 & 5 \
1 & 1 & 6 & 3
fim$.
(uma) Encontre uma base para o espaço nulo de $ A $.

(b) Encontre uma base para o espaço de linha de $ A $.

(c) Encontre uma base para o intervalo de $ A $ que consiste nos vetores de coluna de $ A $.

(d) Para cada vetor de coluna que não é um vetor de base obtido na parte (c), expresse-o como uma combinação linear dos vetores de base para o intervalo de $ A $.


1.4: 04 Vetores aleatórios e independência - Matemática

Na vida real, geralmente precisamos lidar com mais de uma variável aleatória. Por exemplo, se você estudar as características físicas de pessoas em uma determinada área, você pode escolher uma pessoa aleatoriamente e, em seguida, olhar para seu peso, altura, etc. O peso da pessoa escolhida aleatoriamente é uma variável aleatória, enquanto seu / sua altura é outra. Não só precisamos estudar cada variável aleatória separadamente, mas também precisamos considerar se há dependência (ou seja, correlação) entre eles. É verdade que uma pessoa mais alta tem maior probabilidade de ser mais pesada ou não? As questões de dependência entre várias variáveis ​​aleatórias serão estudadas em detalhes mais tarde, mas aqui gostaríamos de falar sobre um cenário especial onde duas variáveis ​​aleatórias são independente.

O conceito de variáveis ​​aleatórias independentes é muito semelhante a eventos independentes. Lembre-se, dois eventos $ A $ e $ B $ são independentes se tivermos $ P (A, B) = P (A) P (B) $ (lembre-se de vírgula significa e, ou seja, $ P (A, B) = P (A textrm B) = P (A cap B) $). Da mesma forma, temos a seguinte definição para variáveis ​​aleatórias discretas independentes.

Intuitivamente, duas variáveis ​​aleatórias $ X $ e $ Y $ são independentes se saber o valor de uma delas não altera as probabilidades da outra. Em outras palavras, se $ X $ e $ Y $ são independentes, podemos escrever $ P (Y = y | X = x) = P (Y = y), textrm x, y. $ Semelhante a eventos independentes, às vezes é fácil argumentar que duas variáveis ​​aleatórias são independentes simplesmente porque não têm nenhuma interação física entre si. Aqui está um exemplo simples: Eu jogo uma moeda $ 2N $ vezes. Seja $ X $ o número de caras que observo nos primeiros lançamentos de $ N $ e seja $ Y $ o número de caras que observo nos segundos lançamentos de $ N $. Uma vez que $ X $ e $ Y $ são o resultado de lançamentos independentes de moedas, as duas variáveis ​​aleatórias $ X $ e $ Y $ são independentes. Por outro lado, em outros cenários, pode ser mais complicado mostrar se duas variáveis ​​aleatórias são independentes.

Jogo uma moeda duas vezes e defino $ X $ como o número de caras que observo. Em seguida, jogo a moeda mais duas vezes e defino $ Y $ como o número de caras que observo desta vez. Encontre $ P bigg ((X 1) bigg) $.


Nomes

Uma grande característica dos vetores de R é que cada elemento pode receber um nome. Rotular os elementos geralmente pode tornar seu código muito mais legível. Você pode especificar nomes ao criar um vetor no formulário nome = valor . Se o nome de um elemento for um nome de variável válido, ele não precisa ser colocado entre aspas. Você pode nomear alguns elementos de um vetor e deixar outros em branco:

Você pode adicionar nomes de elementos a um vetor após sua criação usando a função de nomes:

Esta função de nomes também pode ser usada para recuperar os nomes de um vetor:

Se um vetor não tiver nomes de elementos, a função de nomes retornará NULL:


Discussão

Uma situação frequente no aprendizado de máquina é ter uma grande quantidade de dados, no entanto, a maioria dos elementos nos dados são zeros. Por exemplo, imagine uma matriz onde as colunas são todos os filmes do Netflix, as linhas são todos os usuários do Netflix e os valores são quantas vezes um usuário assistiu aquele filme específico. Essa matriz teria dezenas de milhares de colunas e milhões de linhas! No entanto, como a maioria dos usuários não assiste à maioria dos filmes, a grande maioria dos elementos seria zero.

Matrizes esparsas armazenam apenas elementos diferentes de zero e assumem que todos os outros valores serão zero, levando a economias computacionais significativas. Em nossa solução, criamos uma matriz NumPy com dois valores diferentes de zero e a convertemos em uma matriz esparsa. Se visualizarmos a matriz esparsa, podemos ver que apenas os valores diferentes de zero são armazenados:

Existem vários tipos de matrizes esparsas. No entanto, em linha esparsa comprimida As matrizes (CSR), (1, 1) e (2, 0) representam os índices (indexados por zero) dos valores diferentes de zero 1 e 3, respectivamente. Por exemplo, o elemento 1 está na segunda linha e na segunda coluna. Podemos ver a vantagem das matrizes esparsas se criarmos uma matriz muito maior com muito mais elementos zero e, em seguida, compararmos esta matriz maior com a nossa matriz esparsa original:

Como podemos ver, apesar do fato de termos adicionado muito mais elementos zero na matriz maior, sua representação esparsa é exatamente a mesma que nossa matriz esparsa original. Ou seja, a adição de zero elementos não alterou o tamanho da matriz esparsa.

Conforme mencionado, existem muitos tipos diferentes de matrizes esparsas, como coluna esparsa compactada, lista de listas e dicionário de chaves. Embora uma explicação dos diferentes tipos e suas implicações esteja fora do escopo deste livro, é importante notar que, embora não haja "melhor" tipo de matriz esparsa, existem diferenças significativas entre eles e devemos estar conscientes do motivo de estarmos escolhendo um tipo sobre o outro.


1. Introdução

Medindo e testando a dependência entre | $$ | e | $$ | é um problema fundamental nas estatísticas. A correlação de Pearson é talvez a primeira e a mais conhecida quantidade para medir o grau de dependência linear entre duas variáveis ​​aleatórias univariadas. Extensões incluindo rho de Spearman (1904), tau de Kendall (1938) e aquelas devidas a Hoeffding (1948) e Blum (1961) podem ser usadas para medir a dependência não linear sem condições de momento.

O teste de independência tem aplicações importantes. Dois exemplos de pesquisas genômicas estão testando se dois grupos de genes estão associados e examinando se certos fenótipos são determinados por genótipos específicos. Na pesquisa em ciências sociais, os cientistas estão interessados ​​em compreender as associações potenciais entre características psicológicas e fisiológicas. Wilks (1935) introduziu um teste paramétrico baseado em | $ | < mbox <$ Sigma $ >> _ <,> | / (| < mbox <$ Sigma $ >> _| | < mbox <$ Sigma $ >> _|) $ | ⁠, onde | $ < mbox <$ Sigma $ >> _ <,> = < mbox><(<^ < rm T >>,<^ < rm T >>) <^ < rm T >> > in mathbb^ <(p + q) times (p + q)> $ | ⁠, | $ < mbox <$ Sigma $ >> _= < mbox>() in mathbb^

$ | e | $ < mbox <$ Sigma $ >> _ = < mbox>() in mathbb^$ | ⁠. Ao longo de | $ < mbox <$ Sigma $ >> _ = < mbox>() $ | representa a matriz de covariância de | $$ | e | $ | < mbox <$ Sigma $ >> _| $ | representa o determinante de | $ < mbox <$ Sigma $ >> _$ | ⁠. Hotelling (1936) sugeriu o coeficiente de correlação canônica, que busca | $ < mbox <$ alpha $ >> in mathbb^ p $ | e | $ < mbox <$ beta $ >> in mathbb^ q $ | de modo que a correlação de Pearson entre | $ < mbox <$ alpha $ >> <^ < rm T >>$ | e | $ < mbox <$ beta $ >> <^ < rm T >>$ | é maximizado. Tanto o teste de Wilks quanto a correlação canônica podem ser usados ​​para testar a independência entre | $$ | e | $$ | quando eles seguem distribuições normais. Extensões não paramétricas do teste de Wilks foram propostas por Puri & amp Sen (1971), Hettmansperger & amp Oja (1994), Gieser & amp Randles (1997), Taskinen et al. (2003) e Taskinen et al. (2005). Esses testes podem ser usados ​​para testar a independência entre | $$ | e | $$ | quando seguem distribuições elipticamente simétricas, mas são inaplicáveis ​​quando as suposições de normalidade ou elipticidade são violadas ou quando as dimensões de | $$ | e | $$ | exceder o tamanho da amostra. Além disso, os testes multivariados de independência baseados em classificação são ineficazes para testar a dependência não monótona (Székely et al., 2007).

A correlação de distância (Székely et al., 2007) pode ser usada para medir e testar a dependência entre | $$ | e | $$ | em dimensões arbitrárias sem assumir normalidade ou elipticidade. Desde que | $ E ( || +| |) & lt infty $ | ⁠, a correlação de distância entre | $$ | e | $$ | ⁠, denotado por | $ < small < rm DC >> (,) $ | ⁠, não é negativo e é igual a zero se e somente se | $$ | e | $$ | são independentes. Ao longo, definimos | $ || = (<^< m T>>) ^ <1/2> $ | para um vetor | $$ | ⁠. Székely & amp Rizzo (2013) observaram que a correlação de distância pode ser adversamente afetada pelas dimensões de | $$ | e | $$ | ⁠, e propôs um estimador imparcial dele quando | $$ | e | $$ | são altamente dimensionais. Neste artigo, demonstraremos que a correlação de distância pode ser menos eficiente na detecção de dependência não linear quando a suposição | $ E ( || +| |) & lt infty $ | é violado. Para remover essa condição de momento, Benjamini et al. (2013) sugeriram o uso de ranks de distâncias, mas isso envolve a seleção de vários parâmetros de sintonia, cuja escolha é um problema em aberto. As propriedades assintóticas de um teste baseado em classificações de distâncias também precisam ser investigadas.

Propomos o uso de correlação de projeção para caracterizar a dependência entre | $$ | e | $$ | ⁠. A correlação de projeção projeta primeiro os vetores aleatórios multivariados em uma série de variáveis ​​aleatórias univariadas e, em seguida, detecta a dependência não linear calculando a correlação de Pearson entre as variáveis ​​aleatórias univariadas dicotomizadas. A correlação de projeção entre | $$ | e | $$ | ⁠, denotado por | $ < small < rm PC >> (,) $ | ⁠, é não negativo e igual a zero se e somente se | $$ | e | $$ | são independentes, por isso é geralmente aplicável como um índice para medir o grau de dependência não linear sem condições de momento, normalidade ou elipticidade (Tracz et al., 1992). O teste de correlação de projeção para independência é consistente com todas as alternativas de dependência. A correlação de projeção é livre de parâmetros de ajuste e é invariante para a transformação ortogonal. Devemos mostrar que o estimador de amostra de correlação de projeção é | $ n $ | -consistente se | $$ | e | $$ | são independentes e root- | $ n $ | -consistente caso contrário. Conduzimos estudos de Monte Carlo para avaliar o desempenho de amostra finita do teste de correlação de projeção. Os resultados indicam que a correlação de projeção é menos sensível às dimensões de | $$ | e | $$ | do que a correlação de distância e até mesmo sua versão melhorada (Székely & amp Rizzo, 2013), e é mais poderoso do que a correlação de distância e classificações de distâncias, especialmente quando as dimensões de | $$ | e | $$ | são relativamente grandes ou as condições de momento exigidas pela correlação de distância são violadas.


Devemos considerar os dois componentes de um vetor, a saber, direção e magnitude, ao usar a adição de vetores.

Lembre-se de que os dois vetores com a mesma magnitude e direção podem ser adicionados como escalares.

Neste tópico, exploraremos métodos gráficos e matemáticos de adição vetorial, incluindo:

  1. Adição de vetor usando a regra de ponta a ponta
  2. Adição de vetor usando o método de paralelogramo
  3. Adição de vetor usando os componentes

Adição de vetor usando a regra de ponta a ponta

A adição de vetores pode ser realizada usando o famoso método cabeça-a-cauda. De acordo com esta regra, dois vetores podem ser somados colocando-os juntos de forma que a cabeça do primeiro vetor & # 8217s se junte à cauda do segundo vetor. O vetor de soma resultante pode então ser obtido juntando a cauda do primeiro vetor & # 8217s à cabeça do segundo vetor. Às vezes, isso também é conhecido como o método do triângulo de adição de vetores.

A adição de vetores usando a regra de ponta a ponta é ilustrada na imagem abaixo. Os dois vetores P e Q são adicionados usando o método cabeça-a-cauda, ​​e podemos ver o triângulo formado pelos dois vetores originais e o vetor soma.

Primeiro, os dois vetores P e Q são colocados juntos de modo que a cabeça do vetor P conecta a cauda do vetor Q. Em seguida, para encontrar a soma, um vetor resultante R é desenhado de tal forma que conecta a cauda de P para a cabeça de Q.

Matematicamente, a soma, ou vetor resultante, R, na imagem abaixo pode ser expressa como:

R = P + Q

Adição de vetor usando o método de paralelogramo

Para entender a adição de vetores usando o método do paralelogramo, consideraremos e explicaremos a figura abaixo.

Primeiro, desenhe os vetores fornecidos, UMA e B, ter o mesmo ponto inicial mostrado na imagem abaixo. Em seguida, desenhe um paralelogramo usando as cópias dos vetores dados.

Em segundo lugar, desenhe a cópia do vetor B chamado B ’, e coloque-o paralelo ao vetor B para conectar para a cabeça do primeiro vetor, UMA. Da mesma forma, desenhe uma cópia do vetor UMA chamado UMA', e coloque-o paralelo a A para que sua cauda se conecte com a cabeça do vetor B.

Por fim, a resultante dos dois vetores, que é igual à soma dos vetores UMA e B, será o paralelogramo & # 8217s diagonal. Pode ser desenhado juntando o ponto inicial dos dois vetores UMA e B para a cabeça dos vetores UMA' e B ’.

Em resumo, três etapas são necessárias para realizar a adição do vetor usando o método do paralelogramo:

Etapa 1: coloque os dois vetores de modo que tenham um ponto de partida comum

Etapa 2: desenhe e complete o paralelogramo usando cópias dos dois vetores originais

Etapa 3: a diagonal do paralelogramo é então igual à soma dos dois vetores

Adição de vetor usando os componentes

Como sabemos, os vetores dados em coordenadas cartesianas podem ser decompostos em suas componentes horizontal e vertical. Por exemplo, um vetor P em um ângulo Φ, conforme mostrado na imagem abaixo, pode ser decomposto em seus componentes como:

Px, que representa o componente do vetor P ao longo do eixo horizontal (eixo x), e

Py, que representa o componente do vetor P ao longo do eixo vertical (eixo y).

Pode-se ver que os três vetores formam um triângulo retângulo e que o vetor P pode ser expresso como:

P = Px+ Py

Matematicamente, os componentes de um vetor também podem ser calculados usando a magnitude e o ângulo do vetor dado.

Px = P cos Φ

Py = P sin Φ

Além disso, também podemos determinar o vetor resultante se suas componentes horizontal e vertical forem fornecidas. Por exemplo, se os valores de Pxe Pysão fornecidos, então podemos calcular a magnitude e o ângulo do vetor P da seguinte forma:

| P | = (Px ) ^ 2 + (Py)^2

E o ângulo pode ser encontrado como:

Assim, em resumo, podemos determinar um vetor resultante se seus componentes forem dados. Alternativamente, se o próprio vetor é dado, podemos determinar os componentes usando as equações acima.

Da mesma forma, se os vetores são expressos em pares ordenados (vetores coluna), podemos realizar a operação de adição nos vetores usando seus componentes. Por exemplo, considere os dois vetores M e N dado como:

Realizar a adição de vetores nos dois vetores é equivalente a adicionar os dois vetores & # 8217 respectivos componentes x e y. Isso produz o vetor resultante S:

S = M + N

S = (m1 + n1, m2 + n2).

Pode ser escrito explicitamente como:

A magnitude do vetor resultante S pode ser calculado como:

| S | = (Sx ) ^ 2 + (Sy)^2

E o ângulo pode ser calculado como:


Combinando o Codificador Variacional no Modelo

Para lidar com o problema de gerar um conjunto diversificado de exemplos, combinei um Variation Autoencoder (VAE) à nossa rede. Não vou explicar os detalhes do VAE aqui, pois houve ótimos posts sobre eles e uma implementação muito boa do TensorFlow.

A ajuda do VAE faz duas coisas. Em primeiro lugar, eles nos permitem codificar imagem existente em um vetor Z latente muito menor, uma espécie de compressão semelhante. Ele faz isso passando uma imagem pelo rede codificadora, que chamaremos de rede Q, com pesos. E a partir desse vetor latente codificado Z, a rede geradora produzirá uma imagem que será o mais próxima possível da imagem original transmitida, portanto, é um sistema autoencoder. Isso resolve o problema que tínhamos no modelo GAN, pois se o gerador produzisse apenas alguns dígitos, mas não outros dígitos, ele seria penalizado por não estar reproduzindo muitos exemplos no conjunto de treinamento.

Até agora, assumimos que o vetor Z são variáveis ​​gaussianas unitárias independentes simples. Não há garantia de que a rede de codificadores Q codificará imagens de uma imagem de treinamento aleatória X, para produzir valores de Z que pertencem a uma distribuição de probabilidade que podemos reproduzir e desenhar aleatoriamente, como uma gaussiana. Imagine que simplesmente paramos aqui e treinamos este codificador automático como ele é. Não teremos a capacidade de gerar imagens aleatórias, porque não teremos a capacidade de desenhar Z a partir de uma distribuição aleatória. Se extrairmos Z da distribuição gaussiana, só será por acaso que Z se parecerá com algum valor correspondente ao conjunto de treinamento e produzirá imagens que não se parecerão com o conjunto de imagens de outra forma.

A capacidade de controlar o exato distribuição de Z é a segunda coisa que o VAE nos ajudará a fazer, e a principal razão pela qual o artigo do VAE é um jornal tão importante e influente. Além de realizar a função de codificação automática, as variáveis ​​latentes Z geradas a partir da rede Q irão tb têm a característica de serem variáveis ​​aleatórias gaussianas unitárias independentes simples. Em outras palavras, se X for uma imagem aleatória de nosso conjunto de treinamento, pertencente a qualquer distribuição de probabilidade estranha e complicada, a rede Q garantirá que o Z seja construído de forma que P (Z | X) seja um conjunto simples de variáveis ​​aleatórias gaussianas de unidades independentes. E o surpreendente é que essa diferença entre a distribuição de P (Z | X) e a distribuição de uma distribuição gaussiana (eles chamam isso de KL Divergence) podem ser quantificados e minimizados usando gradiente descendente usando algumas máquinas matemáticas elegantes, injetando ruído gaussiano na camada de saída da rede Q. Este modelo VAE pode ser treinado minimizando a soma do erro de reconstrução e do erro de divergência KL usando gradiente descendente, na Equação 10 do artigo VAE.

Nosso modelo CPPN final combinado com GAN + VAE:

Em vez de ficar com o modelo VAE puro, eu queria combinar VAE com GAN, porque descobri que se eu ficasse apenas com VAE, as imagens que ele gerava no final pareciam muito borradas e desinteressantes quando explodíamos a imagem. Acho que isso se deve ao termo de erro calculado a partir de erros de pixel, e esse é um problema conhecido do modelo VAE. No entanto, ainda é útil para a nossa causa, e se formos capazes de combiná-lo com GAN, poderemos treinar um modelo que será capaz de reproduzir cada dígito e parecer mais realista com a rede discriminadora atuando como um final filtro.

Treinar este modelo combinado exigirá alguns ajustes em nosso algoritmo existente, porque também precisaremos treinar para otimizar o erro do VAE. Observe que ajustaremos e ao otimizar para G_loss e VAE_loss.

Algoritmo CPPN + GAN + VAE para 1 época de treinamento:

O truque aqui é estruturar e equilibrar a estrutura de todas as sub-redes, de modo que G_loss e D_loss gire em torno de 0,69, de modo que eles estejam tentando melhorar mutuamente lutando entre si ao longo do tempo e melhorando na mesma taxa. Além disso, devemos ver o VAE_loss diminuir ao longo do tempo, época por época, enquanto as outras duas redes se enfrentam. É uma espécie de arte negra treinar essas coisas e manter o equilíbrio. O VAE está tentando atravessar uma prancha conectando duas lanchas (G e D) tentando ultrapassar uma à outra.

Depois de treinar o modelo, podemos ver os resultados da alimentação de vetores aleatórios de Z, extraídos da distribuição gaussiana unitária, em nossa rede G, e podemos gerar algumas imagens grandes aleatórias. Vamos ver com o que vamos acabar!

Vetores latentes aleatórios

Podemos gerar algumas grandes amostras aleatórias de nosso modelo treinado em IPython:

Podemos ver como nossa rede de geradores capta qualquer vetor aleatório Z, consistindo de 32 números reais, e gera uma imagem aleatória que se parece com um dígito numérico baseado nos valores de Z.

A próxima coisa que queremos tentar é comparar os exemplos reais MNIST com os auto-codificados. Ou seja, pegue uma imagem MNIST aleatória, codifique a imagem em um vetor latente Z e gere de volta a imagem. Primeiro, geraremos a imagem com as mesmas dimensões do exemplo (26x26) e, em seguida, uma imagem 50 vezes maior (1300x1300) para ver a rede e imaginar como seria o MNIST se fosse muito maior.

Primeiro, desenhamos uma imagem aleatória do MNIST e a exibimos.

Em seguida, codificamos essa imagem em Z.

A partir de Z, geramos uma imagem de reconstrução 26x26.

Também podemos gerar uma imagem de reconstrução muito maior usando o mesmo Z.

A estrutura VAE + GAN atual parece produzir versões nebulosas da imagem MNIST quando as aumentamos, como tentar desenhar algo de fumaça.

Abaixo estão mais comparações de exemplos codificados automaticamente com os originais. Às vezes, a rede comete erros, por isso não é perfeita. Há um exemplo de um zero sendo mal interpretado como um seis e um três ficando totalmente confuso. Você pode tentar gerar suas próprias amostras de escrita e alimentar uma imagem no IPython para ver quais exemplos codificados automaticamente são gerados. Talvez no futuro eu possa fazer uma demonstração em javascript para fazer isso.

Amostras autocodificadas

Conforme discutido anteriormente, o vetor Z latente pode ser interpretado como uma versão codificada compactada de imagens reais, como uma versão não linear do PCA. Embutidos nesses 32 números estão informações que contêm não apenas o dígito que a imagem representa, mas também outras informações, como tamanho, estilo e orientação da imagem. Nem todo mundo escreve da mesma maneira, algumas pessoas escrevem com um loop, ou sem loop, e algumas pessoas escrevem dígitos maiores do que outras, com um traço de caneta mais agressivo. Vemos que o autencoder pode capturar a maioria dessas informações com sucesso e reproduzir uma versão da imagem original. Uma analogia seria uma pessoa olhando para uma imagem e fazendo anotações para descrevê-la em grande detalhe, e então ter outra pessoa reproduzindo a imagem original das anotações.


Exemplos de tarefas

Exemplos de tarefas de avião

Solução: | a | = √ 2 2 + 4 2 = √ 4 + 16 = √ 20 = 2√ 5.

Solução: | a | = √ 3 2 + (-4) 2 = √ 9 + 16 = √ 25 = 5.

Exemplos de tarefas espaciais

Solução: | a | = √ 2 2 + 4 2 + 4 2 = √ 4 + 16 + 16 = √ 36 = 6.

Solução: | a | = √ (-1) 2 + 0 2 + (-3) 2 = √ 1 + 0 + 9 = √ 10.

Exemplos de n tarefas espaciais dimensionais

Solução: | a | = √ 1 2 + (-3) 2 + 3 2 + (-1) 2 = √ 1 + 9 + 9 + 1 = √ 20 = 2√ 5

Solução: | a | = √ 2 2 + 4 2 + 4 2 + 6 2 + 2 2 = √ 4 + 16 + 16 + 36 + 4 = √ 76 = 2√ 19.

Bem-vindo ao OnlineMSchool. O proprietário deste site é o matemático Dovzhyk Mykhailo. Desenhei este site e escrevi toda a teoria matemática, exercícios online, fórmulas e calculadoras.


Assista o vídeo: Capítulo 4 - Parte 1 - Vetores Aleatórios (Novembro 2021).