Álgebra Linear e Otimização para Aprendizado de Máquina
2026-08-26
Cada observação, um vetor \(\mathbf{x}\in\mathbb{R}^d\) isolado: espaço vetorial/subespaço (fechamento sob soma e escalar), normas (\(L_1\), \(L_2\), \(L_\infty\)), produto interno/cosseno.
Primeiro aviso: a intuição geométrica de “distância” já começa a se degradar em muitos atributos — volta formalizada mais adiante no curso.
Fechamento da Aula 1: RAG (Retrieval-Augmented Generation) é essa mesma máquina (vetores, normas, métricas) buscando vizinhos em embeddings de alta dimensão.
Tudo isso tratou um vetor de cada vez. Nenhum problema real usa um vetor só — um dataset é \(N\) vetores, um por observação.
Pergunta que abre a aula: que estrutura generaliza “um vetor” para “\(N\) vetores de uma vez”, preservando soma e produto interno? Resposta: a matriz.
1. De um vetor para um dataset inteiro — o que isso compra?
2. Multiplicar matriz por vetor: duas leituras igualmente corretas.
3. Um sistema linear — quando tem solução, e quantas?
4. Como saber se atributos têm informação redundante?
California Housing: \(N=20\,640\) bairros, cada um um vetor de 8 atributos. Prever o preço dos \(20\,640\) de uma vez — não em loop, um por um — exige uma conta só. O que essa conta precisa “saber” sobre como os vetores estão organizados?
\[ A = \begin{bmatrix} a_{11} & \cdots & a_{1n} \\ \vdots & \ddots & \vdots \\ a_{m1} & \cdots & a_{mn} \end{bmatrix} \in \mathbb{R}^{m\times n} \]
Empilhando \(N\) vetores \(\mathbf{x}_i\in\mathbb{R}^d\) como linhas: \[X = \begin{bmatrix} \mathbf{x}_1^T \\ \vdots \\ \mathbf{x}_N^T \end{bmatrix} \in \mathbb{R}^{N\times d}\]
Linha = uma observação. Coluna = um atributo em todas as observações. Mesma matriz, duas leituras.
Amostra real de 6 bairros, 4 atributos:
MedInc: renda mediana do bairro (dezenas de milhares de dólares)HouseAge: idade média dos imóveis (anos)AveRooms: média de cômodos por domicílioAveBedrms: média de quartos por domicílioNa matriz de design \(X\), o que significa fisicamente “somar duas colunas” — isso é uma operação que faz sentido para os dados desta aula?
Dica: pense em MedInc (renda mediana do bairro, em dezenas de milhares de dólares) somado a HouseAge (idade média dos imóveis, em anos) — as unidades combinam?
MedInc estivesse em dólares em vez de dezenas de milhares, a soma continuaria bem definida, só mais dominada por MedInc.Na matriz de design \(X\), o que significa fisicamente “somar duas colunas”? — Resposta
Voltando à pergunta: a soma é sempre matematicamente válida — o que falta às vezes é sentido físico, não legalidade algébrica. Essa distinção volta com força no Bloco 5 (multicolinearidade).
\[c_{ij} = \sum_{l=1}^n a_{il}b_{lj} \qquad \text{(MathML, eq. 2.13, } k=1 \text{ para } A\mathbf{x}\text{)}\]
Leitura 1 (linha): \((A\mathbf{x})_i = \mathbf{a}_i^T\mathbf{x}\) — produto interno da linha \(i\) com \(\mathbf{x}\).
Leitura 2 (coluna): \(A\mathbf{x} = \sum_j x_j\,\mathbf{a}^{(j)}\) — combinação linear das colunas de \(A\).
\[\hat{\mathbf{y}} = X\mathbf{w} \in \mathbb{R}^N\] Todas as \(N\) previsões, de uma vez, com um único produto matriz-vetor.
\(\mathbf{w}\) pondera o quanto cada atributo (coluna de \(X\)) contribui — \(X\mathbf{w}\) é uma combinação linear das colunas de \(X\).
Isso já funciona agora, sem esperar a Aula 3: dado qualquer \(\mathbf{w}\) (mesmo inventado), \(X\mathbf{w}\) já prevê o preço dos 6 bairros da amostra, de uma vez, sem laço nenhum.
\(\mathbf{w}\) aqui foi inventado, não ajustado — por isso a previsão erra tanto: superestima em alguns bairros (resíduo positivo), subestima em outros (negativo).
\(\hat{\mathbf{y}}-\mathbf{y} = X\mathbf{w}-\mathbf{y}\) é o resíduo — e já anuncia a pergunta da Aula 3: existe \(\mathbf{w}\) que minimiza esse erro para todas as \(N\) observações, não só estas 6?
Guarde a pergunta — o Bloco 3 (sistemas lineares) explica por que a resposta não pode ser “resíduo zero para todo mundo”.
Julgue V ou F: matrizes, produto matriz-vetor e a Leitura 1/Leitura 2
Julgue V ou F — a questão só conta se acertar os 4 itens:
Julgue V ou F: matrizes, produto matriz-vetor e a Leitura 1/Leitura 2 — Resposta
\[A\mathbf{x} = \mathbf{b}, \qquad A\in\mathbb{R}^{m\times n},\; \mathbf{b}\in\mathbb{R}^m\]
Aula 1: caso particular \(\mathbf{b}=\mathbf{0}\) — solução sempre um subespaço. Agora: \(\mathbf{b}\) arbitrário.
O desenho mostra que existem 3 casos possíveis — não mostra como descobrir qual deles você tem, sem desenhar. A resposta: eliminação de Gauss, um algoritmo mecânico.
\[ \begin{aligned} x_1 + x_2 + x_3 &= 6 \\ 2x_1 - x_2 + x_3 &= 3 \\ x_1 + 2x_2 - x_3 &= 2 \end{aligned} \]
Nota
Premissa: somar um múltiplo de uma linha a outra não muda o conjunto-solução. Objetivo: zerar abaixo de cada pivô até sobrar uma forma triangular.
1. Matriz aumentada \([A|\mathbf{b}]\); \(L_2 \leftarrow L_2 - 2L_1\), \(L_3 \leftarrow L_3 - L_1\): \[\left[\begin{array}{ccc|c} 1&1&1&6 \\ 0&-3&-1&-9 \\ 0&1&-2&-4 \end{array}\right]\]
2. \(L_3 \leftarrow L_3 + \tfrac13 L_2\): \[\left[\begin{array}{ccc|c} 1&1&1&6 \\ 0&-3&-1&-9 \\ 0&0&-\tfrac73&-7 \end{array}\right]\]
Forma triangular, sem linha “\(0=0\)” nem “\(0=\) não-zero” \(\Rightarrow\) exatamente uma solução.
\(-\tfrac73 x_3=-7 \Rightarrow x_3=3\).
\(-3x_2-3=-9 \Rightarrow x_2=2\).
\(x_1+2+3=6 \Rightarrow x_1=1\). Solução única: \((1,2,3)\).
Linha final “\(0 = 7\)” (contradição, coeficientes zerados mas lado direito não-zero) \(\Rightarrow\) nenhuma solução — as equações são incompatíveis, como as retas paralelas do desenho.
Linha final “\(0=0\)” (equação redundante) \(\Rightarrow\) infinitas soluções — sobra uma incógnita livre.
O Bloco 5 dá um atalho para prever qual caso vai acontecer sem eliminar tudo: comparar o posto de \(A\) com o posto da matriz aumentada.
\(X\mathbf{w}=\mathbf{y}\): \(N\) equações (observações), \(d\) incógnitas (pesos). Em ML real, \(N \gg d\).
Mais equações que incógnitas = sobredeterminado — genericamente, nenhuma solução exata. Exigir uma reta passando exatamente por milhares de pontos ruidosos é pedir demais.
Não é um beco sem saída: é o problema que abre a Aula 3.
Se um sistema \(A\mathbf{x}=\mathbf{b}\) tem mais incógnitas do que equações (\(n>m\)), ele pode ter solução única?
Dica: cada equação é uma restrição a menos do que graus de liberdade — sobra alguma direção livre?
Se um sistema tem mais incógnitas que equações, ele pode ter solução única? — Resposta
Voltando à pergunta: não, nunca única — se \(n>m\) e \(A\) tem posto completo, sobra pelo menos uma direção livre; solução única exigiria \(n=\text{rk}(A)\).
Combinação linear de \(\mathbf{x}_1,\dots,\mathbf{x}_k\): \[\mathbf{v} = \sum_{i=1}^k \lambda_i\mathbf{x}_i, \qquad \lambda_i\in\mathbb{R}\]
Equação \(\sum_{i=1}^k \lambda_i\mathbf{x}_i = \mathbf{0}\) sempre tem a solução trivial (\(\lambda_i=0\) para todo \(i\)).
LD: existe solução não trivial (algum \(\lambda_i\ne 0\)). LI: a única solução é a trivial.
Sem redundância: remover qualquer vetor independente faz perder informação (MathML, §2.5). Um vetor LD dos demais é reconstruível a partir deles.
Um fato interessante é que 3 vetores quaisquer em \(\mathbb{R}^2\) nunca podem ser LI — não importa quais sejam.
No fim isso faz sentido pois em \(\mathbb{R}^2\) só há duas direções independentes possíveis, ou seja, não é possível ter mais informação do que a dimensão do espaço permite.
v1 = np.array([2.0, 1.0])
v2 = np.array([1.0, 3.0])
v3 = np.array([4.0, 9.0])
# Existe combinação não trivial de v1, v2 que dá v3?
coef, *_ = np.linalg.lstsq(np.column_stack([v1, v2]), v3, rcond=None)
a, b = coef
print(f"v3 = {a:.2f}*v1 + {b:.2f}*v2 -> verificação: {a*v1 + b*v2}")
print("rank([v1, v2, v3]) =", np.linalg.matrix_rank(np.column_stack([v1, v2, v3])))v3 = 0.60*v1 + 2.80*v2 -> verificação: [4. 9.]
rank([v1, v2, v3]) = 2
Leitura 2 (Bloco 2): coluna \(j\) = combinação linear exata das outras \(\Rightarrow\) qualquer contribuição dela a \(X\mathbf{w}\) já é obtida redistribuindo peso entre as demais — nenhuma direção nova.
Multicolinearidade = dependência linear entre colunas de \(X\) (a mesma definição do Bloco 4, aplicada aos atributos de um dataset).
Caso mais fácil: uma coluna é múltiplo exato de outra (ex.: área em m² e em pés²). Veja como isso aparece num gráfico de dispersão:
Nenhum ponto fora da reta: a segunda coluna não carrega informação que a primeira (vezes uma constante) já não tivesse — mesma informação, duas colunas.
O Bloco 5 dá a essa ideia uma medida numérica: o posto.
Julgue V ou F: independência linear
Julgue V ou F — a questão só conta se acertar os 4 itens:
Julgue V ou F: independência linear — Resposta
Leitura 2 (Bloco 2): \(A\mathbf{x}\) é sempre combinação linear das colunas de \(A\). Deixando \(\mathbf{x}\) variar por todo \(\mathbb{R}^n\), o conjunto de tudo que \(A\mathbf{x}\) alcança é o espaço-coluna de \(A\) — uma reta (1 coluna independente), um plano (2), etc.
Posto = dimensão dessa figura. No exemplo do Bloco 3, \(A=\begin{bmatrix}1&1\\1&1\end{bmatrix}\) tem as duas colunas idênticas — uma única direção. O espaço-coluna não é o plano todo, é só a reta \(x_2=x_1\).
Resolver \(A\mathbf{x}=\mathbf{b}\) é perguntar: \(\mathbf{b}\) está nessa reta?
\(\mathbf{b}=(3,5)\) (X): fora da reta — nenhuma combinação das colunas alcança esse ponto, sem solução.
\(\mathbf{b}'=(4,4)\) (círculo): sobre a reta — é \(4\times(1,1)\), então \(\mathbf{x}=(4,0)\) resolve. “Tem solução?” sempre foi geométrico.
Definição (MathML, §2.6.2, citado): posto = nº de colunas independentes = nº de linhas independentes, \(\text{rk}(A)\). Completo: \(\text{rk}(A)=\min(m,n)\). Deficiente: menos que isso.
Numa matriz de design \(X\in\mathbb{R}^{N\times d}\): posto completo \(\Rightarrow\) \(\text{rk}(X)=d\), as \(d\) colunas são independentes. Posto deficiente é a multicolinearidade exata do bloco anterior, com um número que a mede.
\([A|\mathbf{b}]\) = matriz aumentada: \(A\) com \(\mathbf{b}\) anexado como coluna extra. Critério geral (MathML, §2.6.2): solúvel \(\iff\) \(\text{rk}(A)=\text{rk}([A|\mathbf{b}])\).
Mesmo mecanismo do desenho: \(\mathbf{b}\) fora do espaço-coluna (sem solução) \(\Rightarrow\) direção nova, \(\text{rk}([A|\mathbf{b}])=\text{rk}(A)+1\). \(\mathbf{b}\) dentro (com solução) \(\Rightarrow\) nada muda, \(\text{rk}([A|\mathbf{b}])=\text{rk}(A)\).
Comparar os dois postos é uma forma algébrica e geral de perguntar “\(\mathbf{b}\) está no espaço-coluna?” — sem desenhar, e sem se limitar a \(\mathbb{R}^2\).
Conferindo com números o mesmo exemplo:
rk(A) = 1
rk([A|b]) = 2
\(1\ne 2\): sem solução — exatamente o que o desenho já mostrava.
X_completo = _housing[COLS].to_numpy()
print("X completo:", X_completo.shape, " posto:", np.linalg.matrix_rank(X_completo))
# Fabricando multicolinearidade exata: uma "5a coluna" que é 2x AveRooms
X_com_duplicata = np.column_stack([X_completo, 2.0 * X_completo[:, 2]])
print("X com coluna redundante:", X_com_duplicata.shape, " posto:", np.linalg.matrix_rank(X_com_duplicata))X completo: (16640, 4) posto: 4
X com coluna redundante: (16640, 5) posto: 4
X original (4 colunas): posto = 4
X + coluna redundante (5 colunas): posto = 4
Coluna redundante (\(2\times\) AveRooms) não eleva o posto — a matriz fica deficiente. Infinitas formas de distribuir o “crédito” entre a coluna original e a cópia, mesma previsão.
corr_quartos = np.corrcoef(_housing["AveRooms"], _housing["AveBedrms"])[0, 1]
print(f"Correlação AveRooms/AveBedrms: {corr_quartos:.3f}")
fig, ax = plt.subplots(figsize=(6, 5))
ax.scatter(_housing["AveRooms"], _housing["AveBedrms"], s=6, color=COR_A, alpha=0.25)
ax.set_xlim(2, 10); ax.set_ylim(0.8, 2.5)
ax.set_xlabel("AveRooms (média de cômodos)")
ax.set_ylabel("AveBedrms (média de quartos)")
ax.set_title(f"Correlação real = {corr_quartos:.3f} — forte, mas não exata", fontsize=11, fontweight="bold")
plt.tight_layout()
plt.show()Correlação AveRooms/AveBedrms: 0.865
Correlação real \(=0{,}865\): forte, mas não \(1\). Posto continua completo — mas isso não impede instabilidade numérica. Dá para ver com números:
Amostra pequena (20 bairros — o efeito fica mais visível com poucos pontos). Ajuste por mínimos quadrados (np.linalg.lstsq, já usado no Bloco 4) prevendo MedHouseVal só a partir de AveRooms/AveBedrms.
Perturbe MedHouseVal com ruído minúsculo (1% do seu desvio-padrão) e ajuste de novo. Compare os pesos antes/depois:
_amostra_20 = _housing.sample(n=20, random_state=7)
X_quase_dep = _amostra_20[["AveRooms", "AveBedrms"]].to_numpy()
y_amostra_20 = _amostra_20["MedHouseVal"].to_numpy()
w_original, *_ = np.linalg.lstsq(X_quase_dep, y_amostra_20, rcond=None)
rng_ruido = np.random.default_rng(1)
y_perturbado = y_amostra_20 + rng_ruido.normal(scale=0.01 * y_amostra_20.std(), size=y_amostra_20.shape)
w_perturbado, *_ = np.linalg.lstsq(X_quase_dep, y_perturbado, rcond=None)
print(f"w original (AveRooms, AveBedrms) = {w_original}")
print(f"w com y perturbado em 1% = {w_perturbado}")
print(f"variação relativa em w[AveRooms] = {abs(w_perturbado[0]-w_original[0])/abs(w_original[0]):.1%}")
print(f"variação relativa em w[AveBedrms] = {abs(w_perturbado[1]-w_original[1])/abs(w_original[1]):.1%}")
# Contraste: mesmo experimento com um par de colunas bem condicionado
X_bem_condicionado = _amostra_20[["MedInc", "HouseAge"]].to_numpy()
w_orig_bc, *_ = np.linalg.lstsq(X_bem_condicionado, y_amostra_20, rcond=None)
w_pert_bc, *_ = np.linalg.lstsq(X_bem_condicionado, y_perturbado, rcond=None)
print(f"\nPar bem condicionado (MedInc, HouseAge):")
print(f"variação relativa em w[MedInc] = {abs(w_pert_bc[0]-w_orig_bc[0])/abs(w_orig_bc[0]):.1%}")
print(f"variação relativa em w[HouseAge] = {abs(w_pert_bc[1]-w_orig_bc[1])/abs(w_orig_bc[1]):.1%}")w original (AveRooms, AveBedrms) = [ 0.36023835 -0.03189445]
w com y perturbado em 1% = [ 0.3583604 -0.02248488]
variação relativa em w[AveRooms] = 0.5%
variação relativa em w[AveBedrms] = 29.5%
Par bem condicionado (MedInc, HouseAge):
variação relativa em w[MedInc] = 0.1%
variação relativa em w[HouseAge] = 0.1%
Ruído de 1% em MedHouseVal já muda o peso de AveBedrms em quase 30% — o modelo “hesita” entre as duas colunas quase-dependentes, que contam quase a mesma história sobre o bairro.
No par bem condicionado (MedInc/HouseAge), o mesmo ruído de 1% muda os pesos em bem menos de 1%. A diferença não é o ruído — é a quase-dependência entre as colunas.
Nome e medida exatos dessa sensibilidade: número de condição — assunto da Aula 4 (autovalores).
Julgue V ou F: posto, multicolinearidade e solvabilidade
Julgue V ou F — a questão só conta se acertar os 4 itens:
AveRooms em vez de \(2\times\) AveRooms, o posto da matriz ainda cairia (permaneceria em 4, não subiria para 5).Julgue V ou F: posto, multicolinearidade e solvabilidade — Resposta
1. Vetor → dataset: empilhar como linhas dá a matriz de design \(X\).
2. \(A\mathbf{x}\): por linha (previsão) ou por coluna (combinação linear) — mesma fórmula, dois significados.
3. Sistema linear: nenhuma, uma, ou infinitas soluções — em ML, tipicamente nenhuma (\(N\gg d\)).
4. Redundância: independência linear das colunas; posto mede quantas são de fato independentes.
Sistema sobredeterminado, sem solução exata — qual a melhor aproximação?
Projeção ortogonal de \(\mathbf{y}\) sobre o espaço-coluna de \(X\) → Equações Normais, \(X^TX\hat{\mathbf{w}} = X^T\mathbf{y}\).
Posto completo de \(X\) (Bloco 5) \(=\) a condição que garante solução única para essa equação.
UNICAMP — Instituto de Computação