
💬 Pergunta para a turma: Quem já usou IA hoje sem perceber? Pense no caminho até aqui — autocorretor, filtro de spam, sugestão de rotas, feed de redes sociais...



from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
iris = load_iris()
X = iris.data
y = iris.target
X_train, X_test, y_train, y_test = train_test_split(
X, y, test_size=0.3, random_state=42
)
print(f"Treino: {X_train.shape[0]} amostras")
print(f"Teste: {X_test.shape[0]} amostras")
train_test_split separa aleatoriamente 70% dos dados para treino e 30% para teste. O parâmetro random_state garante reprodutibilidade.from sklearn.tree import DecisionTreeClassifier
from sklearn.metrics import accuracy_score
model = DecisionTreeClassifier()
model.fit(X_train, y_train)
pred = model.predict(X_test)
acc = accuracy_score(y_test, pred)
print(f"Acurácia: {acc:.2%}")
DecisionTreeClassifier por outros algoritmos: RandomForestClassifier, KNeighborsClassifier ou SVC. Cada um tem uma abordagem diferente para aprender padrões. Qual alcança a melhor acurácia?test_size=0.1, 0.2, 0.4 e 0.5. Como o tamanho do conjunto de teste afeta a estabilidade da acurácia? Menos dados de treino prejudicam o modelo?max_depth=2, 3, 5, None. Para KNN, varie n_neighbors. Hiperparâmetros controlam a complexidade do modelo e o equilíbrio entre underfitting e overfitting.

Essas "importâncias" são os pesos (weights) que o neurônio atribui a cada entrada.
resultado = (nota * peso_nota) +
(frequência * peso_freq) +
(participação * peso_part)Em essência, um neurônio artificial segue este fluxo: Entradas → Pesos → Soma Ponderada (+ Bias) → Função de Ativação → Decisão (Saída). Essa simplicidade é a base da complexidade do Deep Learning.
💡 "Uma rede neural é um conjunto de neurônios artificiais que aprendem padrões nos dados ajustando seus pesos para reduzir erros."
import numpy as np
# Entradas (ex: 2 features)
x = np.array([0.5, 0.3])
# Pesos (força das conexões)
w = np.array([0.8, 0.2])
# Bias
b = 0.1
# Soma ponderada + bias
z = np.dot(x, w) + b
# Função de ativação (sigmoid)
def sigmoid(z):
return 1 / (1 + np.exp(-z))
saida = sigmoid(z)
print(f"Soma ponderada: {z:.4f}")
print(f"Saída (sigmoid): {saida:.4f}")
np.dot(x, w) calcula a soma ponderada: w = [0.2, 0.8] — qual entrada agora tem mais importância? Como muda a saída?b = -1.0 e b = 2.0 — observe como o bias desloca a ativação.max(0, z). Compare o comportamento com sigmoid.

x = [0.5, 0.3].w = [0.8, 0.2].b = 0.1.0.6365.0.6365 indica uma ativação moderada. Se considerarmos um limiar de 0.5, o neurônio "ativaria" nesse cenário.import numpy as np
# ---------------------------
# Dados de entrada
# ---------------------------
X = np.array([
[0.9, 0.8], # Boa nota, boa frequência -> Aprovado
[0.7, 0.6], # Nota ok, frequência ok -> Aprovado
[0.2, 0.3], # Nota ruim, frequência ruim -> Reprovado
[0.1, 0.4] # Nota muito ruim, frequência ruim -> Reprovado
])
# Resultados esperados (1 = Aprovado, 0 = Reprovado)
y = np.array([1,1,0,0])
# ---------------------------
# Inicializando pesos
# ---------------------------
np.random.seed(1) # Para resultados reproduzíveis
w = np.random.rand(2) # Pesos para nota e frequência
b = np.random.rand() # Bias inicial
# Taxa de aprendizado: controla o tamanho dos ajustes
lr = 0.1
# ---------------------------
# Função sigmoid
# ---------------------------
def sigmoid(z):
return 1/(1+np.exp(-z))
# ---------------------------
# Treinamento
# ---------------------------
for epoch in range(20): # Número de "rodadas" de aprendizado
print(f"\nEpoch {epoch}")
for i in range(len(X)): # Itera sobre cada estudante
x = X[i] # Entradas do estudante atual
# Soma ponderada (influência das entradas + bias)
z = np.dot(x,w) + b
# Saída do neurônio (predição)
pred = sigmoid(z)
# Erro: quanto erramos na previsão?
error = y[i] - pred
# Ajuste dos pesos e bias (o "aprendizado")
w += lr * error * x
b += lr * error
print("Entrada:",x)
print("Predição:",round(pred,3))
print("Erro:",round(error,3))
print("\n---------------------------")
print("Pesos finais:",np.round(w, 3))
print("Bias final:",round(b, 3))
print("---------------------------")
lr)lr = 0.01 (lento) e lr = 1.0 (rápido). Como isso afeta a velocidade de convergência e os pesos finais?range(100) ou diminua para range(5). Mais epochs garantem um aprendizado mais robusto?1000 imagens e define um Batch Size de 100 imagens:Número de Batches por Epoch = Tamanho do Dataset / Tamanho do Batch
10 Batches = 1000 imagens / 100 imagens por BatchEpoch = uma passagem completa do dataset pelo modelo.
import numpy as np
# Definindo os parâmetros do neurônio
pesos = np.array([2.0, 1.0]) # Importância de cada entrada
bias = -2.5
# Função de Ativação (Step Function)
# Produz 1 se a soma ponderada + bias for >= 0, senão 0
def funcao_ativacao_degrau(z):
return 1 if z >= 0 else 0
# Diferentes conjuntos de entradas para teste
conjuntos_de_entrada = [
np.array([0.5, 0.5]), # Exemplo 1: ambas baixas
np.array([1.0, 0.5]), # Exemplo 2: uma média, outra baixa
np.array([0.0, 1.0]), # Exemplo 3: uma zero, outra média
np.array([1.5, 1.5]) # Exemplo 4: ambas altas
]
print("--- Simulação de Decisão do Neurônio ---")
for i, x in enumerate(conjuntos_de_entrada):
# 1. Soma Ponderada + Bias
valor_liquido = np.dot(x, pesos) + bias
# 2. Aplicar Função de Ativação
saida_do_neuronio = funcao_ativacao_degrau(valor_liquido)
print(f"Entrada {i+1} ({x}):")
print(f" Soma Ponderada + Bias: {valor_liquido:.2f}")
print(f" Saída do Neurônio: {saida_do_neuronio}")
print("--------------------------------------")
x interagem com os pesos e o bias para influenciar a saída.pesos = np.array([0.5, 0.5]) e veja como isso altera as saídas. Agora, as entradas têm menos influência na decisão.bias = -0.5 ou bias = -4.0. O bias funciona como um "gatilho" para a ativação — um bias mais alto torna o neurônio mais fácil de ativar, e vice-versa.conjuntos_de_entrada e preveja a saída antes de executar o código. Isso ajuda a internalizar o processo de decisão do neurônio.🚀 Próximos passos: Com os fundamentos consolidados, estamos prontos para mergulhar em redes neurais multicamadas, backpropagation, funções de perda e as arquiteturas que definem o estado da arte em Deep Learning. A jornada está apenas começando!