Regresión lineal de diez algoritmos clásicos de aprendizaje automático

 

La regresión lineal se puede describir mediante la siguiente fórmula:

La regresión lineal es un problema de predicción de valor continuo, es decir, bajo el cálculo de una x dada y el parámetro del modelo θ, la ecuación correspondiente se puede aproximar infinitamente al valor verdadero y.

Aquí hay un ejemplo simple de predicción de valor continuo:

y = w * x + b

Cuando se conocen los dos conjuntos de parámetros, los parámetros w y b se pueden obtener mediante el método de eliminación y se puede obtener la solución exacta de la ecuación. Es decir, w = 1,477, b = 0,089

1.567 = w * 1 + b

3.043 = w * 2 + b

Sin embargo, en la vida real, a menudo es imposible resolverlo con precisión. En primer lugar, debido a que se desconoce la ecuación del modelo en sí, los datos recopilados tienen una cierta desviación y, en segundo lugar, los datos que observamos suelen ser ruidosos. Por lo tanto, es necesario agregar un factor de ruido ε a la fórmula anterior, a saber

y = w * x + b + ε, asumimos ε ~ N (0,1), es decir, ε obedece a una distribución gaussiana con una media de 0 y una varianza de 1. La distribución anterior se muestra en la siguiente figura:

Es decir, la mayoría de los valores se distribuyen cerca de 0 y los valores más alejados de 0 están menos distribuidos.

A través de la distribución gaussiana, el proceso de solución anterior se puede cambiar a:

1.567 = w * 1 + b + eps

3.043 = w * 2 + b + eps

4.519 = w * 3 + b + eps

Cuando queremos obtener los valores apropiados de w y b, necesitamos observar varios conjuntos de datos y, mediante la iteración de múltiples conjuntos de datos de observación, podemos obtener el mejor rendimiento general de w y b.

Entonces, ¿cómo resolvemos los dos parámetros w y b?

Aquí es necesario introducir el concepto de función de pérdida, es decir, el error entre el valor verdadero y el valor predicho. La fórmula de la función de pérdida es la siguiente:

Para obtener el mejor rendimiento w y b, es decir, w y b bajo la condición de que la función de pérdida alcance el valor mínimo, la función de pérdida aquí es la suma de los errores de cada grupo de observaciones.

Por lo tanto, hemos transformado el problema de estimar los parámetros del modelo w y b en un problema de minimizar la función de pérdida.

A continuación, utilizamos el algoritmo de descenso de gradiente para determinar los parámetros del modelo w y b. No explicaré mucho sobre qué es el algoritmo de descenso de gradiente aquí. El gradiente puede entenderse simplemente como la derivada de la función, y la dirección del gradiente es la dirección en la que aumenta el valor de la función. P.ej:

Por ejemplo, la función objetivo es f (x), la dirección de la derivada de la función en los tres puntos anteriores apunta a la dirección en la que aumenta el valor de la función. También se puede entender como la dirección del valor máximo de la función. Cuando queremos minimizar la función de pérdida, resolvemos la función de pérdida Y obtén la w y la b del punto correspondiente, es decir, los parámetros del modelo que queremos obtener. En la figura anterior, el valor mínimo de la función de pérdida es de aproximadamente 5, deje que los parámetros del modelo verifiquen que el gradiente se cambia en la dirección opuesta. Cada cambio tiene un tamaño de paso fijo, es decir, la tasa de aprendizaje. A través de iteraciones repetidas, encuentre los parámetros óptimos del modelo .

Por lo tanto, necesitamos encontrar la derivada parcial de la función objetivo, es decir, calcular w 'y b' respectivamente

Y actualice el degradado de la siguiente manera

Deducción de código Python:

#!/usr/bin/env python
# -*- coding: utf-8 -*-
__author__ = 'Seven'

import numpy as np


# y = wx + b
def calculate_loss_function(w, b, points):
    total_error = 0
    for i in range(len(points)):
        x = points[i, 0]
        y = points[i, 1]
        total_error += ((w * x + b) - y) ** 2
    return total_error / float(len(points))


def step_gradient(w_current, b_current, points, learning_rate):
    w_gradient = 0
    b_gradient = 0
    N = float(len(points))
    for i in range(len(points)):
        x = points[i, 0]
        y = points[i, 1]
        # w_gradient = 2x(wx+b-y)
        w_gradient += 2 / N * x * ((w_current * x + b_current) - y)
        # b_gradient = 2(wx+b-y)
        b_gradient += 2 / N * ((w_current * x + b_current) - y)

    new_w = w_current - learning_rate * w_gradient
    new_b = b_current - learning_rate * b_gradient
    return [new_w, new_b]


def gradient_descent_runner(starting_w, starting_b, learning_rate, num_iterations, points):
    w = starting_w
    b = starting_b
    for i in range(num_iterations):
        w, b = step_gradient(w, b, points, learning_rate)
    return [w, b]


def run():
    # 构建模拟数据并添加噪声,并拟合y = 1.477x + 0.089
    x = np.random.uniform(0, 100, 100)
    y = 1.477 * x + 0.089 + np.random.normal(0, 1, 1)
    points = np.array([[i, j] for i, j in zip(x, y)])
    learning_rate = 0.0001
    initial_b = 0
    initial_w = 0
    num_iterations = 1000
    print(f'原始损失函数值为:{calculate_loss_function(initial_w, initial_b, points)}, w={initial_w}, b={initial_b}')
    w, b = gradient_descent_runner(initial_w, initial_b, learning_rate, num_iterations, points)
    print(f'经过{num_iterations}次迭代, 损失函数的值为:{calculate_loss_function(w, b, points)}, w={w}, b={b}')


if __name__ == '__main__':
    run()

 

El efecto de la operación es el siguiente:

Como se puede ver en la figura anterior, después de 1000 iteraciones, el valor de w es aproximadamente 1,49, el valor de b es aproximadamente 0,08, el w real es 1,477 y b es 0,089. El efecto de ejecución es muy cercano al valor real.

Supongo que te gusta

Origin blog.csdn.net/gf19960103/article/details/104655278
Recomendado
Clasificación