Middle — Senior
35
Как реализовать линейную регрессию с обучением и инференсом без использования готовых библиотек?
Companies where asked
Answer from AI
sobes.tech AI
Линейная регрессия — это модель, которая аппроксимирует зависимость между входными признаками и целевой переменной с помощью линейной функции.
Пример реализации обучения и инференса линейной регрессии на Go без сторонних библиотек:
package main
import (
"fmt"
)
// Обучение линейной регрессии методом градиентного спуска
func trainLinearRegression(X [][]float64, y []float64, epochs int, lr float64) ([]float64, float64) {
nSamples := len(y)
nFeatures := len(X[0])
weights := make([]float64, nFeatures)
bias := 0.0
for epoch := 0; epoch < epochs; epoch++ {
dw := make([]float64, nFeatures)
db := 0.0
for i := 0; i < nSamples; i++ {
yPred := bias
for j := 0; j < nFeatures; j++ {
yPred += weights[j] * X[i][j]
}
error := yPred - y[i]
for j := 0; j < nFeatures; j++ {
dw[j] += error * X[i][j]
}
db += error
}
// Обновление параметров
for j := 0; j < nFeatures; j++ {
weights[j] -= lr * dw[j] / float64(nSamples)
}
bias -= lr * db / float64(nSamples)
}
return weights, bias
}
// Предсказание
func predict(X [][]float64, weights []float64, bias float64) []float64 {
nSamples := len(X)
yPred := make([]float64, nSamples)
for i := 0; i < nSamples; i++ {
pred := bias
for j := 0; j < len(weights); j++ {
pred += weights[j] * X[i][j]
}
yPred[i] = pred
}
return yPred
}
func main() {
X := [][]float64{{1, 2}, {2, 3}, {4, 5}, {3, 6}}
y := []float64{5, 8, 14, 13}
weights, bias := trainLinearRegression(X, y, 1000, 0.01)
fmt.Println("Weights:", weights)
fmt.Println("Bias:", bias)
predictions := predict(X, weights, bias)
fmt.Println("Predictions:", predictions)
}
В этом примере:
trainLinearRegressionобучает модель с помощью градиентного спуска.predictделает предсказания на новых данных.
Такой подход демонстрирует базовый принцип линейной регрессии без использования готовых библиотек.