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
2 Función de costo
3 Función de Costo - Intuición 1 (Función de Costo - Intuición I)
4 Función de Costo - Intuición 2 (Función de Costo - Intuición II)
Descenso de 5 gradientes
6 Intuición de descenso de gradiente
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
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]:
En 3]:
data.plot(kind='scatter', x='Population', y='Profit', figsize=(12,8))
plt.show()
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
#这个部分计算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
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]:
\
En [7]:
y.head()
Fuera [7]:
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]:
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
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()
#原始数据以及拟合的直线
8.3 Visualización de J(θ)
No se reproducirá con python, tome una captura de pantalla para indicar