Градиентный спуск не приближается к минимуму - PullRequest
0 голосов
/ 18 июня 2020

Я знаю, что этот вопрос задавали много раз, но у меня все еще есть проблема. Я выбрал небольшое значение альфа и выполнил много итераций, чтобы найти точку схождения, но это не сработало. Любая помощь будет оценена по достоинству. Вот полный код. Функции GradientDescent () и Cost () вычисляют значения m и b, а функции line () и show () используются только для построения графика.

import numpy as np
import matplotlib.pyplot as plt
import pandas as pd
import random

def show(x,y):
    plt.plot(x,y,"ro")
    plt.show()

def line(m,b):
    xpoints=np.arange(25)
    ypoints=np.zeros(len(xpoints))

    for i in range(len(xpoints)):
        ypoints[i]=m*xpoints[i]+b

    plt.plot(xpoints,ypoints,alpha=0.2)

def cost(xpoints,ypoints,m,b,flag):
    pridicted_y=np.zeros(len(xpoints))
    error=np.zeros(len(xpoints))
    TotalError=0

    for i in range(len(xpoints)):
        if(flag==0):
            pridicted_y[i] = m*xpoints[i]+b
            error[i]= pridicted_y[i] - ypoints[i]
        if(flag==1):
            pridicted_y[i] = m*xpoints[i]+b
            error[i]= (pridicted_y[i] - ypoints[i])*xpoints[i]
        TotalError=TotalError+error[i]

        # plt.plot([xpoints[i],xpoints[i]],[ypoints[i],pridicted_y[i]])
        # print(error[i],end=" ")
    return TotalError
def GradientDescent(xpoints,ypoints,m,b,alpha):
    k=len(xpoints)
    M=m
    B=b
    x=0
    for i in range(500):
        for j in range(2):
            M = m-alpha*(1/k)*cost(xpoints,ypoints,m,b,0)
            B = b-alpha*(1/k)*cost(xpoints,ypoints,m,b,1)
        m=M
        b=B
        line(m,b)
        if(x==1):
            plt.show()
            print(i,m,b)
    return (m,b)
#random data set
x=np.arange(20)
y = [int(i+random.random()*10) for i in x]
min_x = np.mean(x)
min_y = np.mean(y)


#predetermined variable values
m=0
b=0
alpha=0.001

# cost(x,y,m,b)
m,b=GradientDescent(x,y,m,b,alpha)
plt.plot(min_x,min_y,"ko")
plt.plot(min_x,m*min_x+b,"go")
line(m,b)
show(x,y)
print(m,b)

enter image description here

1 Ответ

0 голосов
/ 18 июня 2020

Похоже, вы только что сделали небольшую ошибку: в вашей функции cost, которая вычисляет градиент, градиент по m был заменен градиентом по b и наоборот. Изменяя флаги следующим образом

    if(flag==1):#instead of flag==0
        pridicted_y[i] = m*xpoints[i]+b
        error[i]= pridicted_y[i] - ypoints[i]
    if(flag==0):#instead of flag==1
        pridicted_y[i] = m*xpoints[i]+b
        error[i]= (pridicted_y[i] - ypoints[i])*xpoints[i]

, я получаю такой результат:

enter image description here

...