Aula 2: Vizinhos Mais Próximos, Maldição da Dimensionalidade e KDE

Aprendizado Não Supervisionado

Marcos M. Raimundo — Instituto de Computação, UNICAMP

2026-08-26

Abertura — O Que Fazer Sem Forma Paramétrica, e Sem \(N \gg d\)

Da Aula 1: O Que Fizemos

Problema sem rótulo: dado \(\mathbf{x}_1,\dots,\mathbf{x}_N\), descrever o comportamento típico de uma população para reconhecer o que se desvia dele (profiling).

Aposta: assumir uma família teórica — Gaussiana multivariada \(\mathcal{N}(\boldsymbol\mu,\Sigma)\) — e ajustá-la por máxima verossimilhança: \[\hat{\boldsymbol\mu}=\tfrac1N\sum_n\mathbf{x}_n, \qquad \hat\Sigma=\tfrac1N\sum_n(\mathbf{x}_n-\hat{\boldsymbol\mu})(\mathbf{x}_n-\hat{\boldsymbol\mu})^T\]

Decisão: distância de Mahalanobis, \(D_M(\mathbf{x})^2=(\mathbf{x}-\hat{\boldsymbol\mu})^T\hat\Sigma^{-1}(\mathbf{x}-\hat{\boldsymbol\mu})\)\(\hat\Sigma^{-1}\) estica nas direções de baixa variância, comprime nas de alta variância; não é a Euclidiana ingênua.

Da Aula 1: Conjunta vs. Por Dimensão, e as Rachaduras

\(D_M(\mathbf{x})^2\sim\chi^2_d\) vira \(p\)-valor. Rota conjunta (\(d(d+1)/2\) parâmetros, sensível a correlação) vs. por dimensão (supor independência, \(d\) parâmetros, combinados via Fisher) — a mesma tensão do Naive Bayes, agora em teste de hipótese.

Duas rachaduras já anunciadas: dados multimodais (uma Gaussiana só borra subpopulações distintas); outliers no ajuste (inflam \(\hat\Sigma\), escondem o que se queria detectar).

Uma terceira, mais estrutural — abre esta aula: \(\hat\Sigma\) só é invertível se \(N>d\). Sem isso, sem Mahalanobis, a receita trava antes de começar. E mesmo com \(N>d\), o ajuste piora conforme \(d\) cresce — o porquê ainda não foi explicado, só anunciado.

Da Aula 1 Para Hoje

Hoje: duas perguntas.

1. Por que “alta dimensão” quebra a intuição geométrica — não só uma questão de contar os \(d(d+1)/2\) parâmetros de \(\Sigma\)?

2. Sem assumir nenhuma forma para \(p(\mathbf{x})\) — nem Gaussiana, nem nenhuma outra família —, como estimar densidade deixando os dados “falarem por si”?

Pergunta

Se \(\hat\Sigma\) já quebra quando \(N<d\), o que exatamente quebra primeiro quando \(d\) cresce muito além disso, mesmo com \(N\) ainda maior que \(d\)?

Dica: pense no que significa “estimar uma direção de covariância” com poucos pontos por direção disponível.

  • □ Mesmo com \(N>d\) satisfeito, aumentar \(d\) ainda degrada a qualidade da estimativa de \(\hat\Sigma\), porque o número de parâmetros a estimar (\(d(d+1)/2\)) cresce muito mais rápido que \(d\).
  • □ O problema de alta dimensão é, fundamentalmente, um problema de contagem de parâmetros — resolvido bastando ter \(N\) grande o suficiente, sem nenhuma mudança qualitativa de comportamento geométrico.
  • □ Um método que não estima nenhuma matriz de covariância (como contar vizinhos) está, por isso, livre de qualquer versão da maldição da dimensionalidade.
  • □ A intuição geométrica de “perto” e “longe” formada em 2 ou 3 dimensões pode falhar quando aplicada ingenuamente a espaços de muitas dimensões.

Resposta

Resposta — o que quebra quando \(d\) cresce

  • \(d(d+1)/2\) cresce quadraticamente.
  • ✗ Só contagem de parâmetros, sem mudança geométrica — o próximo bloco mostra que é geométrico, não só de contagem.
  • \(k\)-NN livre da maldição por não estimar \(\Sigma\) — sofre sua própria versão, mais adiante nesta aula.
  • ✔ Intuição de baixa dimensão falha em alta dimensão.

Voltando à pergunta: o que quebra primeiro quando \(d\) cresce muito além de \(N>d\)? A resposta completa vem no Bloco 2 — é geométrico, não só uma questão de quantos parâmetros cabem em quantos dados.

Intuição — Contando e Somando Vizinhos

O Desafio

radius_mean: o raio médio do tumor medido no exame — um único número por paciente, dos 569 do Breast Cancer Wisconsin.

Desafio de hoje: para cada valor de \(x\) no eixo, esse valor é comum entre os pacientes, ou raro? Ainda sem fórmula — duas heurísticas, quase algorítmicas.

Heurística 1: Contar Dentro de um Raio Fixo

Escolha um raio \(r\) (ex.: \(r=1\)). Para cada \(x\) testado, marque a janela \([x-r,\,x+r]\) e conte quantos dos 569 pacientes caem dentro. Deslize \(x\) pelo eixo, repetindo a contagem.

Contagem alta = comum. Contagem baixa (ou zero) = raro.

Aspereza: paciente a \(0{,}99\) de \(x\) conta como “dentro” (peso \(1\)); a \(1{,}01\), “fora” (peso \(0\)) — corte abrupto para uma diferença mínima.

Heurística 2: Peso Descontado pela Distância

Suavize o corte: cada paciente contribui com um peso que desconta continuamente com a distância até \(x\) — alto perto, caindo aos poucos até quase zero, sem degrau.

Some os pesos dos 569 pacientes em cada \(x\): muita gente parecida por perto acumula peso; pouca gente, quase nada sobra. Mesma pergunta da Heurística 1, sem o corte brusco do raio rígido.

Comparação

O que já dá para ver: as duas curvas concordam — pico alto perto de 12 (comum), cauda longa depois de 20 (raro). Os traços cinzas são os 569 pacientes reais, e as curvas sobem exatamente onde eles se concentram.

Heurística 1 (raio fixo, contagem dura) = janela de Parzen (KDE). Heurística 2 (peso suave) = KDE com kernel gaussiano — resolve a aspereza da Heurística 1.

Fixar a contagem em vez do raio (deixando o raio variar) dá o \(k\)-NN — a rota gêmea. Falta entender por que “andar para os dois lados” fica estranho com 30 atributos em vez de 1 (próximo bloco).

Pergunta

As duas curvas do gráfico anterior quase se sobrepõem — mas vêm de contas bem diferentes. Por que elas concordam tanto?

Dica: pense no que cada uma está, no fundo, tentando responder — não em como cada conta é feita por dentro.

  • □ As duas curvas concordam porque as duas são formas diferentes de responder à mesma pergunta — “quantos pacientes parecidos há perto de \(x\)?” — só que uma fixa o número de vizinhos e mede a distância, e a outra fixa a distância (via peso decrescente) e soma quantos contribuem.
  • □ As duas curvas concordariam da mesma forma mesmo que a curva 1 fosse construída ordenando os pacientes por ordem alfabética do prontuário, em vez de por proximidade em radius_mean.
  • □ Se todos os 569 pacientes tivessem exatamente o mesmo valor de radius_mean, as duas curvas ainda seriam bem diferentes uma da outra nesse ponto.
  • □ A curva 1 (contar vizinhos) usa informação sobre a posição de cada paciente no eixo; a curva 2 (somar contribuições) também usa essa posição — nenhuma das duas ignora onde, exatamente, cada paciente está.

Resposta

Resposta — por que as curvas concordam

  • ✔ Concordam por responderem à mesma pergunta de formas opostas.
  • ✗ Concordariam do mesmo jeito ordenando por prontuário em vez de por proximidade — as duas contas dependem inteiramente da posição real em radius_mean, não da ordem de listagem.
  • ✗ Todos com o mesmo valor, curvas ainda diferentes nesse ponto — as duas disparariam juntas nesse caso extremo (máxima concentração possível).
  • ✔ As duas usam a posição de cada paciente no eixo.

Voltando à pergunta: concordam porque são duas contas diferentes para a mesma pergunta. Os Blocos 3–6 mostram que vêm, de fato, da mesma identidade matemática.

A Maldição da Dimensionalidade, Geometricamente

Volume que se Esconde na Casca

“if we divide a region of a space into regular cells […] the number of such cells grows exponentially with the dimensionality” — PRML, p. 121

“in spaces of high dimensionality, most of the volume of a sphere is concentrated in a thin shell near the surface” — PRML, p. 37

epsilon = 0.05
for D in [1, 2, 5, 10, 30, 100]:
    frac = 1 - (1 - epsilon) ** D
    print(f"D={D:3d}: fração do volume na casca de espessura ε=0.05  ≈ {frac:.3f}")
D=  1: fração do volume na casca de espessura ε=0.05  ≈ 0.050
D=  2: fração do volume na casca de espessura ε=0.05  ≈ 0.098
D=  5: fração do volume na casca de espessura ε=0.05  ≈ 0.226
D= 10: fração do volume na casca de espessura ε=0.05  ≈ 0.401
D= 30: fração do volume na casca de espessura ε=0.05  ≈ 0.785
D=100: fração do volume na casca de espessura ε=0.05  ≈ 0.994

Três Bolas de Verdade: \(D=1\), \(D=2\), \(D=3\)

Mesmo raio, três dimensões — as únicas em que dá para desenhar a bola sem nenhum truque: \(D=1\) (segmento), \(D=2\) (disco), \(D=3\) (esfera).

Núcleo = raio geométrico real \(1-\epsilon\) em cada dimensão — sem analogia. \(D=1\): comprimento \(\propto r\). \(D=2\): área \(\propto r^2\). \(D=3\): volume \(\propto r^3\).

A casca já cresce visivelmente de \(D=1\) para \(D=3\) — o efeito fica dramático de verdade em \(D=10,30,100\), no cálculo numérico a seguir (nenhum desenho literal é mais possível ali).

Em \(D=100\): Quase Todo o Volume na Casca

  • Em \(D=100\), praticamente 100% do volume de uma esfera mora nos últimos 5% do raio (\(\epsilon=0{,}05\)). A intuição “o centro concentra a massa” — válida em 1, 2 ou 3 dimensões — se inverte por completo.
  • “for large D the probability mass of the Gaussian is concentrated in a thin shell” — PRML, p. 37

  • O mesmo vale para uma Gaussiana: a massa se afasta da média e se acumula numa casca fina — nem perto do centro, nem espalhada uniformemente.

O Mesmo Efeito, do Ponto de Vista de um Vizinho

Quero capturar uma fração \(r\) dos dados usando uma caixa (hipercubo) centrada num ponto. De que tamanho precisa ser essa caixa, em cada uma das \(p\) dimensões?

\(e_p(r)\) = aresta da caixa, como fração da amplitude da variável (\(e_p(r)=1\) = cobre a variável inteira).

Caixa de aresta \(e\) em \(p\) dimensões captura fração \(e^p\) do volume (mesma identidade \(r^D\) do Bloco 2). Resolvendo \(e^p=r\): \[e_p(r) = r^{1/p}\]

“para capturar 1% ou 10% dos dados […] precisamos cobrir 63% ou 80% da amplitude de cada variável […] Essas vizinhanças deixaram de ser ‘locais’.” — ESL, p. 22 (tradução nossa)

for p in [1, 2, 10, 30]:
    e10 = 0.10 ** (1 / p)
    print(f"p={p:3d}: para capturar 10% dos dados, cobrir {e10:.2%} da amplitude de cada eixo")
p=  1: para capturar 10% dos dados, cobrir 10.00% da amplitude de cada eixo
p=  2: para capturar 10% dos dados, cobrir 31.62% da amplitude de cada eixo
p= 10: para capturar 10% dos dados, cobrir 79.43% da amplitude de cada eixo
p= 30: para capturar 10% dos dados, cobrir 92.61% da amplitude de cada eixo

Em \(p=1\) ou \(p=2\), cobrir 10% dos dados exige uma fatia pequena do eixo — ainda “local” de verdade.

Em \(p=30\): é preciso cobrir 93% da amplitude de cada variável só para capturar 10% dos dados — a caixa quase engole a variável inteira. A vizinhança deixou de ser local há muito tempo.

Mais Perto da Borda do que de Qualquer Vizinho

“The median distance from the origin to the closest data point […] For N = 500, p = 10, \(d(p,N)\approx 0.52\), more than halfway to the boundary.” — ESL, pp. 22–23

Importante

Com \(N=500\), \(D=10\): o vizinho mais próximo da origem está, em mediana, mais perto da fronteira do espaço do que de qualquer outro ponto.

Consequência: Distâncias Deixam de Discriminar

Os dois resultados anteriores — volume na casca, vizinho perto da borda — apontam para o mesmo problema prático: em alta dimensão, todo mundo fica a distâncias parecidas de todo mundo.

Como medir isso diretamente? Contraste relativo: fixe um ponto de consulta, calcule a distância a todos os outros pontos, compare a mínima com a máxima.

\[\text{contraste} = \frac{\text{dist}_{\max}-\text{dist}_{\min}}{\text{dist}_{\min}}\]

Exemplo: Breast Cancer Wisconsin

ds_list = [2, 5, 10, 20, 30]
medias, desvios = [], []
for d in ds_list:
    m, s = relative_contrast(X_std, d, n_trials=60)
    medias.append(m)
    desvios.append(s)
    print(f"d={d:2d}  contraste relativo médio = {m:6.2f}  (desvio {s:.2f})")
d= 2  contraste relativo médio = 247.61  (desvio 294.79)
d= 5  contraste relativo médio =  27.07  (desvio 19.12)
d=10  contraste relativo médio =  17.26  (desvio 9.45)
d=20  contraste relativo médio =   9.96  (desvio 5.33)
d=30  contraste relativo médio =  10.19  (desvio 3.69)

De \(\approx 220\) (2 atributos) para \(\approx 10\) (30 atributos) — no próprio Breast Cancer Wisconsin, não num dado simulado. A maldição da dimensionalidade não é só teoria de livro: aparece exatamente nestes 30 atributos de exame clínico.

Pergunta

Se distâncias deixam de discriminar em alta dimensão, o que isso quebra primeiro: um classificador ou um estimador de densidade?

Dica: pense em cada item separadamente — nem todos têm a mesma resposta.

  • □ Se a distância entre o ponto de consulta e seu vizinho mais próximo, e a distância até o ponto mais distante, convergem para o mesmo valor conforme \(d\) cresce, então a ordem dos \(k\) vizinhos mais próximos de um ponto se torna cada vez mais sensível a perturbações minúsculas nos dados.
  • □ No limite em que o contraste relativo é exatamente zero, todo subconjunto de \(k\) pontos escolhido por proximidade é, na prática, uma escolha tão informativa quanto um subconjunto de \(k\) pontos escolhido aleatoriamente.
  • □ Se um dataset tem 30 atributos mas apenas 3 deles carregam informação relevante (os outros 27 são ruído independente da variável de interesse), aumentar a dimensionalidade usada de 3 para 30 sempre melhora a qualidade da estimativa de densidade local.
  • □ A fórmula \(e_p(r) = r^{1/p}\) do ESL implica que, para qualquer \(r<1\) fixo, o comprimento de aresta necessário cresce (se aproxima de
    1. conforme \(p\) aumenta.

Resposta

Resposta — distâncias que deixam de discriminar

  • ✔ Ordem dos \(k\) vizinhos fica sensível a ruído.
  • ✔ Contraste zero → escolha por proximidade tão informativa quanto aleatória.
  • ✗ 27 atributos de ruído + 3 informativos, aumentar \(d\) sempre melhora — dilui o sinal, piora a estimativa.
  • \(e_p(r)=r^{1/p}\) cresce para 1 conforme \(p\) aumenta.

Voltando à pergunta: quebra os dois — mas de formas diferentes, que os Blocos 3–5 vão precisar resolver de jeitos distintos (\(k\)-NN e KDE).

Da Ideia Geral ao Estimador: \(p(\mathbf{x}) = K/(NV)\)

Premissas Desta Derivação

1. Ponto de consulta e vizinhança. Fixamos \(\mathbf{x}\) e uma região pequena \(R\) ao redor, de volume \(V\) — olhamos para dentro dela para decidir se \(\mathbf{x}\) está numa parte densa ou rala do espaço.

2. Densidade quase constante em \(R\). \(R\) pequena o bastante para tratar \(p(\mathbf{x})\) como um valor único ali dentro, não uma função que varia. Permite trocar uma integral por uma multiplicação (Passo 2).

3. Amostragem independente. Os \(N\) pontos vêm, cada um por conta própria, da mesma \(p(\mathbf{x})\) — é isso que permite tratar “quantos caem em \(R\)” como uma contagem binomial (Passo 3).

O Desenvolvimento, Passo a Passo

1. \(P=\int_R p(\mathbf{x})\,d\mathbf{x}\) (massa de probabilidade em \(R\)).

2. Assumimos que \(p(\mathbf{x})\) é aproximadamente constante em \(R\) \(\Rightarrow\) \(P\simeq p(\mathbf{x})V\).

3. Cada um dos \(N\) pontos, independente, tem probabilidade \(P\) de cair em \(R\) — como uma moeda viciada. Contar quantos “dão cara” em \(N\) lançamentos independentes é, por definição, \(K\sim\mathrm{Bin}(N,P)\).

4. \(\mathrm{Bin}(N,P)\) tem média \(NP\) e desvio \(\sqrt{NP(1-P)}\) — o desvio relativo encolhe como \(1/\sqrt{N}\). Para \(N\) grande, \(K\) se concentra perto de \(NP\) (mesma lógica de “1 milhão de moedas dá ~50% caras”): \(K\simeq NP\).

5. Combinando 2 e 4: \[p(\mathbf{x}) = \frac{K}{NV}\]

A Tensão Que as Premissas Deixam

Nota

Premissa 2 pede \(V\) pequeno (densidade quase constante). Passo 4 pede \(V\) grande o bastante para \(K\) não ser ruidoso. As duas puxam \(V\) em direções opostas.

\(k\)-NN e KDE não são duas técnicas parecidas — são a mesma identidade \(p(\mathbf{x})=K/(NV)\), explorada de dois lados opostos do mesmo trade-off em \(V\).

Pergunta

A fórmula \(p(\mathbf{x})=K/(NV)\) tem uma tensão interna: \(V\) precisa ser pequeno e grande ao mesmo tempo. Isso é uma contradição real, ou só parece uma?

Dica: pense em “pequeno o bastante para quê” e “grande o bastante para quê”, separadamente.

  • \(V\) precisa ser pequeno para que a suposição de densidade aproximadamente constante dentro da região seja razoável.
  • \(V\) precisa ser grande para que o número esperado de pontos capturados, \(K\), seja alto o suficiente para a aproximação binomial ser confiável.
  • □ Como as duas exigências sobre \(V\) apontam em direções opostas, não existe nenhum valor de \(V\) que funcione razoavelmente bem na prática.
  • □ A tensão entre “pequeno” e “grande” para \(V\) é resolvida de forma diferente pelas duas rotas (\(k\)-NN e KDE), não eliminada por nenhuma das duas.

Resposta

Resposta — a tensão interna de \(K/(NV)\)

  • \(V\) pequeno para densidade quase constante.
  • \(V\) grande para \(K\) confiável.
  • ✗ Nenhum valor funciona na prática — valores intermediários funcionam razoavelmente bem, como veremos.
  • ✔ Cada rota resolve a tensão de um jeito diferente.

Voltando à pergunta: não é uma contradição — é um trade-off. \(k\)-NN e KDE resolvem esse trade-off de formas opostas, como veremos agora.

\(k\)-Vizinhos-Mais-Próximos Para Densidade

Premissas Desta Rota

Nota

  1. \(K\) fixado de antemão.
  2. \(V\) determinado pelos dados: esfera cresce até conter exatamente \(K\) pontos.

“we consider a fixed value of K […] we allow the radius of the sphere to grow until it contains precisely K data points. […] This technique is known as K nearest neighbours.” — PRML, pp. 124–125

Fixar \(K\), Deixar \(V\) Crescer

1. \(d_K(\mathbf{x})\) = raio da esfera = distância ao \(K\)-ésimo vizinho.

2. Volume \(\propto r^D\) em \(D\) dimensões \(\Rightarrow\) \(V\propto d_K(\mathbf{x})^D\).

3. Substituindo em \(p(\mathbf{x})=K/(NV)\): \[p(\mathbf{x}) \propto \frac{1}{d_K(\mathbf{x})^D}\]

Nota

  • Bairro denso\(K\) vizinhos próximos → \(d_K\) pequeno → densidade alta.
  • Bairro isolado\(d_K\) grande → densidade baixa.

Exemplo: Breast Cancer Wisconsin

Aplicando isso a radius_mean do Breast Cancer Wisconsin, em três pontos-teste e três valores de \(K\):

for K in [5, 20, 50]:
    for x0 in [12.0, 17.5, 25.0]:
        dens = knn_density_1d(np.array([x0]), x_radius, K)[0]
        print(f"K={K:3d}  x0={x0:5.1f}  densidade estimada ≈ {dens:.4f}")
    print()
K=  5  x0= 12.0  densidade estimada ≈ 0.1098
K=  5  x0= 17.5  densidade estimada ≈ 0.0549
K=  5  x0= 25.0  densidade estimada ≈ 0.0029

K= 20  x0= 12.0  densidade estimada ≈ 0.1598
K= 20  x0= 17.5  densidade estimada ≈ 0.0399
K= 20  x0= 25.0  densidade estimada ≈ 0.0046

K= 50  x0= 12.0  densidade estimada ≈ 0.1515
K= 50  x0= 17.5  densidade estimada ≈ 0.0382
K= 50  x0= 25.0  densidade estimada ≈ 0.0083

Exemplo: Breast Cancer Wisconsin

Considerações

Os traços cinzas no eixo x (o rug plot, um traço por paciente) mostram duas concentrações visíveis de pontos — já sugerindo que radius_mean não é unimodal. Voltamos a isso no Bloco 6.

Aviso: Isto Não é Uma Densidade de Verdade

“the model produced by K nearest neighbours is not a true density model because the integral over all space diverges.” — PRML, p. 125

Pergunta

Se \(K\) é fixo e \(d_K(\mathbf{x})\) é o raio que cresce até capturar \(K\) pontos, o que acontece exatamente quando \(K=N\) (todos os pontos)?

Dica: pense no que acontece com \(d_K\) quando a esfera precisa englobar o conjunto de dados inteiro.

  • □ Se \(K=N\) (todos os pontos de treino), \(d_K(\mathbf{x})\) é a mesma para qualquer \(\mathbf{x}\) dentro do suporte dos dados, igual à distância até o ponto mais distante — e a densidade estimada por \(k\)-NN se torna praticamente constante em todo o espaço.
  • □ Um ponto que está exatamente na posição de um outro ponto de treino (distância zero) faria a densidade estimada por \(k\)-NN, com \(K=1\), divergir para infinito.
  • □ Aumentar \(K\) de 5 para 50, num ponto que já está numa região muito densa, deveria produzir uma mudança relativa muito menor em \(d_K(\mathbf{x})\) do que a mesma mudança de \(K\) produziria num ponto isolado na cauda da distribuição.
  • □ Como a densidade por \(k\)-NN não integra a 1, ela nunca pode ser usada para comparar, de forma válida, se um ponto é mais ou menos denso do que outro.

Resposta

Resposta — o limite \(K=N\)

  • \(d_N(\mathbf{x})\) quase constante, densidade quase uniforme.
  • \(K=1\) em ponto coincidente diverge.
  • ✔ Variação de \(d_K\) menor em região densa que na cauda — suavização adaptativa.
  • ✗ Não integrar a 1 impede comparação relativa — comparação relativa continua válida.

Voltando à pergunta: \(K=N\) é o extremo de “borrar tudo” — o análogo, no \(k\)-NN, do \(h\to\infty\) que veremos daqui a pouco no KDE.

Do Histograma ao Kernel Suave: KDE

Premissas Desta Rota

Nota

  1. \(V\) fixado de antemão: hipercubo de lado \(h\) centrado em \(\mathbf{x}\).
  2. \(K\) determinado pelos dados: conta-se quantos pontos caem dentro.

Fixar \(V\): a Janela de Parzen, Passo a Passo

1. \(k(u)=1\) se \(|u_i|\le 1/2\) — janela dura do hipercubo.

2. \(K=\sum_n k\left(\frac{\mathbf{x}-\mathbf{x}_n}{h}\right)\).

3. Substituindo em \(p(\mathbf{x})=K/(NV)\), com \(V=h^D\): \[p(\mathbf{x})=\frac{1}{N}\sum_n \frac{1}{h^D}k\left(\frac{\mathbf{x}-\mathbf{x}_n}{h}\right)\]

Aviso

Problema: descontinuidades artificiais nas bordas do cubo — o mesmo problema do histograma.

Do Cubo ao Kernel Gaussiano

4. Trocando \(k(\cdot)\) por uma gaussiana no Passo 1, o mesmo Passo 3 leva a: \[p(\mathbf{x}) = \frac{1}{N}\sum_{n=1}^N \frac{1}{(2\pi h^2)^{1/2}} \exp\left(-\frac{\|\mathbf{x}-\mathbf{x}_n\|^2}{2h^2}\right)\]

Uma gaussiana de largura \(h\) sobre cada ponto — somadas, normalizadas. \(h\) é o parâmetro de suavização, o mesmo papel que \(K\) tinha na rota anterior.

“the parameter h plays the role of a smoothing parameter, and there is a trade-off between sensitivity to noise at small h and over-smoothing at large h.” — PRML, p. 124

Exemplo: Breast Cancer Wisconsin

Verificando isso em radius_mean, contando picos (máximos locais) da densidade estimada para três larguras de banda:

for h in [0.3, 1.0, 3.0]:
    dens = gaussian_kde_1d(grid, x_radius, h)
    picos = ((dens[1:-1] > dens[:-2]) & (dens[1:-1] > dens[2:])).sum()
    print(f"h={h:.1f}: {picos:2d} picos detectados, densidade máxima {dens.max():.4f}")
h=0.3: 12 picos detectados, densidade máxima 0.1541
h=1.0:  3 picos detectados, densidade máxima 0.1403
h=3.0:  1 picos detectados, densidade máxima 0.0913

Ajustando os parâmetros

\(h\) Pequeno, \(h\) Grande, \(h\) Certo: \(h=0.3\): 12 picos (ruído). \(h=3.0\): 1 pico (borra tudo). \(h=1.0\): 3 picos — melhor candidato.

O Mesmo Parâmetro, Três Disfarces

Histograma \(k\)-NN KDE
\(\Delta\) \(K\) \(h\)

Sempre o mesmo trade-off: pequeno demais é ruído, grande demais borra estrutura.

Pergunta

Se \(h\to\infty\) no KDE gaussiano, o que exatamente acontece com a forma da densidade estimada?

Dica: pense no que acontece com cada gaussiana individual quando sua largura cresce sem limite.

  • □ No limite \(h\to\infty\), a densidade estimada por KDE gaussiano se torna aproximadamente constante em qualquer região finita do espaço — a mesma degenerescência de “borrar tudo” vista no limite \(K=N\) do \(k\)-NN.
  • □ No limite \(h\to 0\), o KDE gaussiano converge para uma soma de funções delta centradas em cada ponto de treino, e a densidade estimada em qualquer ponto que não seja exatamente um dado de treino tende a zero.
  • □ Se dois conjuntos de dados têm o mesmo número de pontos \(N\), mas um deles está mais espalhado (maior variância), usar o mesmo valor fixo de \(h\) para os dois produzirá, em geral, o mesmo grau relativo de suavização nos dois casos.
  • □ A escolha de \(h\) no KDE é conceitualmente equivalente à escolha da largura de bin \(\Delta\) num histograma — ambas controlam o mesmo trade-off entre ruído e viés.

Resposta

Resposta — o limite \(h\to\infty\)

  • \(h\to\infty\) borra tudo, análogo a \(K=N\).
  • \(h\to 0\) vira soma de deltas.
  • ✗ Mesmo \(h\) fixo, mesmo grau de suavização relativa em escalas diferentes — o mesmo \(h\) suaviza mais o conjunto mais concentrado.
  • \(h\) equivalente a \(\Delta\) do histograma.

Voltando à pergunta: \(h\to\infty\) degenera exatamente como \(K=N\) no \(k\)-NN — dois caminhos, mesma degenerescência final.

\(k\)-NN vs. KDE, Lado a Lado, no Dado Real

KDE vs. \(k\)-NN, Mesma Variável

Fixo vs. Adaptativo: os Números

tree = cKDTree(x_radius.reshape(-1, 1))
for x0 in [12.0, 25.0]:
    for K in [5, 20, 50]:
        dist, _ = tree.query([[x0]], k=K)
        print(f"x0={x0:5.1f}  K={K:3d}  d_K={dist[0, -1]:.3f}")
x0= 12.0  K=  5  d_K=0.040
x0= 12.0  K= 20  d_K=0.110
x0= 12.0  K= 50  d_K=0.290
x0= 25.0  K=  5  d_K=1.490
x0= 25.0  K= 20  d_K=3.840
x0= 25.0  K= 50  d_K=5.270

Em \(x_0=12\) (região densa): \(d_K\) cresce pouco de \(K=5\) para \(K=50\) — a janela quase não precisa se abrir.

Em \(x_0=25\) (cauda, poucos pontos): \(d_K\) cresce muito mais rápido. O KDE, com \(h\) fixo, não tem esse ajuste — a mesma janela em toda parte.

Encontramos 3 Picos com \(h=1.0\): O que são esses picos, de fato?

O Que a Estrutura de 3 Picos Realmente É

O que o Rótulo (Nunca Usado) Revela

O rótulo de diagnóstico — nunca usado em nenhum dos ajustes anteriores — explica a estrutura de 3 picos: os tumores benignos têm radius_mean médio \(\approx 12{,}1\), os malignos \(\approx 17{,}5\).

O KDE e o \(k\)-NN, sem ver rótulo nenhum, já haviam capturado essa mistura de duas subpopulações na forma da densidade estimada.

Nenhum dos Dois Escapa da Maldição

“both the K-nearest-neighbour method, and the kernel density estimator, require the entire training data set to be stored” — PRML, p. 127

Importante

ESL: densidade amostral \(\propto N^{1/p}\)\(100\) pontos em 1D exigiriam \(100^{10}\) em 10D, para a mesma cobertura local.

Pergunta

A estrutura de 3 picos que vimos “some” se a suavização for pequena o bastante para revelar 2 picos em vez de 3 — o que isso significa sobre o método?

Dica: pense em como a concordância (ou discordância) entre dois métodos independentes ajuda a distinguir sinal real de artefato.

  • □ Se KDE e \(k\)-NN, sem usar o rótulo de diagnóstico, produzem densidades estimadas com formas visivelmente parecidas entre si, isso é evidência de que a estrutura bimodal encontrada reflete algo real nos dados, não um artefato de um método específico.
  • □ Numa região onde a densidade real varia muito de um lado para o outro, o KDE com \(h\) fixo tende a suavizar demais nessa fronteira, comparado ao \(k\)-NN, que reduz \(d_K\) automaticamente onde há mais pontos por perto.
  • □ Como tanto \(k\)-NN quanto KDE evitam a suposição de forma funcional da Gaussiana da Aula 1, nenhum dos dois herda qualquer versão da restrição \(N>d\) que limitava o ajuste de \(\hat\Sigma\).
  • □ Se o objetivo fosse só comparar a densidade relativa entre dois pontos específicos (qual dos dois está numa região mais densa), o fato de \(k\)-NN não integrar a 1 não impediria essa comparação.

Resposta

Resposta — concordância entre métodos independentes

  • ✔ Concordância entre KDE e \(k\)-NN sugere estrutura real.
  • ✔ KDE suaviza demais na fronteira, \(k\)-NN se adapta.
  • ✔ Nenhum herda a restrição \(N>d\) (mas ambos herdam outra versão da maldição — armazenamento, \(N^{1/p}\)).
  • ✔ Comparação relativa continua válida sem normalizar.

Voltando à pergunta: significa que a estrutura é real — dois métodos independentes, mecanismos diferentes, mesma conclusão.

Armadilhas, Custo, e Ponte Para a Aula 3

O Preço de Não Assumir Forma Nenhuma

Aula 1: \(N\) pontos → resumidos em \(\hat{\boldsymbol\mu}, \hat\Sigma\) → dados descartáveis.

Aviso

Hoje: “both […] require the entire training data set to be stored” — PRML, p. 127. Sem forma paramétrica, os dados são o modelo.

O Que Fica Desta Aula

1. Por que alta dimensão é geometricamente estranha? Volume se concentra numa casca fina; vizinhanças deixam de ser “locais”; distâncias perdem poder de discriminação — verificado no dado real.

2. Como estimar densidade sem assumir forma nenhuma? \(p(\mathbf{x}) = K/(NV)\) — fixar \(K\) e achar \(V\)\(k\)-NN; fixar \(V\) e contar \(K\) dá KDE.

3. Nenhum dos dois escapa da maldição. Custo de armazenamento, densidade amostral \(\propto N^{1/p}\) — a maldição só troca de forma.

Ponte para a Aula 3: \(d_K(\mathbf{x})\) — hoje, uma ferramenta para estimar densidade. Na Aula 3: a mesma distância, usada como métrica de densidade local para construir caminhos num grafo — a base de Clustering Hierárquico e HDBSCAN.