В R я сгенерировал некоторые искусственные данные для выполнения линейной регрессии, используя метод градиентного спуска Y = c0 + c1 * x1 + c2 * x2 + noise
Я также использую аналитический метод для расчета параметров тета = [c0, c1, c2]. Ниже приведены коды R с примечаниями для переменных.
Я использую метод градиентного спуска для вычисления тета. Формулы взяты из ссылки ниже.
слайды от человека
слайды из Стэнфорда - Эндрю Нг
Однако метод не может сходиться. Мои коды R ниже. тета сильно отличается от аналитического решения k в кодах R.
rm(list = ls())
n=500
x1=rnorm(n,mean=4,sd=1.6)
x2=rnorm(n,mean=4,sd=2.5)
X=cbind(x1,x2)
A=as.matrix(cbind(rep(1,n),x1,x2))
Y=-3.9+3.8*x1-2.4*x2+rnorm(n,mean=0,sd=1.5);
k=solve(t(A)%*%A,t(A)%*%Y) # k is the parameters determined by analytical method
MSE=sum((A%*%k-Y)^2)/(n);
iterations=3000 # total number of step
epsilon = 0.0001 # set precision
eta=0.0001 # step size
t1=integer(iterations)
e1=integer(iterations)
X=as.matrix(X)# convert data table X into a matrix
N=dim(X)[1] # total number of observations
X=as.matrix(cbind(rep(1,length(N)),X))# add a column of ones to represent intercept
np=dim(X)[2] # number of parameters to be determined
theta=matrix(rnorm(n=np,mean=0,sd=1),1,np) # Initialize theta:1 x np matrix
for(i in 1:iterations){
error =theta%*%t(X)-t(Y) # error = (theta * x' -Y'). Error is a 1xN row vector;
grad=(1/N)*error%*%X # Gradient grad is 1 x np vector
theta=theta-eta*grad # updating theta
L=sqrt(sum((eta*grad)^2)) # calculating the L2 norm
e1[i]=sum((error)^2)/(2*N) # record the cost function in each step (value=2*MSE)
t1[i]=L # record the L2 norm in each step
if(L<=epsilon){ # checking whether convergence is obtained or not
break
}
}
plot(e1*2,type="l",ylab="MSE",lwd=2,col=rgb(0,0,1))
abline(h=MSE)
text(x=1000,y=MSE+1,labels = "Actual MSE",adj=1)
text(x=500,y=15,labels = "Gradient Descent",adj=0.4)
theta
k