Здесь мы увидим, как градиентный спуск применяется к линейной и логистической регрессии.

import matplotlib.pyplot as plot
import random
import numpy as np
# Plotting the loss function
plot.title('Loss function with iterations')
plot.xlabel('iterations')
plot.ylabel('loss')
plot.grid(True, which='both')
plot.axhline(y=0, color='k')
plot.ylim(0, 10)
xaxis=np.linspace(0,iterations,iterations, endpoint=True)

Начнем с импорта необходимых библиотек, смотрим matplotlib.pyplot здесь.
Строим график зависимости потерь от количества итераций.

n=50
x=[i for i in range(n)]
y=[79*i+91 for i in range(n)]
iterations=3000

сейчас мы создаем набор данных для нашей модели. затем установите количество итераций. Гипотеза представляет собой линейную модель, т. е. j (x) = a * x + b, а значения «a» и «b» берутся случайным образом, значения скоростей обучения для a принимаются за небольшое значение, а значение b считается относительно большим значением.

a=n*(random.random())
b=n*(random.random())
alphax=0.004
alphay=0.92

частная производная потерь (квадрат разницы разницы идеального выпуска и нашего выпуска) по a и b вычитается из a и b соответственно, частная производная должна быть сначала вычислена для каждой переменной в гипотезе и затем вычитается из соответствующей переменной, чтобы потери не изменились после вычитания частной производной из соответствующей переменной.

for i in range(iterations):
  temp=int(random.random()*n)
  da=alphax*((a*x[temp]+b-y[temp])*x[temp])/n
  db=alphay*(a*x[temp]+b-y[temp])/n
  a-=da
  b-=db
  loss=0
  for j in range(n):
    loss+=(a*x[j]+b-y[j])**2/(2*n)
  yaxis.append(loss)

В приведенном выше фрагменте кода выбирается случайный индекс данных и применяется обратное распространение, т. е. частные производные потерь вычисляются для данных этого набора данных, и эти частные производные вычитаются из соответствующих переменных. Во втором цикле for вычисляются и сохраняются потери, чтобы построить график между потерями и итерациями.

print(a,b,loss)
plot.plot(xaxis,yaxis,label="loss")
plot.legend()
plot.show()

График построен в приведенном выше фрагменте кода.
Полный код можно найти здесь.

Теперь давайте кратко рассмотрим логистическую регрессию.

Существенное различие между линейной регрессией и логистической регрессией заключается в типе используемой функции потерь и типе получаемого результата. используйте логарифмическую функцию потерь, а вывод будет двоичным.

Частная производная потерь по соответствующим переменным в гипотезе вычитается из самой себя (точно так же, как простой градиентный спуск)
Ниже приведена реализация обратного распространения логистической регрессии.

for i in range(iterations):
  temp=int(random.random()*n)
  da=alphax*((hypo(a,b,x[temp])-y[temp])*x[temp])/n
  db=alphay*(hypo(a,b,x[temp])-y[temp])/n
  a-=da
  b-=db
  loss=0
  for j in range(n):
    if hypo(a,b,x[j])==1 or hypo(a,b,x[j])==0:
      loss+=1/n
    else:
      loss-=(y[j]*math.log(hypo(a,b,x[j]))+(1-y[j])*math.log(1-hypo(a,b,x[j])))/(n)
  yaxis.append(loss)

затем обученная гипотеза используется для прогнозирования бинарного вывода (если сигмоид гипотезы равен ›0,5, то результат равен 1, иначе 0).

Полный код можно найти здесь.

Не стесняйтесь задавать любые вопросы, Нажмите здесь, чтобы связаться со мной» ;)