Aula 3: Projeções Ortogonais e Subespaços
Álgebra Linear e Otimização para Aprendizado de Máquina
1 Revisão e Introdução
1.1 Revisão Rápida: Onde a Aula 2 Parou
A Aula 2 deu quatro passos, nesta ordem. Primeiro, generalizou “um vetor” para “um dataset inteiro” via a matriz de design \(X\in\mathbb{R}^{N\times d}\) — cada linha uma observação, cada coluna um atributo. Segundo, deu duas leituras ao produto \(A\mathbf{x}\): por linha, uma previsão (produto interno por observação); por coluna, uma combinação linear dos atributos — a mesma fórmula, dois significados, ambos usados o resto do curso. Terceiro, classificou os sistemas lineares \(A\mathbf{x}=\mathbf{b}\) em três casos possíveis — nenhuma, exatamente uma, ou infinitas soluções — via o critério do posto da matriz aumentada, \(\text{rk}(A)=\text{rk}(A|\mathbf{b})\), resolvendo um exemplo completo por Eliminação de Gauss. Quarto, tratou de independência linear: um atributo é redundante (multicolinear) quando é combinação linear dos demais, e o posto de uma matriz mede exatamente quantas colunas são, de fato, independentes — quando as \(d\) colunas de \(X\) são linearmente independentes, dizemos que \(X\) tem posto completo, \(\text{rk}(X)=d\).
Esse último fato — posto completo de \(X\), não o critério de solvabilidade do terceiro passo (outra aplicação do mesmo conceito de posto, mas sobre \(A\) e a matriz aumentada, não sobre \(X\)) — é a peça que esta aula vai reusar diretamente no Bloco 4, como a condição exata que garante uma única melhor aproximação. A peça central que fica de tudo isso: em Regressão Linear Múltipla, o sistema \(X\mathbf{w}=\mathbf{y}\) tem \(N\) equações e \(d\) incógnitas, e como \(N\gg d\) em praticamente todo problema real, o sistema é sobredeterminado — genericamente, nenhuma solução exata.
1.2 Organizador Prévio: De “Sem Solução” Para “Melhor Aproximação”
A Aula 2 fechou com essa constatação como um beco aparentemente sem saída: exigir que \(X\mathbf{w}\) alcance \(\mathbf{y}\) exatamente é pedir demais quando há milhares de observações reais e ruidosas. Mas “sem solução exata” não é “sem solução nenhuma que preste”. O próprio livro que citamos nas Aulas 1-2 (MathML) já aponta a saída, no capítulo sobre projeções: quando um sistema \(A\mathbf{x}=\mathbf{b}\) não pode ser resolvido exatamente, ainda é possível perguntar qual é a melhor aproximação — “a ideia é encontrar o vetor no subespaço gerado pelas colunas de \(A\) que está mais próximo de \(\mathbf{b}\)” (tradução nossa, MathML, §3.8.2, p. 88). Essa pergunta — “mais próximo, mas dentro de onde?” — é geométrica antes de ser algébrica, e é exatamente o fio que esta aula segue.
1.3 Roteiro da Aula
A pergunta que fecha o Organizador Prévio — “mais próximo, mas dentro de onde?” — se desdobra em quatro perguntas mais específicas, cada uma resolvida em um bloco desta aula:
- O que significa, geometricamente, “a melhor aproximação possível” de \(\mathbf{y}\) por um \(X\mathbf{w}\) alcançável?
- O que é projetar um vetor sobre um subespaço, e por que essa operação resolve exatamente o problema da pergunta 1?
- Como essa ideia geométrica vira uma fórmula calculável — as Equações Normais?
- Quando essa fórmula falha, ou fica numericamente frágil, e por quê?
1.4 Problema Motivador
Volte ao California Housing Dataset das Aulas 1-2: \(N=16\,640\) bairros (a partição de treino), 4 atributos (MedInc, HouseAge, AveRooms, AveBedrms), e o alvo MedHouseVal. O sistema \(X\mathbf{w}=\mathbf{y}\) tem \(16\,640\) equações e \(4\) incógnitas — sobredeterminado por uma margem enorme. Sem resolver nada ainda, pense por um instante: se \(X\mathbf{w}\) nunca alcança \(\mathbf{y}\) exatamente, qual \(X\mathbf{w}\) alcançável está mais perto? E “mais perto” — medido como, exatamente?
Dica: pense em como a Aula 2 já classificou o número de soluções de um sistema exato — nenhuma, uma, ou infinitas. A pergunta agora troca “solução exata” por “solução aproximada”. O número de “melhores aproximações” muda de natureza?
- □ Se o sistema \(X\mathbf{w}=\mathbf{y}\) fosse subdeterminado (\(N<d\)) em vez de sobredeterminado, ainda faria sentido perguntar qual \(X\mathbf{w}\) é “mais próximo” de \(\mathbf{y}\), mas a pergunta mudaria de natureza: deixaria de ser sobre um erro irredutível e passaria a ser sobre escolher entre infinitas soluções exatas.
- □ No caso-limite \(N=d\) com \(X\) de posto completo, a “melhor aproximação” \(X\hat{\mathbf{w}}\) coincide exatamente com \(\mathbf{y}\) (erro zero).
- □ Num sistema de posicionamento por GPS, com mais satélites (equações) do que coordenadas a estimar (incógnitas), a mesma lógica de “melhor aproximação por projeção” se aplica, ainda que o contexto seja localização geográfica, não preço de imóvel.
- □ Como nenhum \(X\mathbf{w}\) alcança \(\mathbf{y}\) exatamente num sistema sobredeterminado, a Regressão Linear Múltipla deixa de fornecer qualquer informação útil sobre a relação entre atributos e alvo.
2 Intuição: A Sombra no Chão
2.1 A Ideia Antes da Álgebra
Antes de qualquer fórmula, uma imagem concreta. Imagine um ponto \(\mathbf{y}\) flutuando no espaço, e um subespaço \(U\) — uma reta ou um plano passando pela origem — como se fosse o chão. Se uma fonte de luz vier exatamente perpendicular ao chão, a sombra de \(\mathbf{y}\) sobre \(U\) é um ponto específico: chame-o \(\hat{\mathbf{y}}\). Essa sombra tem duas propriedades que, juntas, definem tudo o que este bloco precisa:
- É o ponto de \(U\) mais próximo de \(\mathbf{y}\) — nenhum outro ponto do chão está a uma distância menor de \(\mathbf{y}\) do que a própria sombra.
- O segmento (ponto → sombra) é perpendicular a \(U\) — a “haste” que liga \(\mathbf{y}\) à sua sombra \(\hat{\mathbf{y}}\) faz ângulo reto com o chão inteiro, não só com a direção da luz.
Essas duas propriedades não são independentes — a segunda é a razão pela qual a primeira é verdade, algo que o Bloco 4 vai provar formalmente. Por ora, olhe para o desenho: projetar sobre uma reta (subespaço de dimensão 1) e projetar sobre um plano (subespaço de dimensão 2) são a mesma operação, só que o “chão” tem mais dimensões.
No painel esquerdo, \(U\) é a reta gerada pela direção \((2,1)\), e \(\mathbf{y}=(1{,}0;3{,}2)\) está fora dela. A sombra \(\hat{\mathbf{y}}\) (quadrado laranja) é o ponto da reta mais próximo de \(\mathbf{y}\), e o segmento tracejado (o “resíduo”) encontra a reta em ângulo reto — não em qualquer ângulo. No painel direito, o “chão” já é um plano bidimensional (o plano \(x_3=0\)) dentro de um espaço tridimensional: \(\mathbf{y}=(1{,}5;1{,}8;\,2{,}3)\) tem sombra \(\hat{\mathbf{y}}=(1{,}5;1{,}8;\,0)\) — a projeção simplesmente “zera” a componente perpendicular ao chão, e o segmento tracejado (puramente na direção \(x_3\)) é, de novo, perpendicular a todo o plano, não só a uma direção dentro dele. É essa segunda observação — perpendicular a todo o subespaço — que vai generalizar para o espaço-coluna de \(X\), que tem \(d=4\) dimensões, não \(1\) ou \(2\): a “álgebra” muda, a geometria não.
Dica: pense no desenho da reta acima. Se você inclinasse a direção da “luz” (a direção da haste que liga \(\mathbf{y}\) à sua sombra), o ponto de chegada na reta mudaria — ele continuaria sendo o ponto mais próximo?
- □ Se a luz não viesse perpendicular ao chão, mas em um ângulo oblíquo fixo, o ponto resultante ainda seria o ponto do subespaço mais próximo de \(\mathbf{y}\).
- □ Se o ponto \(\mathbf{y}\) já pertencesse ao subespaço \(U\), a “sombra” de \(\mathbf{y}\) sobre \(U\) coincidiria com o próprio \(\mathbf{y}\), e o resíduo teria norma zero.
- □ Comprimir uma imagem mantendo só suas componentes principais é, geometricamente, projetar cada vetor-pixel sobre um subespaço de menor dimensão — a mesma lógica da sombra perpendicular discutida aqui, aplicada a outro tipo de dado.
- □ Como a sombra perpendicular minimiza a distância até \(\mathbf{y}\), ela também é, necessariamente, o ponto do subespaço com a maior norma possível entre os candidatos considerados.
3 Subespaços e Complemento Ortogonal
3.1 Recapitulando: Subespaço e Espaço-Coluna
A Aula 1 definiu subespaço \(U\subseteq V\) como um subconjunto fechado sob combinação linear: para quaisquer \(\mathbf{u},\mathbf{v}\in
U\) e escalares \(a,b\in\mathbb{R}\), \(a\mathbf{u}+b\mathbf{v}\in U\) (em particular, \(\mathbf{0}\in U\) sempre — basta tomar \(a=b=0\)). A Aula 2 deu um exemplo concreto e central para este curso — o espaço-coluna \[
\text{col}(X) = \{X\mathbf{w} : \mathbf{w}\in\mathbb{R}^d\}\subseteq\mathbb{R}^N,
\] o conjunto de todas as combinações lineares das colunas de \(X\) (a Leitura 2 do produto matriz-vetor, Aula 2), ou seja, tudo que \(X\mathbf{w}\) alcança quando \(\mathbf{w}\) varia livremente por \(\mathbb{R}^d\) — e essa definição já garante que \(\text{col}(X)\) é, de fato, um subespaço (a distributividade do produto matriz-vetor, \(X(a\mathbf{w}_1+b\mathbf{w}_2)=aX\mathbf{w}_1+bX\mathbf{w}_2\), é exatamente o fechamento sob combinação linear exigido pela definição). Com \(X\in\mathbb{R}^{16640\times 4}\) de posto completo (verificado na Aula 2), \(\text{col}(X)\) é um subespaço de dimensão \(4\) dentro de um espaço ambiente de dimensão \(16\,640\) — geometricamente, como um plano finíssimo boiando dentro de um espaço gigantesco, e \(\mathbf{y}\) (o vetor com as \(16\,640\) observações de MedHouseVal) quase certamente não está dentro dele.
3.2 O Complemento Ortogonal
A pergunta natural — “o que dizer sobre a parte de \(\mathbf{y}\) que não está em \(\text{col}(X)\)?” — tem uma resposta com nome: o complemento ortogonal. Dado um subespaço \(U\) de um espaço \(V\) de dimensão \(D\), com \(U\) de dimensão \(M\), o MathML define (tradução nossa, §3.6, p. 79):
“seu complemento ortogonal \(U^\perp\) é um subespaço de \(V\) de dimensão \((D-M)\) e contém todos os vetores em \(V\) que são ortogonais a todo vetor em \(U\). Além disso, \(U\cap U^\perp=\{\mathbf{0}\}\), de modo que qualquer vetor \(\mathbf{x}\in V\) pode ser decomposto de forma única” \[ \mathbf{x} = \sum_{m=1}^{M}\lambda_m\mathbf{b}_m + \sum_{j=1}^{D-M}\psi_j\mathbf{b}_j^\perp, \qquad \lambda_m,\psi_j\in\mathbb{R} \qquad \text{(MathML, eq. 3.36)}, \] onde \((\mathbf{b}_1,\dots,\mathbf{b}_M)\) é uma base de \(U\) e \((\mathbf{b}_1^\perp,\dots,\mathbf{b}_{D-M}^\perp)\) é uma base de \(U^\perp\). Em notação compacta, isso se escreve \(V = U \oplus U^\perp\): todo vetor de \(V\) é a soma de uma única parte dentro de \(U\) com uma única parte dentro de \(U^\perp\) — nunca duas formas diferentes de fazer essa soma, nunca nenhuma parte sobrando de fora.
Em \(\mathbb{R}^2\) (\(D=2\)), com \(U\) a reta de dimensão \(M=1\), o complemento ortogonal \(U^\perp\) também tem dimensão \(D-M=1\) — a reta perpendicular. O vetor \(\mathbf{x}=(1,3)\) se decompõe de forma única em uma parte sobre \(U\) e uma parte sobre \(U^\perp\) (linhas pontilhadas): some as duas setas azul/laranja e você recupera exatamente \(\mathbf{x}\), sem sobra e sem ambiguidade — não existe uma segunda forma de fazer essa soma. Em \(\mathbb{R}^3\), se \(U\) fosse um plano (\(M=2\)), \(U^\perp\) teria dimensão \(D-M=1\) — é exatamente o “vetor normal” do MathML: “o vetor \(\mathbf{w}\) com \(\|\mathbf{w}\|=1\), ortogonal ao plano \(U\), é o vetor de base de \(U^\perp\)” (tradução nossa, §3.6, p. 80). No caso da regressão que fecha esta aula, \(D=16\,640\) e \(M=4\): \(U^\perp=\text{col}(X)^\perp\) tem a dimensão gigantesca \(16\,636\), mas isso não importa para o que vamos usar dele — só importa que o resíduo \(\mathbf{y}-\hat{\mathbf{y}}\) vai viver exatamente ali dentro.
Dica: releia a definição — \(U^\perp\) contém todo vetor ortogonal a todo vetor de \(U\). Se o único vetor de \(U\) for \(\mathbf{0}\), quantos vetores de \(V\) são ortogonais a ele?
- □ Se \(U\) fosse o subespaço trivial \(\{\mathbf{0}\}\), seu complemento ortogonal \(U^\perp\) seria igual ao espaço \(V\) inteiro.
- □ Se \(U=V\) (o subespaço é o espaço inteiro), então \(U^\perp=\{\mathbf{0}\}\).
- □ Num modelo de regressão em que o resíduo \(\mathbf{y}-\hat{\mathbf{y}}\) é ortogonal a todo vetor do espaço-coluna de \(X\), esse resíduo não é apenas “ortogonal a ele” informalmente — ele satisfaz a própria definição formal de pertencer a \(\text{col}(X)^\perp\).
- □ Como todo vetor de \(V\) se decompõe de forma única numa parte de \(U\) e uma parte de \(U^\perp\), isso implica que \(U\) e \(U^\perp\) têm, necessariamente, a mesma dimensão.
4 O Teorema da Projeção: Premissas e Passo a Passo
4.1 Enunciando o Problema com Precisão
Antes de derivar qualquer fórmula, vamos deixar explícitas as premissas — seguindo a diretriz deste curso de nunca saltar direto para o resultado final.
- Temos um subespaço \(U=\text{col}(X)\subseteq\mathbb{R}^N\), o espaço-coluna da matriz de design (Aula 2).
- Temos um vetor \(\mathbf{y}\in\mathbb{R}^N\) que, em geral, não pertence a \(U\) (o caso sobredeterminado da Aula 2 e do Bloco 1 desta aula).
- Definimos \(\hat{\mathbf{y}}\in U\) como o ponto de \(U\) mais próximo de \(\mathbf{y}\) — o que minimiza \(\|\mathbf{y}-\hat{\mathbf{y}}\|\) (a formalização da “sombra” do Bloco 2).
O objetivo dos dois passos seguintes é ir de “\(\hat{\mathbf{y}}\) minimiza a distância” até uma fórmula fechada e calculável para \(\hat{\mathbf{w}}\) tal que \(\hat{\mathbf{y}}=X\hat{\mathbf{w}}\).
4.2 Passo (i): Ortogonal a Cada Coluna de \(X\) via Otimização
Formalizar “\(\hat{\mathbf{y}}\) é o ponto de \(U=\text{col}(X)\) mais próximo de \(\mathbf{y}\)” é resolver um problema de otimização. Minimizar a distância \(\|\mathbf{y}-\mathbf{v}\|\) sobre \(\mathbf{v}\in U\) é equivalente a minimizar o quadrado da distância — a raiz quadrada é crescente, então o mínimo cai no mesmo ponto, e o quadrado tem derivada mais simples. E como \(U=\text{col}(X)\), já sabemos exatamente como \(\mathbf{v}\) varia dentro de \(U\): pela Leitura 2 do produto matriz-vetor (Aula 2), todo \(\mathbf{v}\in U\) é \(X\mathbf{w}\) para algum \(\mathbf{w}\in\mathbb{R}^d\), e \(\mathbf{w}\) não tem restrição nenhuma — não é preciso inventar uma base abstrata de \(U\) só para ter variáveis livres para derivar; \(\mathbf{w}\) já é essa variável livre, dada de graça pela própria definição de espaço-coluna. Minimizar sobre \(\mathbf{v}\in U\) é, então, o mesmo que minimizar sobre \(\mathbf{w}\in\mathbb{R}^d\) sem restrições — um problema de otimização irrestrita de verdade: \[ \hat{\mathbf{w}} = \arg\min_{\mathbf{w}\in\mathbb{R}^d}\; g(\mathbf{w}), \qquad g(\mathbf{w}) = \|\mathbf{y}-X\mathbf{w}\|^2. \]
Expandindo por manipulação de matrizes — \((\mathbf{y}-X\mathbf{w})^T(\mathbf{y}-X\mathbf{w})\), usando que \(\mathbf{y}^TX\mathbf{w}\) é um escalar, logo igual à sua própria transposta \(\mathbf{w}^TX^T\mathbf{y}\): \[ g(\mathbf{w}) = \mathbf{y}^T\mathbf{y} - 2\,\mathbf{y}^TX\mathbf{w} + \mathbf{w}^TX^TX\mathbf{w}. \] Usando as regras de cálculo vetorial \(\nabla_{\mathbf{w}}(\mathbf{a}^T\mathbf{w})=\mathbf{a}\) e \(\nabla_{\mathbf{w}}(\mathbf{w}^TC\mathbf{w})=2C\mathbf{w}\) (para \(C\) simétrica — e \(X^TX\) é simétrica), o gradiente de \(g\) é \[ \nabla_{\mathbf{w}}\, g(\mathbf{w}) = -2X^T\mathbf{y} + 2X^TX\mathbf{w} = -2\,X^T(\mathbf{y}-X\mathbf{w}). \] A Hessiana é \(2X^TX\), e ela é sempre semidefinida positiva — para qualquer \(X\), \(\mathbf{w}^TX^TX\mathbf{w}=\|X\mathbf{w}\|^2\ge 0\) —, o suficiente para \(g\) ser convexa, mesmo sem sabermos ainda se \(X^TX\) é invertível (essa condição extra só vai entrar no Passo (ii), para isolar um único \(\hat{\mathbf{w}}\) — não é necessária para caracterizar o mínimo). Como o problema é irrestrito e \(g\) é convexa, o mínimo é caracterizado pela condição de otimalidade de primeira ordem para problemas irrestritos — necessária e suficiente para um mínimo global: o gradiente se anula no ponto ótimo, \[ -2\,X^T(\mathbf{y}-X\hat{\mathbf{w}}) = \mathbf{0} \qquad\Longleftrightarrow\qquad X^T(\mathbf{y}-X\hat{\mathbf{w}}) = \mathbf{0}. \]
Essa equação diz que o resíduo \(\mathbf{y}-X\hat{\mathbf{w}}\) é ortogonal a cada coluna de \(X\) individualmente. E como todo vetor de \(\text{col}(X)\) é combinação linear das colunas (a mesma Leitura 2 de novo), o resíduo é ortogonal a qualquer vetor de \(\text{col}(X)\) — a ortogonalidade “passa” pela combinação linear sem se perder: \[ \mathbf{y}-X\hat{\mathbf{w}} \;\perp\; \text{col}(X). \] Minimizar a distância e ser ortogonal a \(\text{col}(X)\), portanto, não são duas condições separadas — são a mesma condição, uma vista pela definição (mínimo) e a outra pela consequência algébrica de anular o gradiente. O MathML batiza essa condição da mesma forma (tradução nossa, §3.8.2, p. 85-86, adaptando \(B\to X\)): “obtemos \(m\) condições simultâneas […] o que […] pode ser escrito como um sistema linear homogêneo […] \(B^T(\mathbf{x}-B\lambda)=\mathbf{0}\)” — o MathML enuncia essa condição via uma base abstrata de \(U\); aqui chegamos a ela diretamente, otimizando sobre a variável livre \(\mathbf{w}\) que \(X\) já oferece de graça.
4.3 Passo (ii): Isolando \(\hat{\mathbf{w}}\) — as Equações Normais
Distribuindo o produto do Passo (i): \[ X^T\mathbf{y} - X^TX\hat{\mathbf{w}} = \mathbf{0} \qquad\Longleftrightarrow\qquad X^TX\hat{\mathbf{w}} = X^T\mathbf{y}. \] O MathML batiza essa equação (tradução nossa, §3.8.2, p. 86, eq. 3.56): “a última expressão é chamada equação normal”. Isso ainda não é a fórmula fechada de \(\hat{\mathbf{w}}\) — é um sistema linear em \(\hat{\mathbf{w}}\), com \(X^TX\in\mathbb{R}^{d\times d}\) no papel de “\(A\)” e \(X^T\mathbf{y}\in\mathbb{R}^d\) no papel de “\(\mathbf{b}\)” (a mesma estrutura \(A\mathbf{x}=\mathbf{b}\) da Aula 2, agora numa matriz derivada de \(X\), não em \(X\) diretamente).
Quando esse sistema tem solução única. O MathML completa a derivação notando exatamente a condição que faz \(X^TX\) invertível (tradução nossa, §3.8.2, p. 86): “como \(b_1,\dots,b_m\) são uma base de \(U\) e, portanto, linearmente independentes, \(B^TB\in\mathbb{R}^{m\times m}\) é regular e pode ser invertida.” Traduzido para o nosso caso: as colunas de \(X\) são linearmente independentes exatamente quando \(X\) tem posto completo (\(\text{rk}(X)=d\)) — o mesmo critério provado na Aula 2, Bloco 5. Quando isso vale, \(X^TX\) é invertível, e podemos isolar \(\hat{\mathbf{w}}\): \[ \hat{\mathbf{w}} = (X^TX)^{-1}X^T\mathbf{y}. \] O MathML chama a matriz \((X^TX)^{-1}X^T\) de pseudo-inversa de \(X\) (tradução nossa, §3.8.2, p. 86) — um nome que vai voltar quando o curso tratar de decomposições matriciais (SVD), mais adiante. Por ora, a peça que fecha o ciclo aberto na Aula 2: o sistema \(X\mathbf{w}=\mathbf{y}\) sobredeterminado não tem solução exata, mas tem, sob posto completo, uma única melhor aproximação — e ela tem fórmula fechada.
\usetikzlibrary{arrows.meta, positioning}
\definecolor{icblue}{HTML}{0085CA}
\definecolor{icorange}{HTML}{FF5E00}
\definecolor{icred}{HTML}{E03C31}
\begin{tikzpicture}[scale=1.0]
% col(X): reta pela origem, direção (5,1) -- ŷ abaixo é a projeção
% ortogonal exata de y sobre essa reta (calculada, não estética).
\draw[icblue, thick] (-2.648,-0.530) -- (2.648,0.530) node[right] {\small $\mathrm{col}(X)$};
\node (yhat) at (1.462,0.292) {};
\fill[icorange] (1.462,0.292) circle (2.4pt);
\node[icorange, below right=1pt and 2pt of yhat, font=\small] {$\hat{\mathbf{y}}=X\hat{\mathbf{w}}$};
\node (y) at (1.1,2.1) {};
\fill[icred] (1.1,2.1) circle (2.4pt);
\node[icred, above=2pt of y, font=\small] {$\mathbf{y}$};
\draw[gray!70, dashed, thick, -{Stealth}] (1.1,2.1) -- (1.462,0.292) node[midway, right, font=\small, black] {resíduo $\perp\, \mathrm{col}(X)$};
% marcador de ângulo reto no ponto de encontro
\draw[gray!70, thick] (1.609,0.322) -- (1.579,0.469) -- (1.432,0.440);
\draw[icblue, -{Stealth}, thick] (1.119,0.224) -- (1.462,0.292);
\end{tikzpicture}O esquema resume os dois passos: \(\text{col}(X)\) é a “reta” azul (uma representação necessariamente simplificada de um subespaço de dimensão \(4\)), \(\mathbf{y}\) está fora dele, \(\hat{\mathbf{y}}=X\hat{\mathbf{w}}\) é o ponto mais próximo dentro de \(\text{col}(X)\), e o resíduo (tracejado) encontra o subespaço em ângulo reto — a mesma “sombra” do Bloco 2, agora com nome de variável de regressão.
Dica: releia o Passo (i) — “mais próximo” e “ortogonal” são a mesma condição. Isso é o mesmo que dizer “o erro desaparece”?
- □ Se, em vez de minimizar \(\|\mathbf{y}-X\mathbf{w}\|\) (norma \(L_2\)), o critério de “melhor” fosse minimizar \(\|\mathbf{y}-X\mathbf{w}\|_1\) (norma \(L_1\)), a condição de ortogonalidade \((\mathbf{y}-X\hat{\mathbf{w}})\perp\text{col}(X)\) ainda garantiria a solução.
- □ No caso em que \(\mathbf{y}\) já pertence ao espaço-coluna de \(X\), as Equações Normais \(X^TX\hat{\mathbf{w}}=X^T\mathbf{y}\) têm como solução um \(\hat{\mathbf{w}}\) tal que \(X\hat{\mathbf{w}}=\mathbf{y}\) exatamente (erro zero).
- □ Num problema de calibração de sensores, em que \(\mathbf{y}\) são leituras redundantes de \(N\) sensores e \(X\) mapeia \(d<N\) parâmetros físicos verdadeiros para essas leituras, a mesma derivação das Equações Normais forneceria a melhor estimativa desses parâmetros por mínimos quadrados.
- □ Como a condição \((\mathbf{y}-X\hat{\mathbf{w}})\perp\text{col}(X)\) equivale a \(X^T(\mathbf{y}-X\hat{\mathbf{w}})=\mathbf{0}\), isso significa que o resíduo \(\mathbf{y}-X\hat{\mathbf{w}}\) deve ser o vetor nulo sempre que \(X\) tiver posto completo.
5 Aplicação e Verificação no Dado Real
5.1 Calculando \(\hat{\mathbf{w}}\) de Verdade
Chegou a hora de aplicar a fórmula fechada do Passo (ii) ao problema motivador do Bloco 1: os \(N=16\,640\) bairros do California Housing, com \(X\in\mathbb{R}^{16640\times 4}\) (as colunas MedInc, HouseAge, AveRooms, AveBedrms) e \(\mathbf{y}\in\mathbb{R}^{16640}\) (MedHouseVal). Como a Aula 2 já verificou que \(X\) tem posto completo (\(\text{rk}(X)=4\)), \(X^TX\) é invertível, e a fórmula \(\hat{\mathbf{w}}=(X^TX)^{-1}X^T\mathbf{y}\) se aplica diretamente.
X_completo = _housing[COLS].to_numpy()
y_completo = _housing["MedHouseVal"].to_numpy()
# Equações Normais, resolvidas diretamente pela fórmula fechada
XtX = X_completo.T @ X_completo
Xty = X_completo.T @ y_completo
w_hat = np.linalg.inv(XtX) @ Xty
tabela_w = pd.DataFrame({"atributo": COLS, "ŵ": np.round(w_hat, 5)})
tabela_w| atributo | ŵ | |
|---|---|---|
| 0 | MedInc | 0.48761 |
| 1 | HouseAge | 0.01171 |
| 2 | AveRooms | -0.18809 |
| 3 | AveBedrms | 0.78255 |
A tabela mostra que o peso de maior módulo não é o de MedInc (\(\approx 0{,}488\)), como seria fácil supor à primeira vista, mas o de AveBedrms (\(\approx 0{,}783\)) — e isso é uma pista, não uma medida direta de importância. AveRooms e AveBedrms são atributos fortemente correlacionados (quantos cômodos, quantos são quartos — Bloco 6 volta a isso com números), e a Regressão Linear Múltipla estima cada peso na presença dos demais (Leitura 2 do produto matriz-vetor, Aula 2): quando duas colunas carregam quase a mesma informação, o modelo pode distribuir o efeito combinado entre elas de forma desequilibrada — um peso grande e positivo, o outro pequeno ou até negativo (AveRooms, \(\approx -0{,}188\)) — sem que isso signifique, isoladamente, que mais cômodos reduzam o preço. É um sintoma do problema de multicolinearidade que o Bloco 6 vai quantificar e explicar por que fragiliza numericamente \(X^TX\). O peso de MedInc (\(\approx 0{,}488\)), por não competir por informação redundante com nenhum outro atributo do modelo, tem leitura direta: cada unidade adicional de renda mediana está associada a um aumento de \(\approx 0{,}488\) (centenas de milhares de dólares) no preço previsto. Já HouseAge tem o menor peso em módulo (\(\approx 0{,}012\)) — a idade do imóvel, sozinha, quase não move a previsão depois de controlar pelos outros três atributos.
5.2 Conferência Independente: numpy.linalg.lstsq
A fórmula fechada é uma forma de calcular \(\hat{\mathbf{w}}\), mas não a única — numpy.linalg.lstsq resolve o mesmo problema de mínimos quadrados por um algoritmo numérico diferente (decomposição, não inversão explícita de \(X^TX\)). Se a nossa derivação do Bloco 4 estiver certa, as duas contas devem coincidir:
w_lstsq, *_ = np.linalg.lstsq(X_completo, y_completo, rcond=None)
print("w_hat (lstsq): ", np.round(w_lstsq, 5))
print("maior diferença absoluta:", np.max(np.abs(w_hat - w_lstsq)))w_hat (lstsq): [ 0.48761 0.01171 -0.18809 0.78255]
maior diferença absoluta: 1.3100631690576847e-14
A diferença máxima entre os dois vetores é da ordem de \(10^{-14}\) — zero, a menos de erro de arredondamento de ponto flutuante. Dois algoritmos completamente diferentes (inversão explícita de uma matriz \(4\times 4\) vs. decomposição numérica) chegam ao mesmo \(\hat{\mathbf{w}}\) — evidência de que a derivação do Bloco 4 não é só elegante no quadro, funciona com dados reais.
5.3 Verificando a Ortogonalidade do Resíduo
A promessa central do Passo (i) foi que o resíduo \(\mathbf{y}-X\hat{\mathbf{w}}\) é ortogonal a cada coluna de \(X\) — não uma afirmação vaga, uma igualdade numérica exata (até erro de arredondamento) que podemos checar:
residuo = y_completo - X_completo @ w_hat
print("Produto interno do resíduo com cada coluna de X:")
for j, nome in enumerate(COLS):
prod = residuo @ X_completo[:, j]
print(f" {nome:10s}: {prod:.3e}")Produto interno do resíduo com cada coluna de X:
MedInc : -4.522e-10
HouseAge : -5.039e-09
AveRooms : -8.756e-10
AveBedrms : -1.987e-10
Cada produto interno é da ordem de \(10^{-9}\) ou menor — e, colocado em perspectiva (dividindo pelas normas de cada vetor envolvido, para comparar “zero relativo” e não só “zero absoluto”), a proporção é da ordem de \(10^{-14}\): numericamente zero, exatamente como o Passo (i) exigia. Não é coincidência — é a própria equação \(X^T(\mathbf{y}-X\hat{\mathbf{w}})=\mathbf{0}\) (Passo i) verificada numericamente, coluna a coluna.
5.4 O Tamanho do Resíduo — o Que a Ortogonalidade Não Diz
Ortogonalidade garante a direção do erro (ele mora em \(\text{col}(X)^\perp\)), mas nada diz sobre o tamanho do erro. Vale a pena medir:
norma_residuo = np.linalg.norm(residuo)
norma_y = np.linalg.norm(y_completo)
r2 = 1 - np.sum(residuo**2) / np.sum((y_completo - y_completo.mean())**2)
print(f"||resíduo|| = {norma_residuo:.2f}")
print(f"||y|| = {norma_y:.2f}")
print(f"||resíduo||/||y|| = {norma_residuo/norma_y:.3f}")
print(f"R² = {r2:.3f}")||resíduo|| = 101.49
||y|| = 298.57
||resíduo||/||y|| = 0.340
R² = 0.518
O resíduo tem norma \(\approx 101{,}5\) contra \(\|\mathbf{y}\|\approx
298{,}6\) — não é pequeno; em termos de \(R^2\) (a fração da variação de MedHouseVal “explicada” pelo modelo), o ajuste é \(R^2\approx 0{,}518\): o modelo explica um pouco mais da metade da variação do preço usando só 4 atributos. Isso não é uma falha da matemática do Bloco 4 — a projeção ortogonal garante a melhor aproximação possível dentro do espaço-coluna de \(X\), não uma boa aproximação em termos absolutos. Com só 4 atributos (faltam localização, qualidade da construção, proximidade da costa, etc.), \(\text{col}(X)\) é um subespaço pequeno demais para chegar perto de \(\mathbf{y}\) — a projeção é ótima dentro das opções disponíveis, e as opções disponíveis são limitadas pelos atributos escolhidos, não pela matemática da projeção.
5.5 Vendo o Ajuste numa Amostra Concreta
Voltando à amostra de 6 bairros usada na Aula 2 (mesma semente, random_state=7) — agora com o \(\hat{\mathbf{w}}\) de verdade, ajustado a partir de todos os \(16\,640\) bairros, não mais um \(\mathbf{w}\) inventado:
Compare com o gráfico da Aula 2 (mesmos 6 bairros, \(\mathbf{w}\) inventado): os erros ali eram grandes e sem padrão claro; aqui, ainda há erro (esperado, dado o \(R^2\approx 0{,}518\)), mas o modelo já captura a tendência geral — o bairro 1 (renda mais alta) continua sendo o de previsão mais alta entre os seis, por exemplo. É a diferença entre “um \(\mathbf{w}\) qualquer” e “o \(\hat{\mathbf{w}}\) que resolve as Equações Normais”: o segundo não é perfeito, mas é matematicamente o melhor possível dentro do que os 4 atributos permitem.
lstsq?
Dica: o que muda entre lstsq e eliminação de Gauss é o algoritmo, não a equação que ambos resolvem. Isso muda a resposta?
- □ Comparar \(\hat{\mathbf{w}}\) (Equações Normais) com uma resolução por eliminação de Gauss do mesmo sistema \(X^TX\hat{\mathbf{w}}=X^T\mathbf{y}\) daria, a menos de erro de arredondamento, exatamente o mesmo vetor encontrado com
lstsq. - □ Se o produto interno do resíduo com cada coluna de \(X\) fosse exatamente zero (não apenas próximo de zero, mas matematicamente exato), isso seria uma coincidência numérica desta amostra específica, não uma consequência necessária da teoria.
- □ Num ajuste de crescimento populacional, com atributos em escalas bem diferentes das usadas nesta aula, a mesma verificação (produto interno do resíduo com cada coluna \(\approx 0\)) continuaria sendo um teste válido de que \(\hat{\mathbf{w}}\) foi calculado corretamente.
- □ Como o resíduo é ortogonal a cada coluna de \(X\), isso implica que o modelo ajustado explica quase toda a variação de \(\mathbf{y}\) (um \(R^2\) próximo de \(1\)).
6 Quando a Fórmula Falha, ou Fica Frágil
6.1 Reconectando com a Aula 2: Posto Completo
O Passo (ii) do Bloco 4 usou uma hipótese específica: \(X^TX\) é invertível se, e somente se, as colunas de \(X\) são linearmente independentes — ou seja, \(X\) tem posto completo, \(\text{rk}(X)=d\) (critério provado na Aula 2, Bloco 5). Essa não é uma hipótese técnica qualquer: é a única coisa que separa “\(\hat{\mathbf{w}}\) tem fórmula fechada” de “\(\hat{\mathbf{w}}\) não é sequer único”. Vamos ver os dois jeitos como essa hipótese pode falhar — um exato, um só numericamente frágil — reaproveitando exatamente os exemplos da Aula 2.
6.2 Caso 1: Multicolinearidade Exata — \(\hat{\mathbf{y}}\) Único, \(\hat{\mathbf{w}}\) Não
A Aula 2 fabricou uma quinta coluna, \(2\times\)AveRooms, e mostrou que o posto da matriz de design não sobe de 4 para 5 — a nova coluna não traz direção independente. Repetindo o experimento, agora olhando diretamente para a invertibilidade de \(X^TX\):
X_com_duplicata = np.column_stack([X_completo, 2.0 * X_completo[:, 2]])
print("posto de X: ", np.linalg.matrix_rank(X_completo))
print("posto de X com duplicata:", np.linalg.matrix_rank(X_com_duplicata))
XtX_dup = X_com_duplicata.T @ X_com_duplicata
print("det(X^T X com duplicata):", np.linalg.det(XtX_dup))
try:
np.linalg.inv(XtX_dup)
except np.linalg.LinAlgError as erro:
print("np.linalg.inv falha:", erro)posto de X: 4
posto de X com duplicata: 4
det(X^T X com duplicata): 0.0
np.linalg.inv falha: Singular matrix
\(\det(X^TX)=0\): a matriz é singular, e np.linalg.inv recusa explicitamente (“Singular matrix”) — não há fórmula fechada \(\hat{\mathbf{w}}=(X^TX)^{-1}X^T\mathbf{y}\) possível. Mas note a distinção crucial, já anunciada no Passo (i) do Bloco 4: a projeção \(\hat{\mathbf{y}}\) continua perfeitamente bem definida — é o ponto de \(\text{col}(X)\) mais próximo de \(\mathbf{y}\), e \(\text{col}(X)\) não mudou (a coluna redundante não acrescenta nenhuma direção nova, Aula 2). O que deixou de ser único é como distribuir o crédito entre AveRooms e sua cópia \(2\times\)AveRooms — infinitos \(\hat{\mathbf{w}}\) diferentes produzem exatamente o mesmo \(\hat{\mathbf{y}}=X\hat{\mathbf{w}}\). A sombra é única; a “receita” para chegar nela, não.
6.3 Caso 2: Quase-Multicolinearidade — \(X^TX\) Mal-Condicionada
Multicolinearidade exata é rara em dados reais. O problema mais comum, já visto na Aula 2, é a quase-dependência entre AveRooms e AveBedrms (correlação \(0{,}865\)) — posto continua completo (\(4\)), a fórmula fechada ainda existe, mas fica numericamente frágil. Reaproveitando exatamente a amostra de 20 bairros e a perturbação de 1% da Aula 2, agora olhando para o número de condição de \(X^TX\) em cada par:
_amostra_20 = _housing.sample(n=20, random_state=7)
X_quase_dep = _amostra_20[["AveRooms", "AveBedrms"]].to_numpy()
X_bem_cond = _amostra_20[["MedInc", "HouseAge"]].to_numpy()
cond_quase_dep = np.linalg.cond(X_quase_dep.T @ X_quase_dep)
cond_bem_cond = np.linalg.cond(X_bem_cond.T @ X_bem_cond)
print(f"número de condição de X^TX (AveRooms, AveBedrms): {cond_quase_dep:,.1f}")
print(f"número de condição de X^TX (MedInc, HouseAge): {cond_bem_cond:,.1f}")
print(f"\nnúmero de condição de X^TX completo (4 atributos): {np.linalg.cond(XtX):,.1f}")número de condição de X^TX (AveRooms, AveBedrms): 419.8
número de condição de X^TX (MedInc, HouseAge): 169.1
número de condição de X^TX completo (4 atributos): 23,460.5
O par quase-dependente tem número de condição \(\approx 420\) contra \(\approx 169\) do par bem-condicionado — mais do dobro, um sinal numérico direto de fragilidade (definição formal na Aula 4). Mas número de condição alto é uma promessa de instabilidade; para ver a instabilidade em si, é preciso repetir o experimento de perturbação da Aula 2 — não só citar o resultado de lá:
y_amostra_20 = _amostra_20["MedHouseVal"].to_numpy()
w_orig_qd, *_ = 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_pert_qd, *_ = np.linalg.lstsq(X_quase_dep, y_perturbado, rcond=None)
w_orig_bc, *_ = np.linalg.lstsq(X_bem_cond, y_amostra_20, rcond=None)
w_pert_bc, *_ = np.linalg.lstsq(X_bem_cond, y_perturbado, rcond=None)
print("Par quase-dependente (AveRooms, AveBedrms):")
print(f" variação relativa em w[AveRooms] = {abs(w_pert_qd[0]-w_orig_qd[0])/abs(w_orig_qd[0]):.1%}")
print(f" variação relativa em w[AveBedrms] = {abs(w_pert_qd[1]-w_orig_qd[1])/abs(w_orig_qd[1]):.1%}")
print("\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%}")Par quase-dependente (AveRooms, AveBedrms):
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%
Mesmo ruído (\(1\%\) do desvio-padrão de MedHouseVal), efeito muito diferente: o peso de AveBedrms oscila \(\approx 29{,}5\%\) no par quase-dependente, contra \(\approx 0{,}1\%\) no par bem-condicionado sob a mesma perturbação — quase 300 vezes mais sensível, exatamente como a Aula 2 já havia mostrado. O número de condição do \(X^TX\) com os 4 atributos completos (\(\approx 23\,460\)) é ainda maior, porque combina a informação redundante de AveRooms/AveBedrms com a escala natural de todos os atributos — mas o efeito é o mesmo em espécie: \(X^TX\) tecnicamente invertível, porém perto o suficiente de singular para que pequenos erros nos dados produzam grandes oscilações no \(\hat{\mathbf{w}}\) calculado.
A mesma distinção do Caso 1, com um grau de intensidade menor: a projeção \(\hat{\mathbf{y}}\) (a previsão do modelo) muda pouco com a perturbação — é a decomposição dos pesos \(\hat{\mathbf{w}}\) entre as duas colunas quase-redundantes que oscila. Medir e nomear essa sensibilidade com precisão — o número de condição, calculado a partir dos autovalores de \(X^TX\), não só estimado por um experimento de perturbação — é exatamente o que abre a Aula 4.
O diagrama resume os dois caminhos: multicolinearidade exata quebra a invertibilidade de \(X^TX\) (posto deficiente), enquanto multicolinearidade quase-exata preserva o posto completo mas deixa \(X^TX\) mal-condicionada — dois sintomas de gravidade diferente, mas da mesma causa raiz (colunas de \(X\) carregando informação redundante), com o mesmo alívio parcial em comum: a projeção \(\hat{\mathbf{y}}\) nunca é o problema; o problema mora inteiramente em como \(\hat{\mathbf{w}}\) tenta descrevê-la.
Dica: releia o que os números do Caso 2 mostraram sobre \(\hat{\mathbf{w}}\) vs. \(\hat{\mathbf{y}}\) — a instabilidade tem o mesmo tamanho nos dois?
- □ Se a coluna duplicada fabricada no Caso 1 fosse uma combinação de duas colunas originais (não um múltiplo de uma única coluna), em vez de exatamente \(2\times\)
AveRooms, o posto de \(X\) ainda cairia da mesma forma ao ser adicionada. - □ No caso-limite em que a correlação entre
AveRoomseAveBedrmsfosse exatamente \(1\) (em vez de \(0{,}865\)), \(X^TX\) deixaria de ser invertível, e a fórmula fechada \(\hat{\mathbf{w}}=(X^TX)^{-1}X^T\mathbf{y}\) deixaria de estar definida. - □ Num modelo de crédito com dois atributos quase redundantes (ex.: “renda mensal” e “renda anual dividida por 12”, com pequena diferença por arredondamento), o mesmo sintoma de instabilidade numérica no peso estimado apareceria, mesmo sem nenhuma coluna exatamente duplicada.
- □ Como \(X^TX\) mal-condicionada torna \(\hat{\mathbf{w}}\) instável, isso implica que a previsão \(\hat{\mathbf{y}}=X\hat{\mathbf{w}}\) também se torna proporcionalmente instável sob a mesma perturbação dos dados.
7 Fechamento e Ponte para a Aula 4
Retomando as perguntas de abertura
- O que significa “a melhor aproximação possível”? O ponto \(\hat{\mathbf{y}}\in\text{col}(X)\) que minimiza \(\|\mathbf{y}-\hat{\mathbf{y}}\|\) — e essa minimização é equivalente a uma condição geométrica exata: o resíduo ortogonal a todo o subespaço.
- O que é projetar sobre um subespaço, e por que resolve o problema? É encontrar exatamente esse \(\hat{\mathbf{y}}\) — a “sombra” perpendicular do Bloco 2, formalizada no Teorema da Projeção do Bloco 4.
- Como isso vira uma fórmula calculável? As Equações Normais, \(X^TX\hat{\mathbf{w}}=X^T\mathbf{y}\), e sob posto completo, \(\hat{\mathbf{w}}=(X^TX)^{-1}X^T\mathbf{y}\) — verificado com números reais no Bloco 5 (comparação com
lstsq, ortogonalidade do resíduo). - Quando essa fórmula falha, ou fica frágil? Multicolinearidade exata quebra a invertibilidade de \(X^TX\) (\(\hat{\mathbf{w}}\) não-único, \(\hat{\mathbf{y}}\) ainda único); quase-multicolinearidade preserva o posto completo, mas deixa \(X^TX\) mal-condicionada (\(\hat{\mathbf{w}}\) instável).
O Que Fica em Aberto
A fórmula fechada \(\hat{\mathbf{w}}=(X^TX)^{-1}X^T\mathbf{y}\) é a forma mais simples de descrever a solução — mas não é a forma mais estável de calculá-la quando \(X^TX\) está mal-condicionada, como o Bloco 6 acabou de mostrar. O número de condição foi usado aqui de forma empírica (perturbar os dados e medir o efeito) — a Aula 4 dá a ferramenta exata para medi-lo diretamente a partir da estrutura de \(X^TX\) (seus autovalores e autovetores), sem precisar perturbar nada. Essa mesma ferramenta é o que vai motivar, mais adiante no curso, métodos numéricos mais estáveis do que inverter \(X^TX\) diretamente — decomposição \(QR\) e \(SVD\) — que resolvem as Equações Normais sem nunca formar \(X^TX\) explicitamente.
8 Exercícios
8.1 Questões discursivas
Explique, com suas próprias palavras e usando a linguagem geométrica do Bloco 2 (a “sombra”), por que minimizar \(\|\mathbf{y}-X\mathbf{w}\|\) é equivalente à condição de ortogonalidade \((\mathbf{y}-X\hat{\mathbf{w}})\perp\text{col}(X)\). Por que essa equivalência é o que permite transformar um problema de otimização (minimizar uma distância) numa equação linear (as Equações Normais)?
Compare os dois casos do Bloco 6 — multicolinearidade exata (posto deficiente) e quase-multicolinearidade (posto completo, mas mal-condicionada) — explicando, para cada um, o que acontece com a projeção \(\hat{\mathbf{y}}\) e o que acontece com o vetor de pesos \(\hat{\mathbf{w}}\). Por que a distinção entre essas duas grandezas é a chave para entender os dois casos?
A Aula 2 provou que \(X^TX\) é invertível se, e somente se, \(X\) tem posto completo. Explique como essa condição de invertibilidade entra exatamente no Passo (ii) da derivação das Equações Normais desta aula, e o que aconteceria à derivação (não só ao resultado final) se essa condição não fosse satisfeita.
8.2 Questões de Verdadeiro/Falso
Cada bloco de 4 itens trata do mesmo tema. A questão só é considerada correta se todos os 4 itens forem julgados corretamente (deixar em branco tem penalidade de 20% da nota da questão).
8.3 Aviso
As questões de Verdadeiro/Falso e discursivas ficam sem solução neste arquivo — são para resolução autônoma do aluno, fora do horário de aula.