REGRESSÃO LINEAR SIMPLES - Como implementar em qualquer linguagem
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:
- Quantas bactérias serão mortas se aplicarmos uma certa quantidade de veneno. Link: https://modelo-de-regressao-linear-simples.netlify.app/
Obs: Quanto mais dados você tiver na sua base de dados, mais assertiva será a previsão.
Fórmulas e cálculos (Teoria)
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.
- 1. A média da coluna Xi no banco de dados (Xm). Todos os valores dividido pela quantidade de dados.
- 2. A média da coluna Yi no banco de dados (Ym). Todos os valores dividido pela quantidade de dados.
-
3. A média de (Xi - Xm) * (Yi - Ym). Vamos pensar linha por linha para fazermos esse cálculo. (Xi - Xm) = Pegamos o primeiro valor da coluna Xi e subtraímos pela média de todos os valores da coluna Xi. (Yi - Ym) = Pegamos o primeiro valor da Yi e subtraímos pela média de todos os valores da coluna Yi. logo em seguida multiplicamos os dois resultados.
Aí fazemos esse mesmo cálculo em todas as outras linhas.Mudando apenas o Xi e Yi em cada linha.
- 4. A média de (Xi - Xm)². Como já tiramos esse valor no campo anterior na 3° coluna após o a coluna Yi. Vamos apenas pegar o resultado e elevar ao quadrado.
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.
# B1 = 2,6
Segunda parte - Bo:
B0 = Ym - B1 * Xm
B0 = 8 - 2,6 * 3 (obs: Primeiro multiplica)
Bo = 8 - 7,8
# Bo = 0,2
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
# Ŷ = 5,4
Implementando no JavaScript ( Prática )
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