在学习逻辑回归时,对梯度上升算法进行了应用,看到其他的博客讲解,梯度上升算法适合求最大值,梯度下降算法适合求最小值,这里有一个分析:
梯度上升算法公式
是学习率,是一个常数。
这个是根据逻辑回归的损失函数进行推导的。
梯度下降公式:
这个是根据线性回归的损失函数推导的。
我在思考这个跟线性回归里边的平方误差一样,都是求导为什么计算的结果不一样,后来才明白,线性回归用的是最小二乘法,梯度下降用的是损失函数,也不知道这样理解对不对。
随机梯度算法:
def stochastic_gradient_descent(x,y,theta,alpha,m,max_iter): # 自变量,因变量,待求的权值,学习速度,样本总数,最大迭代次数#随机梯度下降法,每一次梯度下降只使用一个样本iter=0flag=0while True:for i in range(m):#遍历样本deviation=0h=theta[0]*x[i][0] +theta[1]*x[i][1]theta[0] =theta[0] + alpha*(y[i]-h)*x[i][0]theta[1] =theta[1] + alpha*(y[i]-h)*x[i][1]iter = iter+1#计算误差for i in range(m):deviation = deviation +(y[i]-(theta[0]*x[i][0]+theta[1]*x[i][1]))**2if deviation <EPS or iter>max_iter:flag=1breakif flag==1:.breakreturn theta,iter,deviation
matrix_x = [[2.1,1.5],[2.5,2.3],[3.3,3.9],[3.9,5.1],[2.7,2.7]]
matrix_y = [2.5,3.9,6.7,8.8,4.6]
MAX_ITER =5000
EPS = 0.0001
theta=[2,-1]
ALPHA = 0.05
resultTheta,iters,deviation=stochastic_gradient_descent(matrix_x,matrix_y,theta,ALPHA,5,MAX_ITER)
print ('theta=',resultTheta)
print ('iters=',iters)
print ('deviation=',deviation)
批量梯度下降算法:
def batch_gradient_descent(x,y,theta,alpha,m,max_iter):#批量梯度下降法,每一次梯度下降使用训练集中的所有样本来计算误差。deviation = 1iter = 0while deviation > EPS and iter < max_iter:deviation = 0sigma1 = 0sigma2 = 0for i in range(m): #对训练集中的所有数据求和迭代h = theta[0] * x[i][0] + theta[1] * x[i][1]sigma1 = sigma1 + (y[i] - h)*x[i][0] sigma2 = sigma2 + (y[i] - h)*x[i][1] theta[0] = theta[0] + alpha * sigma1 /mtheta[1] = theta[1] + alpha * sigma2 /m#计算误差for i in range(m):deviation = deviation + (y[i] - (theta[0] * x[i][0] + theta[1] * x[i][1])) ** 2iter = iter + 1return theta, iter
matrix_x = [[2.1,1.5],[2.5,2.3],[3.3,3.9],[3.9,5.1],[2.7,2.7]]
matrix_y = [2.5,3.9,6.7,8.8,4.6]
MAX_ITER = 5000
EPS = 0.0001 #批量梯度
theta = [2,-1]
ALPHA = 0.05resultTheta,iters = batch_gradient_descent(matrix_x, matrix_y, theta, ALPHA, 5, MAX_ITER)
print ('theta=',resultTheta)
print ('iters=',iters)
随机梯度是在运行中选中一个样本,适合样本多的例子,但是,结果可能准确性不高。
批量梯度是选择m个样本就是比较,找到最小值,该算法适合样本少的例子,运行的效果也是比较好的。