Solução do problema de quadrados mínimos discretos usando SVD
SVD = Decomposição em Valores Singulares
Toda matriz \(A (m×n)\) pode ser escrita como:
\[ A = U \Sigma V^T \]
\(U, V\): ortogonais | \(\Sigma\): diagonal com valores singulares
Problema clássico:
\[ \min \|Ax - b\|_2 \]
SVD fornece:
\[ x = A^+ b = V \Sigma^+ U^T b \]
\(i\) | Consumo (\(y\)) | Renda (\(x\)) |
---|---|---|
1 | 122 | 139 |
2 | 114 | 126 |
3 | 86 | 90 |
4 | 134 | 144 |
5 | 146 | 163 |
6 | 107 | 136 |
7 | 68 | 61 |
8 | 117 | 62 |
9 | 71 | 41 |
10 | 98 | 120 |
Dados (Wikipedia)
Modelo linear: \[ f(x) = \beta_0 + \beta_1 x \]
Resultado via SVD: -\(\beta_0 = 52{,}69\) -\(\beta_1 = 0{,}4954\)
Interpretação: > A cada aumento de 1 unidade de Renda, espera-se um aumento de 0,4954 unidades no Consumo.
Fórmula estimada: \[ \text{Consumo} = 52{,}69 + 0{,}4954 \times \text{Renda} \]
Exemplo:
A SVD permitiu obter coeficientes estáveis, mesmo com possível colinearidade nos dados.
Dados: população do país de 2000 a 2020
Modelo: \[ P(t) = a \cdot e^{bt} \]
Após logaritmo: \[ \ln P(t) = \ln a + bt \]
Transformado em modelo linear → aplicado SVD
Estimativas obtidas: -\(a \approx 1000\),\(b \approx 0{,}041\)
# Dados de crescimento populacional
anos = [2000, 2005, 2010, 2015, 2020]
pop = [1000, 1200, 1500, 1900, 2500]
# Normaliza o tempo e aplica log nos dados
t = anos .- minimum(anos)
y = log.(pop)
# Monta o sistema Ax = y
A_exp = hcat(ones(length(t)), t)
# Decomposição SVD
U, S, Vt = svd(A_exp)
# Cálculo da pseudo-inversa
tolerance_exp = max(size(A_exp)...) * eps(Float64) * S[1]
Sigma_plus_exp_diag = [s > tolerance_exp ? 1.0/s : 0.0 for s in S]
A_plus_exp = Vt * Diagonal(Sigma_plus_exp_diag) * U'
x_coeffs = A_plus_exp * y_log
c0, c1 = x_coeffs
# Recupera parâmetros a e b
a_exp = exp(c0)
b_exp = c1
Pontos fortes:
Pontos fracos:
Estatística e Ciência de Dados - UFPR