Aprendizaje automático: regresión lineal para univariante

1 Representación del modelo

1. Conjunto de entrenamiento de predicción del precio de la vivienda

Tamaño en pies² **( x )** Precio ($) en 1000's ( y )
2104 460
1416 232
1534 315
852 178

En el conjunto de entrenamiento de predicción del precio de la vivienda, los resultados de entrada y salida se dan al mismo tiempo, es decir, se dan los "resultados correctos" marcados por humanos , y la cantidad predicha es continua, lo que pertenece al problema de regresión en supervisado aprendizaje.

2. Modelo de resolución de problemas

imagen

imagen

2 Función de costo

imagenimagen

imagen

3 Función de Costo - Intuición 1 (Función de Costo - Intuición I)

imagen

imagen

4 Función de Costo - Intuición 2 (Función de Costo - Intuición II)

imagen

imagen

imagen

imagen

Descenso de 5 gradientes

imagen

imagen

imagen

imagen

imagen

6 Intuición de descenso de gradiente

imagen

imagen

imagen

imagen

imagen

imagen

imagen

imagen

Finalmente, el gradiente descendente se puede usar no solo para la función de costo en la regresión lineal, sino también para minimizar otras funciones de costo.

7 Descenso de gradiente para regresión lineal

imagen

imagen

imagen

imagen

Además, usando la solución de bucle, el código es más redundante, hablaremos sobre cómo usar **Vectorización** para simplificar el código y optimizar el cálculo, para que el descenso de gradiente se ejecute más rápido y mejor.

8 Implementación del Código

La parte completa de 2 necesita predecir la ganancia de abrir un snack bar en función de la población de la ciudad. Los
datos están en ex1data1.txt. La primera columna es la población de la ciudad y la segunda columna es la ganancia de la chiringuito en la ciudad.

8.1 Trazado de los datos

Lea los datos, luego muestre los datos

En 1]:

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt

En 2]:

path =  '../ex1data1.txt'
data = pd.read_csv(path, header=None, names=['Population', 'Profit'])
data.head()

Fuera [2]:

imagen

En 3]:

data.plot(kind='scatter', x='Population', y='Profit', figsize=(12,8))
plt.show()

imagen

8.2 Descenso de pendiente

En esta parte, debe entrenar los parámetros θ de regresión lineal en el conjunto de datos existente

8.2.1 Oficial

imagen

#这个部分计算J(Ѳ),X是矩阵
def computeCost(X, y, theta):
    inner = np.power(((X * theta.T) - y), 2)
    return np.sum(inner) / (2 * len(X))
#调用
computeCost(X, y, theta)

8.2.2 Implementación

imagen

En [4]:

data.insert(0, 'Ones', 1)

Ahora hagamos una inicialización de variables.

En [5]:

# 初始化X和y
cols = data.shape[1]
X = data.iloc[:,:-1]#X是data里的除最后列
y = data.iloc[:,cols-1:cols]#y是data最后一列

Observe si X (conjunto de entrenamiento) e y (variable objetivo) son correctos.

En [6]:

X.head()#head()是观察前5行

Fuera [6]:

imagen\

En [7]:

y.head()

Fuera [7]:

imagen

Se supone que la función de costo es una matriz numpy, por lo que necesitamos transformar X e Y antes de poder usarlos. También necesitamos inicializar theta.

En [8]:

X = np.matrix(X.values)
y = np.matrix(y.values)
theta = np.matrix(np.array([0,0]))

En [9]:

X.shape, theta.shape, y.shape

Fuera [9]:

imagen

8.2.3 Cálculo de J(θ)

Calcule la función de costo (el valor inicial de theta es 0), la respuesta debería ser 32.07

En [10]:

def computeCost(X, y, theta):
    inner = np.power(((X * theta.T) - y), 2)
    return np.sum(inner) / (2 * len(X))
#这个部分计算J(Ѳ),X是矩阵
computeCost(X, y, theta)

Fuera [10]:

32.072733877455676

8.2.4 Descenso de pendiente

imagen

En [11]:

def gradientDescent(X, y, theta, alpha, iters):
    temp = np.matrix(np.zeros(theta.shape))
    parameters = int(theta.ravel().shape[1])
    cost = np.zeros(iters)
    
    for i in range(iters):
        error = (X * theta.T) - y
        
        for j in range(parameters):
            term = np.multiply(error, X[:,j])
            temp[0,j] = theta[0,j] - ((alpha / len(X)) * np.sum(term))
            
        theta = temp
        cost[i] = computeCost(X, y, theta)
        
    return theta, cost
#这个部分实现了Ѳ的更新

Inicialice algunas variables adicionales: la tasa de aprendizaje α y el número de iteraciones a realizar, ya mencionadas en 2.2.2.

En [12]:

alpha = 0.01
iters = 1500

Ahora ejecutemos el algoritmo de descenso de gradiente para ajustar nuestro parámetro θ al conjunto de entrenamiento.

En [13]:

g, cost = gradientDescent(X, y, theta, alpha, iters)
g

Fuera [13]:

matriz ([[-3.63029144, 1.16636235]])

En [14]:

predict1 = [1,3.5]*g.T
print("predict1:",predict1)
predict2 = [1,7]*g.T
print("predict2:",predict2)
#预测35000和70000城市规模的小吃摊利润

predecir1: [[0.45197679]]

predecir2: [[4.53424501]]

En [15]:

x = np.linspace(data.Population.min(), data.Population.max(), 100)
f = g[0, 0] + (g[0, 1] * x)

fig, ax = plt.subplots(figsize=(12,8))
ax.plot(x, f, 'r', label='Prediction')
ax.scatter(data.Population, data.Profit, label='Traning Data')
ax.legend(loc=2)
ax.set_xlabel('Population')
ax.set_ylabel('Profit')
ax.set_title('Predicted Profit vs. Population Size')
plt.show()
#原始数据以及拟合的直线

imagen

8.3 Visualización de J(θ)

imagen

No se reproducirá con python, tome una captura de pantalla para indicar

imagen

Supongo que te gusta

Origin blog.csdn.net/qq_41355222/article/details/123984190
Recomendado
Clasificación