Почему моя функция градиентного спуска дает мне большие отрицательные значения?Python

Программы на Python
Ответить Пред. темаСлед. тема
Anonymous
 Почему моя функция градиентного спуска дает мне большие отрицательные значения?

Сообщение Anonymous »


Я пытаюсь запрограммировать градиентный спуск на Python. Первый код ниже отображает функцию ошибок для случаев 2D (wx+b) и 1D(wx). Второй код — это моя функция градиентного спуска, которая сохраняется как отдельная функция, то есть не в основном файле. Судя по графикам, значения min_w и min_b должны быть положительными, но функция градиентного спуска дает большое отрицательное значение. Фактически, начиная с w=0 и b=0, оно сразу становится отрицательным (что соответствует подъему на кривой ошибок), спуск идет в положительном направлении. Я пробовал разные размеры шага, количество итераций и начальные значения w и b, но все равно безуспешно. Пожалуйста, скажите мне, где я ошибаюсь.

импортировать numpy как np импортировать matplotlib.pyplot как plt x_train = np.array([1.0, 1.7, 2.0, 2.5, 3.0, 3.2]) x_mean = np.mean(x_train) x_std = np.std(x_train) x_train_normalized = (x_train - x_mean) / x_std y_train = np.array([250, 300, 480, 430, 630, 730,]) w=np.random.rand(200) * 2 - 1 b=np.random.rand(200) * 2 - 1 W, B = np.meshgrid(w, b) J=np.zeros((len(w),len(b))) J1=np.zeros((len(w))) y_bar = np.zeros((len(w), len(x_train))) м = len(x_train) x_new=x_train_normalized[:,np.newaxis,np.newaxis] y_new=y_train[:,np.newaxis,np.newaxis] y_bar=W*x_new+B sum_squared_errors=np.sum((y_bar-y_new)**2,ось=0) J=(1/(2*m))*sum_squared_errors из GD импорт gd2D min_w,min_b=gd2D(y_new,x_new,m,np) y_bar1=W*x_new sum_squared_errors1=np.sum((y_bar1-y_new)**2,ось=0) J1=(1/(2*m))*sum_squared_errors1 рис = plt.figure() топор = fig.add_subplot(111, проекция='3d') surf = ax.plot_surface(W, B, J, cmap='viridis', Edgecolor='none') ax.set_xlabel('ось W') ax.set_ylabel('ось B') ax.set_zlabel('ось J') ax.view_init(elev=20, azim=-60) # Отрегулируйте угол обзора для лучшей визуализации fig.colorbar(surf) # Добавляем цветовую полосу сбоку plt.show() plt.scatter(W,J1,marker='X',c='r',s=10) plt.title("АБС") plt.ylabel("J") plt.xlabel("w") plt.show() Ниже приведена моя функция градиентного спуска.
def gd2D(y_new,x_new,m,np): итр = 5000 альфа = 0,01 ш=0 б=0 для меня в диапазоне (itr): y_bar=w*x_new+b dw=(np.sum((y_new-y_bar)*x_new))/m db=(np.sum(y_new-y_bar))/m w=w-альфа*dw b=b-альфа*дб вернуть w,b
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Python»