A regressão linear simples é uma espécie de modelo na estatística cujo objetivo é indicar qual será o comportamento de uma variável dependente, quando colocado uma variável independente.
Nesse caso, utilizaremos apenas uma variável independente e uma dependente. Se tivermos mais que uma variável independente utilizaremos a regressão linear múltipla, que veremos em próximos posts.
Ou seja, a regressão linear simples é uma forma de verificar uma possível relação linear entre duas variáveis, como, por exemplo:
Obs: Quanto mais dados você tiver na sua base de dados, mais assertiva será a previsão.
Usaremos uma base de dados fictícia de quantas bactérias foram mortas ao adicionar uma certa quantidade de veneno. Para simplificar nossa compreensão usaremos uma base de dados com apenas 5 linhas.
Conceitos:
- Bo = Ponto de encontro com o eixo Y.
- B1 = Inclinação da reta.
- Ŷ = Estimativa de Y.
- Ym = Média de Y.
- Xm = Média de X.
- Σ = Somatório
Ŷ = Bo + B1 * Xi
Primeiro vamos fazer alguns cálculos com nossa base de dados que vamos precisar.
Vamos dividir a fórmula Ŷ = Bo + B1 * Xi em três parte.
Primeira parte - B1:
Como já temos esses valores nas tabelas acima, vamos apenas substituir pelos os resultados.
Segunda parte - Bo:
B0 = Ym - B1 * Xm
B0 = 8 - 2,6 * 3 (obs: Primeiro multiplica)
Bo = 8 - 7,8
Agora vamos para o cálculo final: Ŷ = Bo + B1 * Xi
Ŷ = 0,2 + 2,6 * Xi (Esse Xi é a entrada (input) do dado que você quer ver o resultado, vamos colocar um exemplo de “2”)
Ŷ = 0,2 + 2,6 * 2 (Primeiro multiplica)
Ŷ = 0,2 + 5,2
Repositório de exemplo: https://github.com/leodeymison/regressao-linear-simples
Obs: Esse exemplo não foi implementado nenhuma arquitetura como Design patterns ou algo tipo, o objetivo é ficar o mais simples possível de entender.
banco de dados test:
const data = [
{ x: 1, y: 3 },
{ x: 2, y: 7 },
{ x: 3, y: 5 },
{ x: 4, y: 11 },
{ x: 5, y: 14 }
]
Primeiro vamos criar uma função com o nome “regressaoLinearSimples” que chamará todas as outras funções e será a função principal. Ele verificará sem o campo de input do html será vazio e chamará nossa primeira função que é a soma de todos os valores da coluna Xi e Yi.
function RegressionLinearSimples(){ var valueStart = document.getElementById('valueStart') if(valueStart.value == ''){ return }
var somaXY = somaXandY()
}
Logo em seguida criaremos a função somaXandY, ela faz um loop pegando valor por valor de X e Y e somando em uma variável somaX e somaY, logo em seguida retorna as duas variáveis:
function somaXandY(){
var somaX = 0
var somaY = 0
data.forEach(element => {
somaX += element.x
somaY += element.y
});
return {
somaX,
somaY
}
}
Agora chamaremos a função mediaXY, que fará a media das duas colunas no banco de dados. Essa função recebe dois parâmetros: “Soma da coluna X” e “Soma da coluna Y”, calculada na função anterior.
function RegressionLinearSimples(){ var valueStart = document.getElementById('valueStart') if(valueStart.value == ''){ return }
var somaXY = somaXandY() var mediaXY = mediaXandY(somaXY.somaX, somaXY.somaY)
}
Nessa função pegamos a quantidade de linhas de temos no banco de dados e dividiremos pela soma, e logo em seguida retornamos o resultado de mediaX e mediaY
function mediaXandY(somaX, somaY){
var quant = data.length
var mediaX = somaX / quant
var mediaY = somaY / quant
return {
mediaX, mediaY
}
}
Nessa próxima chamada, chamaremos duas funções passando a média de cada coluna no parâmetro: x_Somatoria = (Xi - Xm) e y_somatoria = (Yi - Ym), o resultado dessas duas funções será os parâmetro da função XXmuiltYs, que é (Xi - Xm) * (Yi - Ym)
function RegressionLinearSimples(){ var valueStart = document.getElementById('valueStart') if(valueStart.value == ''){ return }
var somaXY = somaXandY() var mediaXY = mediaXandY(somaXY.somaX, somaXY.somaY) var x_Somatoria = x_SomatoriaFunc(mediaXY.mediaX) var y_Somatoria = y_SomatoriaFunc(mediaXY.mediaY) var XSmultiYS = XSmultiYSFunc(x_Somatoria, y_Somatoria)
}
Nessas duas funções criamos um Array de números fazendo os cálculos linha por linha no banco de dados. (Xi = element.x - Xm = valorMedia) & (Yi = element.y - Xm = valorMedia), logo em seguida retornamos o valor.
function x_SomatoriaFunc(valorMedia){
var X_XSOMA = []
data.forEach(element => {
X_XSOMA.push(element.x-valorMedia)
});
return X_XSOMA
}
function y_SomatoriaFunc(valorMedia){
var X_XSOMA = []
data.forEach(element => {
X_XSOMA.push(element.y-valorMedia)
});
return X_XSOMA
}
Nessa função faz um loop (Xi - Xm) multiplicando por (Yi - Ym) e logo em seguida outro loop que soma todos esses resultados, retornamos o resultado das multiplicações que é um Array e a soma desse Array.
function XSmultiYSFunc(SX, SY){
var result = []
for(let i = 0; i < SX.length; i++){
result.push(SX[i]*SY[i])
}
var soma = 0
result.forEach(element => {
soma += element
});
return {
values: result,
soma
}
}
Vamos chamar a última função RaizXS que tem como parâmetro x_somatoria: a soma de todos os resultados de (Xi - Xm)².
function RegressionLinearSimples(){ var valueStart = document.getElementById('valueStart') if(valueStart.value == ''){ return }
var somaXY = somaXandY() var mediaXY = mediaXandY(somaXY.somaX, somaXY.somaY) var x_Somatoria = x_SomatoriaFunc(mediaXY.mediaX) var y_Somatoria = y_SomatoriaFunc(mediaXY.mediaY) var XSmultiYS = XSmultiYSFunc(x_Somatoria, y_Somatoria) var VaizXS = VaizXSFunc(x_Somatoria)
}
Nessa função faz um loop (Xi - Xm) ² em cada linha e logo depois outro loop fazendo o somatório desses valores, retorna os Array de (Xi - Xm) ² e o valor do Somatório.
function VaizXSFunc(SX){
var result = []
SX.forEach(element => {
result.push(element*element)
})
var soma = 0
result.forEach(element => {
soma += element
});
return {
values: result,
soma
}
}
Em seguida fazemos os cálculos de B0, B1 e Ŷ, formatamos o Ŷ para ter no máximo 2 número depois da vírgula e imprimimos o valor de Ŷ na página.
Obs: Como os cálculos de B1, Bo e Ŷ são pequenos eu não vi a necessidade de criar uma função para calculá-los, mas se você achar melhor, fique a vontade para criar.
function RegressionLinearSimples(){ var valueStart = document.getElementById('valueStart') if(valueStart.value == ''){ return }
var somaXY = somaXandY() var mediaXY = mediaXandY(somaXY.somaX, somaXY.somaY) var x_Somatoria = x_SomatoriaFunc(mediaXY.mediaX) var y_Somatoria = y_SomatoriaFunc(mediaXY.mediaY) var XSmultiYS = XSmultiYSFunc(x_Somatoria, y_Somatoria) var VaizXS = VaizXSFunc(x_Somatoria) var b1 = XSmultiYS.soma/VaizXS.soma var b0 = mediaXY.mediaY-b1*mediaXY.mediaX var result = b0 + b1 * parseFloat(valueStart.value) result = result.toFixed(2) document.getElementById('preview').innerHTML = ` ${result} bactérias `
}
O meu objetivo com esse post é fazer com que sua mente se abra para o conhecimento profundo na área de Machine Learning e Big Data, deixando de lado apenas aprender uma biblioteca que já te entrega tudo pronto e aprender a Raiz, para você conseguir criar novas formas revolucionárias de inteligência artificial. Bons estudos! :)
GitHub: https://github.com/leodeymison