[Интернет вещей] Краткое введение в метод наименьших квадратов — реализация на языке C

Метод наименьших квадратов — это широко используемый математический метод для подбора данных и поиска наиболее подходящей кривой. Его цель — найти функцию, которая минимизирует сумму квадратов ошибок по точкам данных.
Вставьте сюда описание изображения



Фундаментальный

Предположим, у нас есть набор точек данных (x 1, y 1), (x 2, y 2),..., (xn, yn) (x_1, y_1), (x_2, y_2), ..., ( х_н, й_н)( х1,й1) ,( х2,й2) ,... ,( хн,йн) , мы хотим найти функциюy = f ( x ) y = f(x)й"="f ( x ) , так что эта функция лучше всего соответствует этим точкам данных. Основная идея метода наименьших квадратов заключается в том, что нам нужно найти функциюy = f ( x ) y = f(x)й"="f ( x ) , так что сумма квадратов расстояний всех точек данных до этой функции минимизирована.

Мы определяем расстояние от каждой точки данных до функции как остаток Residual_iрез я люблю тебя _ _я,即residuali = yi - f ( xi ) остатка_i = y_i - f(x_i)рез я люблю тебя _ _я"="йяе ( хя) . Наша цель — минимизировать сумму квадратов всех остатков, то есть минимизировать сумму квадратов ошибокS = ∑ i = 1 nresiduali 2 S = \sum_{i=1}^{n} Residual_i^2С"="я = 1нрез я люблю тебя _ _я2


Решение методом наименьших квадратов

Чтобы решить задачу наименьших квадратов, нам нужно выбрать подходящую функциональную форму y = f ( x ) y = f(x)й"="ж ( Икс ) . Общие формы функций включают линейные функции, полиномиальные функции, показательные функции и т. д. Возьмем линейную функциюy = ax + by = ax + bй"="х _+б Например, мы можем минимизировать сумму ошибок квадратовSSS найти коэффициентaaа иббб

Сначала определим целевую функцию J (a, b) J(a, b)Дж ( а ,б ),即J ( а , б ) знак равно ∑ я знак равно 1 п ( yi - ( axi + b ) ) 2 J(a, b) = \ sum_{i=1}^{n} (y_i - (ax_i + б))^2Дж ( а ,б )"="я = 1н( уя( х _я+б ) )2 . Наша цель — найти такое, чтоJ ( a , b ) J(a, b)Дж ( а ,б ) наименьшийааа иббб . Чтобы достичь этой цели, нам нужно найти частную производную целевой функции и сделать ее равной 0.

Для целевой функции J ( a , b ) J(a, b)Дж ( а ,б ) , соответственно оцениваемaaа иббНайдите частную производную от b и пусть она равна 0, то есть:

∂ J ∂ а знак равно 0 \frac{\partial J}{\partial a} = 0а Дж"="0

∂ J ∂ b знак равно 0 \frac{\partial J}{\partial b} = 0б Дж"="0

Решив приведенную выше систему уравнений, можно получить а.а.а иббb , получая таким образом наиболее подходящую прямую линию.


Примеры применения

Метод наименьших квадратов имеет широкий спектр применения в практических приложениях. Например, в экономике метод наименьших квадратов можно использовать для оценки параметров экономической модели. В физике метод наименьших квадратов можно использовать для аппроксимации экспериментальных данных и получения параметров физических законов. В машинном обучении метод наименьших квадратов можно использовать для решения задач линейной регрессии.

Давайте возьмем в качестве примера задачу линейной регрессии. Предположим, у нас есть набор точек данных о площади и цене дома, и мы хотим найти линейную функцию, которая лучше всего соответствует этим точкам данных. Мы можем использовать метод наименьших квадратов для определения параметров линейной функции.

Предположим, что наши точки данных: ( x 1 , y 1 ), ( x 2 , y 2 ) , . . . , ( xn , yn ) (x_1, y_1), (x_2, y_2), ..., (x_n, y_n )( х1,й1) ,( х2,й2) ,... ,( хн,йн) , нам нужно найти линейную функциюy = ax + by = ax + bй"="х _+b , сумма квадратов разностейS = ∑ i знак равно 1 n ( yi − ( axi + b ) ) 2 S = \sum_{i=1}^{n} (y_i - (ax_i + b))^2С"="я = 1н( уя( х _я+б ) )2 Свернуть.

Решив частную производную целевой функции и установив ее равной 0, мы можем получитьа иббрешение б . Наконец, мы можем получить параметры наиболее подходящей прямой.


Реализация метода наименьших квадратов с использованием языка C

#include <stdio.h>

// 定义最大数据点数量
#define MAX_DATA_POINTS 100

// 定义数据点结构体
typedef struct {
    
    
    double x;
    double y;
} DataPoint;

// 定义线性回归函数
void linearRegression(DataPoint* data, int n, double* a, double* b) {
    
    
    double sumX = 0, sumY = 0, sumXY = 0, sumX2 = 0;
    for (int i = 0; i < n; i++) {
    
    
        sumX += data[i].x;
        sumY += data[i].y;
        sumXY += data[i].x * data[i].y;
        sumX2 += data[i].x * data[i].x;
    }
    double denominator = n * sumX2 - sumX * sumX;
    *a = (n * sumXY - sumX * sumY) / denominator;
    *b = (sumY * sumX2 - sumX * sumXY) / denominator;
}

int main() {
    
    
    int n;
    DataPoint data[MAX_DATA_POINTS];

    // 输入数据点数量
    printf("Enter the number of data points: ");
    scanf("%d", &n);

    // 输入数据点的 x 和 y 值
    printf("Enter the data points (x, y):\n");
    for (int i = 0; i < n; i++) {
    
    
        printf("Data point %d: ", i+1);
        scanf("%lf %lf", &data[i].x, &data[i].y);
    }

    double a, b;
    linearRegression(data, n, &a, &b);

    // 输出线性回归的结果
    printf("Linear regression equation: y = %.2fx + %.2f\n", a, b);

    return 0;
}

Этот код реализует простую функцию линейной регрессии linearRegression, которая принимает массив точек данных и количество точек данных в качестве входных данных и вычисляет параметры наиболее подходящей прямой линии. В mainфункцию мы сначала вводим количество и конкретные значения точек данных, затем вызываем linearRegressionфункцию для выполнения вычислений линейной регрессии и выводим уравнение наиболее подходящей прямой линии.

Обратите внимание, что этот код реализует только простую линейную регрессию. Если вам нужно подогнать другие типы функций, вам необходимо соответствующим образом изменить linearRegressionреализацию функции .


Подведем итог

Метод наименьших квадратов — это широко используемый математический метод для подбора данных и поиска наиболее подходящей кривой. Его основной принцип заключается в минимизации суммы квадратов расстояний от точек данных до подобранной функции. Решив частную производную целевой функции и присвоив ей значение 0, мы можем получить параметры наиболее подходящей функции. Метод наименьших квадратов широко используется в различных областях и является очень полезным инструментом.

おすすめ

転載: blog.csdn.net/Goforyouqp/article/details/132882327