Я знаю, что этот вопрос задавали много раз, но у меня все еще есть проблема. Я выбрал небольшое значение альфа и выполнил много итераций, чтобы найти точку схождения, но это не сработало. Любая помощь будет оценена по достоинству. Вот полный код. Функции 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)