Buscar

AV2 - Modelos de Ling de Programação

Prévia do material em texto

QUESTÕES DISCURSIVAS
Questão 1 (1,0 ponto)
Seja a BNF abaixo:
<list> ::= <element><list> | <element>
<element> ::= <letter><digit>
<letter> ::= A | B
<digit> ::= 1|2
Implemente um programa em Python com a utilização da biblioteca re (Regex), ou nltk que
represente a BNF. Além do programa, mostre a saída do programa para as seguintes entradas:
a) A1
b) A2B1
Desenvolvimento:
import nltk
from nltk import CFG
grammar = CFG.fromstring("""
list -> element list| element
element -> letter digit
letter -> "A" | "B"
digit -> "1" | "2"
""")
tokens = str(input())
tokens = list(tokens)
cp = nltk.ChartParser(grammar)
try:
for tree in cp.parse(tokens):
print(tree)
except:
print('Não reconhecido pela BNF!')
Letra a) Entrada A1:
(list (element (letter A) (digit 1)))
Letra b) Entrada A2B1:
(list
(element (letter A) (digit 2))
(list (element (letter B) (digit 1))))
Questão 2 (2,0 pontos)
Implemente um programa em Python que receba uma lista de nomes (use lista = [‘casa’, ‘DIA’,
‘liVRO’, ‘dado’])e utilizando as funções lambda, map e filter faça:
a. Listar todas as palavras que iniciem com uma determinada letra. Por exemplo, com ‘d’,
não distinguir entre maiúsculas e minúsculas, no caso vai exibir: [‘DIA’, ‘dado’]
Resposta:
lista = [‘casa’, ‘DIA’, ‘liVRO’, ‘dado’]
list(filter((lambda x: re.match(r'^[Dd]', x)),lista))
b. Transformar as palavras de tal modo que apenas a primeira letra seja maiúscula. No
caso do exemplo, vai exibir: [‘Casa’, ‘Dia’, ‘Livro’, ‘Dado’]
Resposta:
lista = [‘casa’, ‘DIA’, ‘liVRO’, ‘dado’]
list(map(lambda x: x.capitalize(),lista))
Questão 3 (2,0 pontos)
Sejam os conjuntos de dados, fornecidos pelo Ministério da Saúde do Brasil
(https://covid.saude.gov.br/), que se referem aos casos acumulados de coronavírus no estado
do Rio de Janeiro do período de 01/março/2020 a 26/abril/2020:
casos_acumulados= [1,1,2,3,3,8,13,16,16,22,24,31,33,45,65,109,119,186,233,305,370,42
1,493,558,600,657,708,832,99,1074,1246,1394,1461,1688,1938,2216,2464,2607,2855,3231,3
410,3743,3944,4349,4543,4765,4899,5306,5552,6172,6282,6828,7111]
Usando a Regressão Polinomial, desenvolva um programa em Python
para estimar:
a. A quantidade de casos acumulados no dia 27/abril/2020. Justifique sua resposta. (1,0
Ponto)
b. Supondo que quantidade de casos acumulados do dia 25/abril/2020 tenha se perdido, faça
a estimativa da mesma. Justifique sua resposta. (1,0 Ponto)
Desenvolvimento:
Primeiramente para gerar o modelo foi preciso corrigir os dados informados no enunciado, já
que na 29° posição da lista há um valor inconsistente (99) e os dados informados começam no
dia 05/03/2020 e não no dia 01/03/2020. Para corrigir a lista acessei o site do Ministério da
Saúde e baixei o arquivo CSV para realizar as correções. O valor correto no dia 02/04/2020 é
992.
Código:
import numpy as np
import matplotlib.pyplot as plt
import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import PolynomialFeatures
from sklearn.linear_model import LinearRegression
from sklearn.metrics import mean_absolute_error, mean_squared_error
https://covid.saude.gov.br/
y=[1,1,2,3,3,8,13,16,16,22,24,31,33,45,65,109,119,186,233,305,370,421,493,558,600,657,708,
832,992,1074,1246,1394,1461,1688,1938,2216,2464,2607,2855,3231,3410,3743,3944,4349,4
543,4765,4899,5306,5552,6172,6282,6828,7111]
y = np.array(y).reshape(-1,1)
X = np.arange(len(y)).reshape(-1,1)
forecast = np.arange(len(y) + 10).reshape(-1,1)
X_train, X_test, y_train, y_test = train_test_split(X, y, train_size = 0.95, shuffle = False)
poly = PolynomialFeatures(degree=3)
X_train_poly = poly.fit_transform(X_train)
X_test_poly = poly.transform(X_test)
regressor = LinearRegression()
regressor.fit(X_train_poly, y_train)
poly_test_pred = regressor.predict(X_test_poly)
poly_pred_all = regressor.predict(X_train_all)
plt.figure(figsize=(12,6))
plt.plot(forecast[:-10], y, color='red')
plt.plot(forecast, poly_pred_all, linestyle='dashed')
plt.title('Casos de COVID-19 - Rio de Janeiro')
plt.xlabel('Dias desde 01/03/2020')
plt.ylabel('N° de Casos')
plt.legend(['Casos Reais', 'Predições']);
a) No dia 27 de abril, o número de casos acumulados previstos é de 7794, segundo o
modelo. O número real para o dia 27 foi de 7944 casos, o que dá um erro de ~1,88%.
Resultados do modelo:
MAE (Mean Absolute Error): 204.87
RMSE (Root Mean Square Error): 14.31
b) Retirando o dia 25 de abril e tentando prever os dias 25, 26 e 27, o modelo previu 7057
casos acumulados no dia 25, 7492 no dia 26 e 7943 no dia 27, o que dá um erro ~1%,
sendo uma previsão quase exata do dia 27.
Resultados do modelo:
MAE: 241.89
RMSE: 15.55
Outro teste realizado foi utilizar o valor previsto para o dia 25 (7057) e o valor real do
dia 26 (7111) para prever o dia 27. O resultado foi de 7793, muito parecido com o
primeiro exemplo na letra a), dando um erro próximo de 1,9%.
Resultados do modelo:
MAE: 206.55
RMSE: 14.37
Questão 4 (1,0 ponto)
Seja a Backus-Naur Form (BNF):
<exp> ::= <exp> + <exp> | <term>
<term> ::= <term> * <term> | <factor>
<factor> ::= ( <exp> ) | <digit>
<digit> ::= 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9
Implemente um programa em Python com a utilização da biblioteca re (Regex), ou nltk que
represente a BNF. Além do programa, mostre a saída do programa para as seguintes entradas:
a. 1+3*5
b. (1+3)*5
from nltk import CFG
import nltk
grammar2 = CFG.fromstring("""
exp -> exp "+" exp | term
term -> term "*" term | factor
factor -> "("exp")" | digit
digit -> "0" | "1" | "2" |"3" |"4" |"5" |"6" |"7" |"8" |"9"
""")
tokens2 = str(input())
tokens2 = list(tokens2)
cp = nltk.ChartParser(grammar2)
try:
for tree in cp.parse(tokens2):
print(tree)
except:
print('Não reconhecido pela BNF!')
Letra a) 1+3*5
(exp
(exp (term (factor (digit 1))))
+
(exp (term (term (factor (digit 3))) * (term (factor (digit 5))))))
Letra b) (1+3)*5
(exp
(term
(term
(factor
(
(exp
(exp (term (factor (digit 1))))
+
(exp (term (factor (digit 3)))))
)))
*
(term (factor (digit 5)))))
Questão 5 (2,0 pontos)
Uma forma de representar números é através do cálculo Lambda, como abaixo:
0 ≡ λs.(λz.z)
1 ≡ λsz.s(z)
2 ≡ λsz.s(s(z))
3 ≡ λsz.s(s(s(z)))
A função “sucessor” de um número é obtida por:
S ≡ λwyx.y(wyx)
Nesse sentido, aplique, DETALHADAMENTE, a função “sucessor” para obter S1.
S1 ≡ ??
(λwyx.y(wyx)) (λsz.s(z)) ---- Função sucessor e função de 1;
λyx.y((λsz.s(z))yx) ---- Substituindo w pela função de 1;
λyx.y((λz.y(z))x) ---- Substituindo s por y;
λyx.y(y(x)) ---- Substituindo z por x;
Substituindo y por s e x por z:
λsz.s(s(z)) ≡ 2

Continue navegando