Построение градиентного спуска в 3D – Контурные графики

Вопрос или проблема

Я сгенерировал 3 параметра вместе с функцией стоимости. У меня есть списки $\theta$ и список стоимости из 100 значений за 100 итераций. Я хотел бы построить последние 2 параметра относительно стоимости в 3D, чтобы визуализировать уровень на контурных графиках и функцию cereal bowl.

Набор данных о домах с 3 параметрами (число 1, спальни, площадь в квадратных футах) для прогнозирования цен с формой $(100000, 3)$ и $y(100000, )$. Цель состоит в том, чтобы рассмотреть функцию cereal bowl в 3D и посмотреть, как градиенты сходятся.

Ссылки: Реализация градиентного спуска на Python – контурные линии:

def compute_cost(X, y, theta):
    return np.sum(np.square(np.matmul(X, theta) - y)) / (2 * len(y))

def gradient_descent_multi(X, y, theta, alpha, iterations):
    theta = np.zeros(X.shape[1])
    m = len(X)
    j_history = np.zeros(iterations)
    theta_1_hist = [] 
    theta_2_hist = []
    for i in range(iterations):


        gradient = (1/m) * np.matmul(X.T, np.matmul(X, theta) - y)

        theta = theta - alpha * gradient

        j_history[i] = compute_cost(X,y,theta)
        theta_1_hist.append(theta[1])
        theta_2_hist.append(theta[2])


#         J_history.append(compute_cost(X,y,theta))
#         print(J_history)



#         grad_plot.append(theta)

    return theta ,j_history, theta_1_hist, theta_2_hist

theta = np.zeros(2)
alpha = 0.1
iterations = 100

#Вычисление градиентного спуска
theta_result,J_history, theta_0, theta_1 = gradient_descent_multi(X,y,theta,alpha,iterations)

Theta 1:
[15.651431183495157,
 28.502297542920118,
 39.0665487784193,
 ...
 105.78644212297141,
 105.882701389551,
 105.97741737336399]
Theta 2:
[14.713094556818124,
 26.640668175454184,
 36.29642936488919,
 ....
 59.1710519900493,
 59.07633606136845]
Массив стоимости: 
array([185814.55027215, 149566.02825652, 120605.70700938,  97414.66187874,
            78807.39414333,  63853.50250138,  51819.24085843,  42123.5122655 ,
            34304.44290442,  27993.78459818,  22897.16477958,  18778.74417703,
           ....
             1257.38095357,   1257.13475353,   1256.89643143,   1256.66572779,
             1256.44239308,   1256.22618706,   1256.01687827,   1255.81424349,
             1255.61806734,   1255.42814185,   1255.24426618,   1255.06624625])

Чтобы построить последние два параметра относительно стоимости в 3D, вы можете использовать библиотеку matplotlib в Python. Вот пример того, как это сделать:

import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D

# Создание фигуры и 3D осей
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')

# Задать данные x, y и z
x = theta_0
y = theta_1
z = J_history

# Построить график данных
ax.scatter(x, y, z)

# Задать подписи осей x, y и z
ax.set_xlabel('theta_0')
ax.set_ylabel('theta_1')
ax.set_zlabel('стоимость')

plt.show()

Этот код создаст 3D график разброса с последними двумя параметрами на осях x и y, а стоимость на оси z. Затем вы можете использовать этот график для визуализации уровневых множеств на контурных графиках и функции cereal bowl.

Ответ или решение

Чтобы визуализировать процесс градиентного спуска в 3D, показывая уровень затрат на основе двух последних параметров модели, мы можем использовать библиотеку matplotlib в Python. Давайте рассмотрим весь процесс шаг за шагом, начиная от генерации данных до создания графиков.

Шаг 1: Вычисление стоимости и градиентного спуска

Предположим, что у нас уже есть функции, которые вы вычислили, такие как compute_cost и gradient_descent_multi. Эти функции позволяют нам вычислить стоимость на каждой итерации градиентного спуска и отслеживать изменение параметров θ.

import numpy as np

def compute_cost(X, y, theta):
    return np.sum(np.square(np.matmul(X, theta) - y)) / (2 * len(y))

def gradient_descent_multi(X, y, theta, alpha, iterations):
    m = len(y)
    j_history = np.zeros(iterations)
    theta_1_hist = []
    theta_2_hist = []

    for i in range(iterations):
        gradient = (1/m) * np.matmul(X.T, np.matmul(X, theta) - y)
        theta = theta - alpha * gradient

        j_history[i] = compute_cost(X, y, theta)
        theta_1_hist.append(theta[1])
        theta_2_hist.append(theta[2])

    return theta, j_history, theta_1_hist, theta_2_hist

Шаг 2: Инициализация и запуск градиентного спуска

Перед выполнением градиентного спуска убедитесь, что входные данные X и y подготовлены, а параметры инициализированы.

# Инициализация
theta = np.zeros(3)  # Здесь предполагается, что у нас 3 параметра
alpha = 0.1
iterations = 100

# Запуск градиентного спуска
theta_result, J_history, theta_1, theta_2 = gradient_descent_multi(X, y, theta, alpha, iterations)

Шаг 3: Визуализация данных в 3D

Теперь мы можем использовать библиотеку matplotlib для визуализации полученных данных. Создадим 3D-график, на котором ось X будет соответствовать theta_1, ось Y — theta_2, а ось Z — значениям стоимости (J_history).

import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D

# Создание фигуры и 3D-оси
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')

# Задание данных для осей
x = theta_1  # Второй параметр
y = theta_2  # Третий параметр
z = J_history  # Затраты

# Построение 3D-распределения 
ax.scatter(x, y, z, c='r', marker='o')

# Подписи осей
ax.set_xlabel('theta_1 (параметр 1)')
ax.set_ylabel('theta_2 (параметр 2)')
ax.set_zlabel('Стоимость (J)')
ax.set_title('Визуализация градиентного спуска в 3D')

plt.show()

Заключение

Вышеуказанный код создает 3D-график, который показывает, как параметры θ_1 и θ_2 изменяются в процессе градиентного спуска и каким образом стоимости итераций распределяются в пространстве. Исполнением этого кода вы сможете визуализировать уровень затрат, что поможет вам лучше понять, как градиенты сходятся и как меняется функция стоимости.

Оцените материал
Добавить комментарий

Капча загружается...