Sobes.tech
Middle — Senior
35

Как реализовать линейную регрессию с обучением и инференсом без использования готовых библиотек?

Companies where asked
AvitoAvito

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 делает предсказания на новых данных.

Такой подход демонстрирует базовый принцип линейной регрессии без использования готовых библиотек.