import numpy as np
import matplotlib.pyplot as plt
# Generar datos aleatorios
np.random.seed(0)
X = 2 * np.random.rand(10, 1)
y = 4 + 3 * X + np.random.rand(10, 1)
print("X:\n")
print(X)
print("**********************")
print("y:\n")
print(y)
print("**********************")
# Función para calcular el error cuadrático medio (MSE)
def calcular_mse(y_true, y_pred):
return ((y_true - y_pred) ** 2).mean()
"""
y_true:Array que contiene los valores reales en el eje y, de los datos.
y_pred:Array contiene las predicciones hechas por el modelo.
(y_true - y_pred):Calcula la diferencia o el error que existe.
((y_true - y_pred) ** 2):eleva cada uno de los errores individuales al cuadrado.
Esto se hace para asegurarse de que todos los errores sean positivos.
Tambien penaliza más los errores grandes.
mean():calcula el valor promedio de todos los errores cuadrados,
y los divide por el total de los datos
"""
# Inicializar parámetros (pendiente y ordenada al origen)
theta0 = np.random.randn()
theta1 = np.random.randn()
print("theta0,theta1\n",theta0,theta1)
print("************************")
# Parámetros del descenso de gradiente
learning_rate = 0.1
num_iteraciones = 100
historial_costo = []
# Realizar el descenso de gradiente
for i in range(num_iteraciones):
# Calcular las predicciones. No es exactamente la derivada MSE.
y_pred = theta0 + theta1 *X
gradiente_theta0 = -2 * (y - y_pred).mean()
gradiente_theta1 = -2 * (X * (y - y_pred)).mean()
# Actualizar los parámetros
theta0 = theta0 - learning_rate * gradiente_theta0
theta1 = theta1 - learning_rate * gradiente_theta1
# Calcular el costo (MSE) y agregarlo al historial
costo = calcular_mse(y, y_pred)
historial_costo.append(costo)
print("historial_costo:")
for costo in historial_costo:
print(costo)
# Graficar la evolución del costo (MSE) con puntos rojos
plt.figure(figsize=(15,7))
plt.plot(historial_costo, label='MSE')
plt.scatter(range(num_iteraciones), historial_costo, c='red', marker='o', label='Saltos del Descenso')
plt.xlabel('Iteraciones')
plt.ylabel('MSE')
plt.title('Evolución del Error Cuadrático Medio (MSE) durante el Descenso de Gradiente')
plt.legend()
plt.show()
# Mostrar la línea ajustada
plt.figure(figsize=(15,7))
plt.scatter(X, y, label='Datos')
plt.plot(X, theta0 + theta1 * X, color='red', label='Ajuste Lineal')
plt.xlabel('X')
plt.ylabel('y')
plt.legend()
plt.title('Ajuste Lineal usando Descenso de Gradiente (MSE)')
plt.show()
print(f'Parámetros finales: theta0 = {theta0}, theta1 = {theta1}')
"""
X:
[[1.09762701]
[1.43037873]
[1.20552675]
[1.08976637]
[0.8473096 ]
[1.29178823]
[0.87517442]
[1.783546 ]
[1.92732552]
[0.76688304]]
**********************
y:
[[ 8.08460606]
[ 8.82003112]
[ 8.18462482]
[ 8.19489574]
[ 6.61296485]
[ 7.96249398]
[ 6.64574167]
[10.18325785]
[10.56013331]
[ 7.17066126]]
**********************
theta0,theta1
1.4940790731576061 -0.20515826376580087
************************
historial_costo:
50.791280553620574
11.777134633757118
2.7916462143799103
0.7221656419849861
0.24553565831645724
0.1357608182499806
0.11047771236386147
0.10465421065140687
0.1033125297455145
0.10300308242721219
0.1029313816938072
0.10291444620261687
0.10291013267725968
0.1029087347655518
0.10290801678350092
0.10290746364723875
0.10290695655413924
0.1029064679741096
0.10290599140186554
0.10290552517785319
0.10290506876191594
0.1029046218749988
0.10290418430140387
0.1029037558431793
0.10290333630954787
0.10290292551440976
0.10290252327570373
0.10290212941519672
0.10290174375837777
0.1029013661343724
0.10290099637586536
0.10290063431902699
0.10290027980343983
0.10289993267202804
0.10289959277098695
0.10289925994971565
0.10289893406075079
0.10289861495969962
0.10289830250517677
0.10289799655874335
0.10289769698484208
0.10289740365074004
0.1028971164264694
0.102896835184769
0.10289655980102763
0.10289629015323151
0.10289602612190621
0.1028957675900671
0.10289551444316584
0.10289526656903998
0.10289502385786316
0.10289478620209694
0.10289455349644279
0.1028943256377948
0.10289410252519535
0.10289388405978946
0.10289367014478099
0.10289346068539011
0.10289325558881102
0.10289305476417154
0.10289285812249109
0.10289266557664385
0.1028924770413177
0.10289229243297797
0.10289211166982973
0.10289193467178163
0.10289176136041105
0.10289159165892833
0.1028914254921435
0.10289126278643237
0.10289110346970484
0.10289094747137204
0.1028907947223151
0.1028906451548556
0.10289049870272401
0.10289035530103144
0.10289021488624055
0.1028900773961374
0.10288994276980427
0.10288981094759145
0.10288968187109201
0.10288955548311654
0.10288943172766551
0.10288931054990594
0.10288919189614801
0.10288907571381893
0.10288896195144188
0.10288885055861183
0.10288874148597338
0.1028886346851999
0.10288853010897067
0.10288842771095072
0.10288832744577055
0.10288822926900525
0.10288813313715581
0.10288803900762848
0.10288794683871669
0.10288785658958366
0.10288776822024223
0.10288768169153828
"""