Você está na página 1de 5

Álgebra Linear

Caio Marques de Assis


Marcello Campos
6 de novembro de 2022

Resumo
O código feito é usado para descobrir se irá chover no dia seguinte ao
disponibilizado na entrada do programa, baseado nas informações oferecidas
pelo banco de dados dos arquivos disponibilizados (weatherAUS_training.csv e
weatherAUS_testing-alunos.csv). Utilizando como saída = 1 (vai chover no dia
seguinte) ou saída = 0 (não vai chover no dia seguinte). Utilizando como
método de cálculos, a técnica dos mínimos quadrados, como fórmula base
Y=Ax.

Introdução
Foi calculado utilizar o arquivo “weatherAUS_training.csv” para achar o
x e o arquivo “weatherAUS_testing-alunos.csv” para utilizar como dados base
do cálculo que leva em consideração a soma das multiplicações dos dados com
o x, gerando um Y que se for 0<=Y<0,5 será a opção 0 (não vai chover no dia
seguinte) e se for 0,5<=Y será a opção 1 (vai chover no dia seguinte).

Desenvolvimento do sistema
O sistema foi desenvolvido utilizando a técnica dos mínimos quadrados,
utilizando o cálculo que leva em consideração a soma das multiplicações dos
dados disponibilizados com o x calculado no próprio código com a fórmula
Y=Ax.
Resultado
Resultado disponível ao usar o programa é um Y = 0 ou 1, onde se no
final for encontrado 0<=Y<0,5 será a opção 0 (não vai chover no dia seguinte) e
se for 0,5<=Y será a opção 1 (vai chover no dia seguinte).

Conclusões

Após a conclusão do trabalho, aprendi mais sobre como funciona os


mínimos quadrados e descobri que é possível saber se algo vai acontecer ou
não, com uma base de dados e utilizando a Álgebra Linear.

Referências

Minhas anotações no caderno das aulas de Álgebra Linear na UFRJ e


meus conhecimentos de python aprendidos nas aulas de Computação 1 também
da UFRJ.

Anexo
import numpy as np
import pandas as pd

# Para rodar o programa no seu PC é necessário copiar o local do arquivo onde estão os
dados e substituir a linha
# da variável dados (9° linha) por: dados = pd.read_csv(r"local_do_seu_arquivo").

def calcularMinimosQuadrados():

dados = pd.read_csv(r"D:\Caio\Documentos\UFRJ\2022.2\Álgebra
Linear\Programação\weatherAUS_training.csv")

# Convertendo strings para valores.

dados = dados.replace (dados == "Yes", 1.0, axis=1, inplace=True)


dados = dados.replace (dados == "No", 0.0, axis=1, inplace=True)
dados = dados.replace (dados == "S", 180.0, axis=1, inplace=True)
dados = dados.replace (dados == "W", 270.0, axis=1, inplace=True)
dados = dados.replace (dados == "ESE", 112.5, axis=1, inplace=True)
dados = dados.replace (dados == "ENE", 67.5, axis=1, inplace=True)
dados = dados.replace (dados == "N", 0.0, axis=1, inplace=True)
dados = dados.replace (dados == "WNW", 292.5, axis=1, inplace=True)
dados = dados.replace (dados == "WSW", 247.5, axis=1, inplace=True)
dados = dados.replace (dados == "SW", 225.0, axis=1, inplace=True)
dados = dados.replace (dados == "E", 90.0, axis=1, inplace=True)
dados = dados.replace (dados == "SSW", 202.5, axis=1, inplace=True)
dados = dados.replace (dados == "SSE", 157.5, axis=1, inplace=True)
dados = dados.replace (dados == "SE", 135.0, axis=1, inplace=True)
dados = dados.replace (dados == "NE", 45.0, axis=1, inplace=True)
dados = dados.replace (dados == "NNE", 22.5, axis=1, inplace=True)
dados = dados.replace (dados == "NNW", 337.5, axis=1, inplace=True)
dados = dados.replace (dados == "NW", 315.0, axis=1, inplace=True)

# Ax = b
# Analisando a matriz "dados", temos que a nossa matriz A será as 23 primeiras colunas da
matriz dados, portanto, estamos
# trabalhando no R23. A ultima coluna é o resultado da combinação das 23 primeiras
colunas, portanto, será o nosso vetor b.

b = dados['RainTomorrow']

# Analisando os dados da matriz A, podemos observar que, para os dias que choveram e os
dias que não choveram, podemos
# desconsiderar as colunas "Date"; "Location"; "WindGustDir"; "WindGustSpeed";
"RainTomorrow", devido o local dos testes sempre será Sydney
# e tanto a data, quanto os valores da direção e da velocidade não influênciam na conta e
que o "RainTomorrow" será nosso y. Logo iremos
# trabalhar no R18.

dados.drop('Date', axis=1, inplace=True)


dados.drop('Location', axis=1, inplace=True)
dados.drop('WindGustDir', axis=1, inplace=True)
dados.drop('WindGustSpeed', axis=1, inplace=True)
dados.drop('RainTomorrow', axis=1, inplace=True)
A = np.asarray(dados)
transpostaB = np.asarray([b])

# Vamos obter a matriz A transposta para podermos resolver a Equação Normal (A^t * A *
x = A^t * B)

transpostaA = A.T
B = transpostaB.T
R = transpostaA @ A

# Apos isso, temos:


# R * x = transpostaA * B
# Multiplicando R^-1 de ambos os lados, com a intenção de isolar x, visto que M * M^-1 =
I, temos que
# x = R^-1 * transpostaA * B
# Com isso, obtemos os valores das variaveis que precisamos.

inversaR = np.linalg.inv(R)
x = inversaR @ transpostaA @ B
x = list(np.float_(x))

# Vamos obter a matriz A transposta para podermos resolver a Equação Normal (A^t * A *
x = A^t * B).

transpostaA = A.T
B = transpostaB.T
R = transpostaA @ A

# Para usar na conta final devemos usar os dados deste próximo arquivo, logo teremos:

# Para rodar o programa no seu PC é necessário copiar o local do arquivo onde estão os
dados e substituir a linha
# da variável dados (77° linha) por: dados = pd.read_csv(r"local_do_seu_arquivo").

dados2 = pd.read_csv(r"D:\Caio\Documentos\UFRJ\2022.2\Álgebra
Linear\Programação\weatherAUS_testing-alunos.csv")

# Convertendo strings para valores.

dados2 = dados2.replace (dados2 == "Yes", 1.0, axis=1, inplace=True)


dados2 = dados2.replace (dados2 == "No", 0.0, axis=1, inplace=True)
dados2 = dados2.replace (dados2 == "S", 180.0, axis=1, inplace=True)
dados2 = dados2.replace (dados2 == "W", 270.0, axis=1, inplace=True)
dados2 = dados2.replace (dados2 == "ESE", 112.5, axis=1, inplace=True)
dados2 = dados2.replace (dados2 == "ENE", 67.5, axis=1, inplace=True)
dados2 = dados2.replace (dados2 == "N", 0.0, axis=1, inplace=True)
dados2 = dados2.replace (dados2 == "WNW", 292.5, axis=1, inplace=True)
dados2 = dados2.replace (dados2 == "WSW", 247.5, axis=1, inplace=True)
dados2 = dados2.replace (dados2 == "SW", 225.0, axis=1, inplace=True)
dados2 = dados2.replace (dados2 == "E", 90.0, axis=1, inplace=True)
dados2 = dados2.replace (dados2 == "SSW", 202.5, axis=1, inplace=True)
dados2 = dados2.replace (dados2 == "SSE", 157.5, axis=1, inplace=True)
dados2 = dados2.replace (dados2 == "SE", 135.0, axis=1, inplace=True)
dados2 = dados2.replace (dados2 == "NE", 45.0, axis=1, inplace=True)
dados2 = dados2.replace (dados2 == "NNE", 22.5, axis=1, inplace=True)
dados2 = dados2.replace (dados2 == "NNW", 337.5, axis=1, inplace=True)
dados2 = dados2.replace (dados2 == "NW", 315.0, axis=1, inplace=True)

# Mais uma vez vamos desconsiderar as colunas "Date"; "Location"; "WindGustDir";


"WindGustSpeed",pois não influênciam na conta.
# Logo iremos trabalhar no R18.

dados2.drop('Date', axis=1, inplace=True)


dados2.drop('Location', axis=1, inplace=True)
dados2.drop('WindGustDir', axis=1, inplace=True)
dados2.drop('WindGustSpeed', axis=1, inplace=True)

# Agora vamos substituir os dados obtidos no modelo proposto e resolver o cálculo dos
mínimos quadrados:

y = dados2[0]*x[0] + dados2[1]*x[1] + dados2[2]*x[2] + dados2[3]*x[3] + dados2[4]x[4]


+ dados2[5]x[5] + dados2[6]*x[6] + dados2[7]*x[7] + dados2[8]*x[8] +\
dados2[9]*x[9] + dados2[10]*x[10] + dados2[11]*x[11] + dados2[12]*x[12] +
dados2[13]x[13] + dados2[14]x[14] + dados2[15]*x[15] + dados2[16]*x[16] +\
dados2[10]*x[10] + dados2[18]*x[18]

# Agora, vamos comparar o valor obtido em y para ver se está mais perto de 0 (não vai
chover no dia seguinte) ou de 1 (vai chover no dia seguinte):
# Lembrando que o y é igual ao "RainTomorrow".

if y <= 0 or 0 < y < 0.5:


print("Não vai chuver no dia seguinte.")
else:
print("Vai chuver no dia seguinte.")

print(calcularMinimosQuadrados())

Observação
O código também foi disponibilizado em formato .py para teste, no email
enviado.

Você também pode gostar