逻辑回归梯度下降详细python代码实现

梯度下降法

  1. 批量梯度下降法BGD

  2. 随机梯度下降法SGD

  3. 小批量梯度下降发MSGD

    BGD会获得全局最优解,缺点是在更新每个参数的时候需要遍历所有的数据,计算量会
    很大,并且会有很多的冗余计算,导致的结果是当数据量大的时候,每个参数的更新
    都会很慢。
    
    SGD以高方差频繁更新,优点是使得SGD会跳到新的和潜在更好的局部最优解,缺点是
    使得收敛到局部最优解的过程更加的复杂。
    
    MBGD降结合了BGD和SGD的优点,每次更新的时候使用n个样本。减少了参数更新的次
    数,可以达到更加稳定收敛结果,一般在深度学习当中可以采用这种方法,将数据一
    个batch一个batch的送进去训练。
    

使用BGD求解逻辑回归

	每个回归系数初始化为1
	重复下面步骤直至收敛:
			计算整个数据集的梯度
			使用alpha*gradient更新回归系数的向量
	返回回归系数

代码实现:

# 导入数据集
import pandas as pd
import numpy as np
dataSet = pd.read_table('testSet.txt',header = None)
dataSet.columns =['X1','X2','labels']
dataSet.head()

在这里插入图片描述

# 定义sigmoid函数
def sigmoid(x):
	s = 1/(1 + np.exp(-x))
	return s

# 定义标准化函数,可以更快收敛
def regularize(xMat):
    inMat = xMat.copy()
    inMeans = np.mean(inMat,axis = 0) # 求每一列的均值
    inVar = np.std(inMat,axis = 0)  # 求每一列的方差
    inMat = (inMat - inMeans)/inVar # 每一个特征属性标准化
    return inMat

# 定义BGD梯度下降函数更新θ
def BGD_LR(dataSet,alpha=0.001,maxCycles=500): # alpha步长,maxCycles最大迭代次数
    yMat = np.mat(dataSet.iloc[:,-1].values).T
    xMat = regularize(xMat)
    m,n = xMat.shape
    weights = np.zeros((n,1))  有几个特征,定义几个权重值,这里将权重值初始化为0
    for i in range(maxCycles):
        grad = xMat.T*(xMat * weights-yMat)/m  # 这里是BGD的矩阵方式描述求梯度的公式,可以换成SGD的公式或者其他
        weights = weights -alpha*grad
    return weights

# 建立主函数
def logisticAcc(dataSet, method, alpha=0.01, maxCycles=500): # method可以选择BGD或者SGD等
    weights = method(dataSet,alpha=alpha,maxCycles=maxCycles)
    p = sigmoid(xMat * weights).A.flatten()
    for i, j in enumerate(p):
        if j < 0.5:
            p[i] = 0
        else:
            p[i] = 1
    train_error = (np.fabs(yMat.A.flatten() - p)).sum()
    trainAcc = 1 - train_error / yMat.shape[0]
    return trainAcc

logisticAcc(dataset, SGD_LR)
  • 2
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值