-
Notifications
You must be signed in to change notification settings - Fork 0
/
util.py
134 lines (111 loc) · 3.37 KB
/
util.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
# -*- coding: utf-8 -*-
# util.py
"""
@author: Eduardo Galvani Massino
Número USP: 9318532
"""
import numpy as np
from scipy.stats import truncnorm
# função sigmoid, a ativação mais clássica
def sigmoid(x):
'''(float) -> float'''
return 1.0 / (1.0 + np.exp(-x))
# derivada da função sigmóide
def der_sigmoid(x):
'''(float) -> float'''
sig = sigmoid(x)
return sig * (1 - sig)
def tanh(x):
'''(float) -> float'''
return 2*sigmoid(2*x) - 1
def der_tanh(x):
'''(float) -> float'''
tan = tanh(x)
return 1 - tan*tan
def relu(x):
'''(float) -> float'''
return max(0, x)
def der_relu(x):
'''(float) -> float'''
return 1 if x >= 0 else 0
# parâmetro de vazamento
leaky = 1.0/5.5
def l_relu(x):
'''(float) -> float'''
return x if x >= 0 else leaky*x
def der_l_relu(x):
'''(float) -> float'''
return 1 if x >= 0 else leaky
def elu(x):
'''(float) -> float'''
a = 1
if x >= 0:
return x
else:
return a*(np.exp(x) - 1)
def der_elu(x):
'''(float) -> float'''
a = 1
if x >= 0:
return 1
else:
return elu(x) + a
# Função de ativação linear
def idem(x):
return x
# Derivada constante da ativação linear
def one(x):
return 1
# função de ativação Smooth ReLU
# a sua derivada é a função Sigmoid
def s_relu(x):
'''(float) -> float'''
return np.log(1 + np.exp(x))
# Função que retorna um gerador truncado da distribuição normal
def get_normal_truncada(mean=0, sd=0.3, low=-1, up=1):
'''(float, float, float, float) -> Object
Recebe média, desvio-padrão, limite inferior e limite superior
para retornar um gerador de números aleatórios seguindo uma
distribuição normal truncada, com os limites setados pelos parâmetros.
Uso >> X = get_normal_truncada()
>> X.rvs(10)
Retorna 10 amostras para a variável aleatória definida com os
parâmetros-padrão acima informados.
'''
return truncnorm((low-mean)/sd, (up-mean)/sd, loc=mean, scale=sd)
# Testa se o código está sendo executado no Jupyter ou não
def is_notebook():
try:
shell = get_ipython().__class__.__name__
if shell == 'ZMQInteractiveShell':
return True # Jupyter notebook or qtconsole
elif shell == 'TerminalInteractiveShell':
return False # Terminal running IPython
else:
return False # Other type (?)
except NameError:
return False # Probably standard Python interpreter
# normalização de vetores para o intervalo [0, 1]
def normalizar(dados):
'''(list(list)) -> None
Faz a normalização dos dados, que ficarão de forma que
o minimo = 0 e o maximo = 1.
Antes disso removo os NAN do vetor
'''
if is_notebook():
from tqdm.notebook import tqdm
else:
from tqdm import tqdm
for col_num in range(len(dados[0])):
for row_num in range(len(dados)):
if np.isnan(dados[row_num][col_num]):
dados[row_num, col_num] = 0
for col_num in tqdm(range(len(dados[0]))):
coluna = [row[col_num] for row in dados]
maximo = max(coluna)
minimo = min(coluna)
amplitude = maximo - minimo
if amplitude == 0:
amplitude = 1
for row_num in range(len(dados)):
dados[row_num, col_num] = (dados[row_num, col_num] - minimo) / amplitude