LABORATÓRIO RBF 02 · REGRESSÃO

Uma curva construída pela soma de respostas locais.

Sete funções Gaussianas cobrem diferentes regiões do eixo x. A saída linear aprende quanto cada curva-base deve contribuir para aproximar uma relação não linear.

xentradaφ₁ … φ₇bases locaisΣwⱼφⱼ+bcombinaçãoŷvalor contínuo
1

Centros distribuídos

Sete centros cobrem o intervalo de x = −3 até x = 3.

c = [−3, −2, …, 3]
2

Bases locais

Cada Gaussiana responde em uma parte diferente do domínio.

φⱼ(x)=e−1,10(x−cⱼ)²
3

Soma ponderada

Pesos positivos elevam a curva; pesos negativos reduzem a previsão naquela região.

ŷ=b+Σwⱼφⱼ(x)
ÉPOCAS0
MSE
RMSE

Aproximação não linear

Os pontos são alvos; a linha mostra a função aprendida pela RBF.

Saída não treinada
dados reaiscurva previstacentros

As sete funções de base

Cada curva atinge 1 sobre seu próprio centro e diminui com a distância.

Último treinamento, passo a passo

Ativações locais, previsão, erro e atualização dos sete pesos.

Treine uma época para abrir as contas.

Erro × resposta

O erro cai enquanto R² se aproxima de 1. Para compartilhar a escala vertical, o gráfico divide o MSE pelo seu valor inicial e mostra R² entre 0 e 1.

MSE ÷ MSE inicialR² no intervalo 0–1

Resultado em cada amostra

O erro e = y − ŷ participa diretamente do ajuste linear.

CÓDIGO COMPLETO E EXECUTÁVEL

Treine, avalie e use uma RBF regressora

O exemplo aproxima uma curva seno, calcula o erro quadrático médio e prevê um valor que não estava no treino.

gaussiana()forward()treinar()calcularMSE()prever()
rbf-regressao-completa.jsexecute do início ao fim
// 1. Dados [x, y] amostrados da função seno.
var treino = [
  [-3, -0.141], [-2.5, -0.598], [-2, -0.909], [-1.5, -0.997],
  [-1, -0.841], [-0.5, -0.479], [0, 0], [0.5, 0.479],
  [1, 0.841], [1.5, 0.997], [2, 0.909], [2.5, 0.598], [3, 0.141]
];

// 2. Os sete centros cobrem diferentes regiões do eixo x.
var centros = [-3, -2, -1, 0, 1, 2, 3];
var pesos = [0, 0, 0, 0, 0, 0, 0];
var bias = 0;
var gamma = 1.10;

// 2. Calcula a resposta local de uma Gaussiana.
function gaussiana(x, centro) {
  var distancia = x - centro;
  return Math.exp(-gamma * distancia * distancia);
}

// 3. Soma as sete respostas ponderadas para produzir ŷ.
function forward(x) {
  var ativacoes = [];
  var previsao = bias;
  for (var j = 0; j < centros.length; j++) {
    ativacoes[j] = gaussiana(x, centros[j]);
    previsao = previsao + pesos[j] * ativacoes[j];
  }
  return [previsao, ativacoes];
}

// 4. Compara o valor desejado y com a previsão contínua ŷ.
function calcularErro(y, previsao) {
  return y - previsao;
}

// 5. Aplica a Regra Delta somente na camada linear de saída.
function ajustarSaida(ativacoes, erro, taxa) {
  for (var j = 0; j < pesos.length; j++) {
    pesos[j] = pesos[j] + taxa * erro * ativacoes[j];
  }
  bias = bias + taxa * erro;
}

// 6. Reúne as etapas do treinamento de uma amostra.
function treinarAmostra(x, y, taxa) {
  var resultado = forward(x);
  var previsao = resultado[0];
  var ativacoes = resultado[1];
  var erro = calcularErro(y, previsao);
  ajustarSaida(ativacoes, erro, taxa);
}

function treinar(dados, epocas, taxa) {
  for (var epoca = 0; epoca < epocas; epoca++) {
    for (var i = 0; i < dados.length; i++) {
      treinarAmostra(dados[i][0], dados[i][1], taxa);
    }
  }
}

function prever(x) {
  return forward(x)[0];
}

function calcularMSE(dados) {
  var soma = 0;
  for (var i = 0; i < dados.length; i++) {
    var erro = dados[i][1] - prever(dados[i][0]);
    soma = soma + erro * erro;
  }
  return soma / dados.length;
}

// ----------------------- USO DO MODELO -----------------------
treinar(treino, 800, 0.03);
console.log('MSE de treino:', calcularMSE(treino));
console.log('Previsão para x = 0.75:', prever(0.75));
console.log('Valor real aproximado:', Math.sin(0.75));