考核成绩分类-梯度下降算法求逻辑回归
- 格式:doc
- 大小:391.20 KB
- 文档页数:9
梯度下降法推导逻辑回归逻辑回归是一种用于二分类问题的机器学习算法。
梯度下降法是一种优化算法,可用于求解逻辑回归的参数。
在逻辑回归中,首先定义了一个逻辑函数,也称为sigmoid函数,它可以将任意输入映射到一个0到1之间的输出。
逻辑函数的定义如下:h(x) = 1 / (1 + exp(-z))其中,h(x)为逻辑回归模型的输出,z为输入特征的线性组合加上一个偏置项,即:z = w1*x1 + w2*x2 + ... + wn*xn + b在逻辑回归中,我们的目标是找到一组最优的参数w和b,使得对于给定的输入特征,逻辑回归模型的输出能够最好地与实际标签相匹配。
为了衡量模型的性能,我们引入了一个成本函数来度量模型的预测结果与实际标签之间的差异。
对于二分类问题,逻辑回归模型的成本函数可以使用对数似然函数来定义:J(w, b) = -1/m * Σ(yi*log(h(xi)) + (1-yi)*log(1-h(xi)))其中,m表示训练样本的数量,yi表示第i个样本的实际标签。
接下来,我们需要使用梯度下降法来最小化成本函数。
梯度下降法的思想是沿着成本函数的负梯度方向不断更新参数,直到收敛到最优解。
对于每个参数,我们使用以下公式来更新它们:wi = wi - η * ∂J(w, b) / ∂wib = b - η * ∂J(w, b) / ∂b其中,η是学习率,控制着参数更新的步长。
∂J(w, b) / ∂wi表示成本函数对参数wi的偏导数。
根据对成本函数的求导运算和链式法则,我们可以推导出参数的更新公式:∂J(w, b) / ∂wi = -1/m * Σ(xi * (yi - h(xi)))∂J(w, b) /∂b = -1/m * Σ(yi - h(xi))根据这些公式,在每次迭代中,我们都可以更新参数w和b,然后继续计算成本函数,并重复这个过程,直到达到收敛条件。
最终,我们将得到一组使得成本函数最小化的最优参数。
梯度下降法解逻辑斯蒂回归本⽂是Andrew Ng 在Coursera 的机器学习课程的笔记。
Logistic 回归属于分类模型。
回顾,输出的是连续的实数,⽽Logistic 回归输出的是[0,1]区间的概率值,通过概率值来判断因变量应该是1还是0。
因此,虽然名字中带着“回归”(输出范围常为连续实数),但Logistic 回归属于分类模型(输出范围为⼀组离散值构成的集合)。
整体步骤假如我们的⾃变量是“数学课和英语课的成绩”,x={x1,x2},因变量是“能否被哥⼤录取”,y ∈{0,1}。
我们要通过这两个⾃变量的分布,来预测因变量的值。
Logistic 回归的步骤为:1. 设定拟合函数(hypothesis function ):h θ(x),其意义是给定参数θ,根据输⼊x ,给出输出h θ(x),当输出值⼤于0.5时预测录取,否则预测被拒。
2. 设定代价函数(cost function ):J(θ),其意义是累加所有样本的 预测结果h θ(x) 与 真实结果y 之间的差距。
3. 利⽤梯度下降法,来调整参数θ,使得代价函数J(θ)的值最⼩。
⽐较线性回归与Logistic 回归,可以看出⼆者⾮常相似,但是Logistic 回归的拟合函数(步骤⼀)和代价函数(步骤⼆)的定义⽅法与线性回归有所不同。
Step 1:拟合函数线性回归的拟合函数为:h θ(x) = θTx ,输出范围为所有实数,⽽其因变量的取值范围也确实属于所有实数。
但是Logistic 回归的最终输出要么是0,要么是1,我们不能直接套⽤线性回归的拟合函数。
对于Logistic 回归,我们需要控制输出在[0,1]之间,因此借助函数g:g (z )=11+e −z 函数g 为S 型函数(Sigmoid function ),也称为Logistic function ,“Logistic 回归”就是得名于此。
最终的拟合函数为:h θ(x )=g (θT x )=11+e −θT x 这个拟合函数的输出范围在[0,1]之间,表⽰分类结果为1的可能性。
机器学习算法---逻辑回归及梯度下降 logistic回归⼜称logistic回归分析,是⼀种⼴义的线性回归分析模型,常⽤于数据挖掘,疾病⾃动诊断,经济预测等领域。
logistic回归是⼀种⼴义线性回归(generalized linear model),因此与多重线性回归分析有很多相同之处。
其公式如下: 其图像如下: 我们通过观察上⾯的图像可以发现,逻辑回归的值域为(0, 1),当输⼊为0时,其输出为0.5;当输⼊⼩于0,并且越来越⼩时,其输出越来越接近于0;相反的,当其输⼊⼤于0,并且越来越⼤时,其输出越来越接近于1。
通常我们使⽤线性回归来预测值,但逻辑回归随有“回归”⼆字,却通常是⽤来解决⼆分类问题的。
当其输出⼤于0.5时,我们可以认为该样本属于甲类;⼩于0.5时,认为该样本属于已类。
但是由于⼀个样本数据通常会有多个特征,我们不能将其直接带⼊logistic回归公式中,所以,就需要借助之前所介绍的线性回归,使该样本的多个特征值⽣成⼀个特定的值,在带⼊公式中,对其分类,所以z的表达式如下: 即可得到对于⼀个数据关于逻辑回归的详细表达式: 通过上式,我们就可以对⼀个任意数据进⾏逻辑回归分析了,但是这当中存在⼀个问题,即关于θ的取值,只有公式中的θ已知,我们才能对⼀个未分类的数据运⽤此公式,那么该如何求得θ呢?请看下⾯的公式推导。
公式推导 在上⾯,我们得到 后,需要求得θ,关于如何求得θ,将在此进⾏详细分析。
通常在机器学习中,我们常常有⼀个过程叫训练,所谓训练,即通过已知分类(或标签)的数据,求得⼀个模型(或分离器),然后使⽤这个模型对未知标签的数据打上标签(或者对其进⾏分类)。
所以,我们使⽤样本(即已知分类的数据),进⾏⼀系列的估算,得到θ。
这个过程在概率论中叫做参数估计。
在此,我们将使⽤极⼤似然估计的推导过程,求得关于计算θ的公式: (1) ⾸先我们令: (2) 将上述两式整合: (3) 求其似然函数: (4) 对其似然函数求对数: (5) 当似然函数为最⼤值时,得到的θ即可认为是模型的参数。
Logistic回归学习材料广义线性模型(generalizedlinear model)这一家族中的模型形式基本上都差不多,不同的就是因变量不同。
∙如果是连续的,就是多元线性回归;∙如果是二项分布,就是Logistic回归;∙如果是Poisson分布,就是Poisson回归;∙如果是负二项分布,就是负二项回归。
Logistic回归的因变量可以是二分类的,也可以是多分类的,但实际中最常用的就是二分类的Logistic回归。
自变量既可以是连续的,也可以是分类的。
常规步骤Regression问题的常规步骤为:1. 寻找h函数(即hypothesis);2. 构造J函数(损失函数);3. 使J函数最小并求得回归参数(θ)构造预测函数hLogistic回归实际上是一种分类方法,主要用于两分类问题(即输出只有两种,分别代表两个类别),所以利用了Logistic函数(或称为Sigmoid函数),函数形式为:下面左图是一个线性的决策边界,右图是非线性的决策边界。
对于线性边界的情况,边界形式如下(n:特征个数;m:样本数):构造预测函数为:函数的值有特殊的含义,它表示结果取1的概率,因此对于输入x分类结果为类别1和类别0的概率分别为:构造损失函数JJ函数如下,它是基于最大似然估计推导得到的。
下面详细说明推导的过程:(1)式综合起来可以写成:取似然函数为:对数似然函数为:最大似然估计就是求使取最大值时的θ,将取为下式,即:因为乘了一个负的系数-1/m,所以取最小值时的θ为要求的最佳参数。
梯度下降法求的最小值θ更新过程:θ更新过程可以写成:更新过程向量化(Vectorization)训练数据的矩阵形式如下,x的每一行为一条训练样本,而每一列为不同特征的取值:θ更新过程可以改为:综上所述,Vectorization后θ更新的步骤如下:(1)求;(2)求;(3)求。
梯度下降法推导逻辑回归摘要:1.梯度下降法简介2.逻辑回归简介3.梯度下降法在逻辑回归中的应用4.梯度下降法推导逻辑回归的步骤5.结论正文:1.梯度下降法简介梯度下降法是一种常用的优化算法,主要应用于求解无约束的最小化问题。
它的基本思想是:从一个初始点开始,沿着负梯度方向逐步更新参数,直到达到目标函数的最小值。
梯度下降法有多种变体,如批量梯度下降、随机梯度下降、最小二乘法等。
2.逻辑回归简介逻辑回归是一种用于分类问题的线性模型,其输出结果为概率分布。
逻辑回归模型可以表示为:$y = sigma(z)$,其中$y$ 是输出的类别概率,$sigma$ 是逻辑斯蒂函数,$z$ 是输入特征的线性组合。
通过调整模型参数(权重和偏置),可以使模型在训练数据上达到最优的分类效果。
3.梯度下降法在逻辑回归中的应用在逻辑回归中,梯度下降法主要用于求解模型参数(权重和偏置),使得模型在训练数据上的损失函数(如交叉熵损失)最小化。
梯度下降法在逻辑回归中的应用过程主要包括两个步骤:计算梯度和更新参数。
4.梯度下降法推导逻辑回归的步骤假设我们有一组训练数据${(x_1, y_1), (x_2, y_2), ldots, (x_n, y_n)}$,其中$x_i$ 是输入特征,$y_i$ 是对应的类别标签。
我们的目标是通过调整模型参数$theta = (w, b)$,使得模型在训练数据上的损失函数最小化。
(1)计算损失函数:首先,我们需要计算模型在训练数据上的损失函数。
对于逻辑回归问题,常用的损失函数是交叉熵损失。
损失函数可以表示为:$L(theta) = -frac{1}{n} sum_{i=1}^{n} y_i log(y_i)$。
(2)计算梯度:为了找到使损失函数最小化的参数方向,我们需要计算损失函数关于参数的梯度。
对于逻辑回归问题,梯度可以表示为:$frac{dL}{dtheta} = frac{1}{n} sum_{i=1}^{n} (y_i - sigma(z_i))frac{dz_i}{dtheta}$。
逻辑回归(LogisticRegression)和梯度下降(GradientDescent)1 逻辑回归逻辑回归是⼀个⽤于⼆分类(binary classification)的算法,以在⼆分类问题中,我们的⽬标就是习得⼀个分类器,它以图⽚的特征向量作为输⼊,然后预测输出结果 y 为 1 还是 0。
逻辑回归的公式定义如下:损失函数:代价函数:1.1逻辑回归模型对于⼆元分类问题来讲,给定⼀个输⼊特征向量X,它可能对应⼀张图⽚,你想识别这张图⽚识别看它是否是⼀只猫或者不是⼀只猫的图⽚,你想要⼀个算法能够输出预测,你只能称之为y^,也就是你对实际值 y 的估计,X是⼀个n x维的向量(相当于有n x个特征的特征向量)。
我们⽤w来表⽰逻辑回归的参数,这也是⼀个 n x维向量(因为w实际上是特征权重,维度与特征向量相同),参数⾥⾯还有b,这是⼀个实数(表⽰偏差)。
所以给出输⼊x以及参数w和b之后,我们怎样产⽣输出预测值y^,⼀件你可以尝试却不可⾏的事是让y^ = w T + b下图是 sigmoid 函数的图像,如果我把⽔平轴作为z轴,那么关于z的 sigmoid 函数是这样的,它是平滑地从 0 ⾛向 1,让我在这⾥标记纵轴,这是 0,曲线与纵轴相交的截距是 0.5,这就是关于z的 sigmoid 函数的图像。
我们通常都使⽤z来表⽰w T + b的值,关于 sigmoid 函数的公式和图像:1.2逻辑回归的代价函数(成本函数)为了训练逻辑回归模型的参数参数w和参数b我们,需要⼀个代价函数,通过训练代价函数来得到参数w和参数b。
损失函数⼜叫做误差函数,⽤来衡量算法的运⾏情况,Loss function:L(y^ , y),这个L称为的损失函数,来衡量预测输出值和实际值有多接近。
⼀般我们⽤预测值和实际值的平⽅差或者它们平⽅差的⼀半,虽然平⽅差是⼀个不错的损失函数,但是我们在逻辑回归模型中会定义另外⼀个损失函数,在逻辑回归中⽤到的损失函数是:损失函数是在单个训练样本中定义的,它衡量的是算法在单个训练样本中表现如何,为了衡量算法在全部训练样本上的表现如何,我们需要定义⼀个算法的代价函数,算法的代价函数是对m个样本的损失函数求和然后除以m:损失函数只适⽤于像这样的单个训练样本,⽽代价函数是参数的总代价,所以在训练逻辑回归模型时候,我们需要找到合适的w和b,来让代价函数 J 的总代价降到最低。
梯度下降法推导逻辑回归1. 引言逻辑回归是一种经典的分类算法,其主要用于解决二分类问题。
梯度下降法是一种常用的优化算法,用于求解逻辑回归模型的参数。
本文将从推导逻辑回归模型开始,详细介绍梯度下降法在逻辑回归中的应用。
2. 逻辑回归模型2.1 模型定义逻辑回归模型是一种广义线性模型(Generalized Linear Model, GLM ),其形式为:P (y =1|x;θ)=11+e −θT x其中,x 是输入特征向量,θ 是模型参数向量。
2.2 模型解释在逻辑回归中,我们希望根据输入特征 x 预测输出标签 y 的概率。
通过对模型进行变换,我们可以得到:log (P (y =1|x;θ)P (y =0|x;θ))=θT x 上式左边表示预测输出为正例的对数几率与输出为负例的对数几率之间的差异,右边表示输入特征与模型参数的线性组合。
因此,逻辑回归模型可以看作是在特征空间中通过一个超平面来划分正例和负例。
2.3 模型参数估计为了求解逻辑回归模型的参数 θ,我们需要定义一个损失函数,并通过最小化损失函数来求解最优参数。
常用的损失函数是对数似然函数(Log Likelihood ),其定义如下:L (θ)=∑(y (i )log (P(y =1|x (i );θ))+(1−y (i ))log (P(y =0|x (i );θ)))mi=1其中,(x (i ),y (i )) 表示训练数据集中的第 i 个样本。
3. 梯度下降法梯度下降法是一种迭代优化算法,用于求解无约束问题的最优解。
它通过计算损失函数关于参数的梯度方向,并按照梯度方向更新参数值,逐步接近最优解。
3.1 梯度下降算法梯度下降算法的更新规则如下:θj:=θj−α∂L(θ)∂θj其中,α是学习率(learning rate),∂L(θ)∂θj是损失函数关于参数θj的偏导数。
3.2 梯度计算为了应用梯度下降法求解逻辑回归模型的参数,我们需要计算损失函数关于参数的偏导数。
Exam 1Exam 2Admitted 034.62366078.024*******.28671143.8949980235.84740972.9021980360.18259986.3085521479.03273675.3443761⽰例⼀:梯度下降求解逻辑回归⼀、The data我们将建⽴⼀个逻辑回归模型来预测⼀个学⽣是否被⼤学录取。
假设你是⼀个⼤学系的管理员,你想根据两次考试的结果来决定每个申请⼈的录取机会。
你有以前的申请⼈的历史数据,你可以⽤它作为逻辑回归的训练集。
对于每⼀个培训例⼦,你有两个考试的申请⼈的分数和录取决定。
为了做到这⼀点,我们将建⽴⼀个分类模型,根据考试成绩估计⼊学概率。
#三⼤件import numpy as npimport pandas as pdimport matplotlib.pyplot as pltimport ospath = 'data' + os.sep + 'LogiReg_data.txt'pdData = pd.read_csv(path, header=None, names=['Exam 1', 'Exam 2', 'Admitted'])pdData.head()pdData.shape #(100, 3)展⽰图形:positive = pdData[pdData['Admitted'] == 1] # 被录取的学⽣的数据negative = pdData[pdData['Admitted'] == 0] # 未被录取的学⽣的数据fig, ax = plt.subplots(figsize=(10,5)) #定义⼀个画图区域# 2个散点图:ax.scatter(x 轴数据,y 轴数据, s=颜⾊饱和度,c=颜⾊,maker=散点的标记图形,label=label 导航标题)ax.scatter(positive['Exam 1'], positive['Exam 2'], s=30, c='b', marker='o', label='Admitted')ax.scatter(negative['Exam 1'], negative['Exam 2'], s=30, c='r', marker='x', label='Not Admitted')ax.legend()ax.set_xlabel('Exam 1 Score') #设置x 轴的标题ax.set_ylabel('Exam 2 Score')取得以上两个散点图的分界线⼆、The logistic regression :逻辑回归⽬标:建⽴分类器(求解出三个参数 θ0θ1θ2),θ0偏置项θ1第⼀次测试的成绩θ2第⼆次测试的成绩设定阈值,根据阈值判断录取结果要完成的模块sigmoid : 映射到概率的函数model : 返回预测结果值cost : 根据参数计算损失gradient : 计算每个参数的梯度⽅向descent : 进⾏参数更新accuracy: 计算精度三、实现逻辑回归的各模块1.sigmoid函数:def sigmoid(z):return 1 / (1 + np.exp(-z))测试sigmoid函数:nums = np.arange(-10, 10, step=1) # -10到10之间,步长为1的数字列表fig, ax = plt.subplots(figsize=(12,4))ax.plot(nums, sigmoid(nums), 'r')2.预测函数# 预测函数h;np.dot(X, theta.T)两个矩阵相乘,如图所⽰def model(X, theta):return sigmoid(np.dot(X, theta.T))查看数据:pdData.insert(0, 'Ones', 1) # in a try / except structure so as not to return an error if the block si executed several times # set X (training data) and y (target variable)orig_data = pdData.as_matrix() # convert the Pandas representation of the data to an array useful for further computations cols = orig_data.shape[1]X = orig_data[:,0:cols-1]y = orig_data[:,cols-1:cols]# convert to numpy arrays and initalize the parameter array theta#X = np.matrix(X.values)#y = np.matrix(data.iloc[:,3:4].values) #np.array(y.values)# 构造theta矩阵结构theta = np.zeros([1, 3])X[:5]Out[10]:array([[ 1. , 34.62365962, 78.02469282],[ 1. , 30.28671077, 43.89499752],[ 1. , 35.84740877, 72.90219803],[ 1. , 60.18259939, 86.3085521 ],[ 1. , 79.03273605, 75.34437644]])y[:5]Out[11]:array([[ 0.],[ 0.],[ 0.],[ 1.],[ 1.]])theta# array([[ 0., 0., 0.]])X.shape, y.shape, theta.shape# ((100, 3), (100, 1), (1, 3))3.损失函数# 损失函数def cost(X, y, theta):left = np.multiply(-y, np.log(model(X, theta)))right = np.multiply(1 - y, np.log(1 - model(X, theta)))return np.sum(left - right) / (len(X)) # 求平均损失cost(X, y, theta)# 0.69314718055994534.计算梯度# 计算梯度,求偏导def gradient(X, y, theta):grad = np.zeros(theta.shape)error = (model(X, theta)- y).ravel()for j in range(len(theta.ravel())): #for each parmeterterm = np.multiply(error, X[:,j])grad[0, j] = np.sum(term) / len(X)return grad5.Gradient descent⽐较3中不同梯度下降⽅法:批量梯度下降、随机梯度下降、⼩批量梯度下降STOP_ITER = 0 #根据迭代次数停⽌迭代STOP_COST = 1 #根据损失值停⽌迭代STOP_GRAD = 2 #根据梯度变化停⽌迭代def stopCriterion(type, value, threshold):#设定三种不同的停⽌策略if type == STOP_ITER: return value > thresholdelif type == STOP_COST: return abs(value[-1]-value[-2]) < thresholdelif type == STOP_GRAD: return np.linalg.norm(value) < thresholdimport numpy.random#对数据进⾏洗牌,打乱原有数据的规律def shuffleData(data):np.random.shuffle(data)cols = data.shape[1]X = data[:, 0:cols-1]y = data[:, cols-1:]return X, yimport time# stopType停⽌策略;thresh预值;alpha学习率def descent(data, theta, batchSize, stopType, thresh, alpha):#梯度下降求解init_time = time.time()i = 0 # 迭代次数k = 0 # batchX, y = shuffleData(data)grad = np.zeros(theta.shape) # 计算的梯度costs = [cost(X, y, theta)] # 损失值while True:grad = gradient(X[k:k+batchSize], y[k:k+batchSize], theta)k += batchSize #取batch数量个数据if k >= n:k = 0X, y = shuffleData(data) #重新洗牌theta = theta - alpha*grad # 参数更新costs.append(cost(X, y, theta)) # 计算新的损失i += 1if stopType == STOP_ITER: value = ielif stopType == STOP_COST: value = costselif stopType == STOP_GRAD: value = gradif stopCriterion(stopType, value, thresh): breakreturn theta, i-1, costs, grad, time.time() - init_timedef runExpe(data, theta, batchSize, stopType, thresh, alpha):#import pdb; pdb.set_trace();theta, iter, costs, grad, dur = descent(data, theta, batchSize, stopType, thresh, alpha) name = "Original"if (data[:,1]>2).sum() > 1 else"Scaled"name += " data - learning rate: {} - ".format(alpha)if batchSize==n: strDescType = "Gradient"elif batchSize==1: strDescType = "Stochastic"else: strDescType = "Mini-batch ({})".format(batchSize)name += strDescType + " descent - Stop: "if stopType == STOP_ITER: strStop = "{} iterations".format(thresh)elif stopType == STOP_COST: strStop = "costs change < {}".format(thresh)else: strStop = "gradient norm < {}".format(thresh)name += strStopprint ("***{}\nTheta: {} - Iter: {} - Last cost: {:03.2f} - Duration: {:03.2f}s".format(name, theta, iter, costs[-1], dur))fig, ax = plt.subplots(figsize=(12,4))ax.plot(np.arange(len(costs)), costs, 'r')ax.set_xlabel('Iterations')ax.set_ylabel('Cost')ax.set_title(name.upper() + ' - Error vs. Iteration')return theta6.不同的停⽌策略1).设定迭代次数#选择的梯度下降⽅法是基于所有样本的n=100runExpe(orig_data, theta, n, STOP_ITER, thresh=5000, alpha=0.000001)2).根据损失值停⽌设定阈值 1E-6, 差不多需要110 000次迭代runExpe(orig_data, theta, n, STOP_COST, thresh=0.000001, alpha=0.001)3).根据梯度变化停⽌设定阈值 0.05,差不多需要40 000次迭代runExpe(orig_data, theta, n, STOP_GRAD, thresh=0.05, alpha=0.001)7.对⽐不同的梯度下降⽅法1).Stochastic descentrunExpe(orig_data, theta, 1, STOP_ITER, thresh=5000, alpha=0.001)2).以上的结果:有点爆炸。
梯度下降法推导逻辑回归梯度下降法是一种常用的优化算法,用于求解函数的最小值。
在逻辑回归问题中,我们可以使用梯度下降法来求解逻辑回归的参数。
逻辑回归是一种用于分类问题的机器学习算法。
它通过将线性回归的结果通过一个sigmoid函数映射到[0,1]之间来得到概率预测,以此进行分类。
假设我们的训练数据集包含m个样本,每个样本有n个特征。
逻辑回归的目标是找到一组参数θ,使得通过该参数进行预测得到的结果与真实标签的差异最小。
首先,我们定义逻辑回归的模型:$$h_{\theta}(x) = \sigma(\theta^{T}x)$$其中,$h_{\theta}(x)$表示预测值,$\sigma(z)$表示sigmoid函数,$\theta$表示参数向量,$x$表示样本特征向量。
我们定义损失函数为交叉熵损失函数:$$J(\theta) = -\frac{1}{m}\sum_{i=1}^{m}[y^{(i)}\log(h_{\theta}(x^{(i)})) + (1-y^{(i)})\log(1-h_{\theta}(x^{(i)}))]$$其中,$y^{(i)}$表示第i个样本的真实标签,$x^{(i)}$表示第i个样本的特征向量。
我们的目标是最小化损失函数,即求解使得$J(\theta)$最小的$\theta$值。
梯度下降法的思想是通过迭代的方式不断调整参数$\theta$来逐步逼近最优解。
具体而言,梯度下降法根据损失函数关于参数$\theta$的梯度方向进行迭代更新:$$\theta := \theta - \alpha\frac{\partial J(\theta)}{\partial \theta}$$其中,$\alpha$表示学习率,控制每次迭代更新的步长。
$\frac{\partial J(\theta)}{\partial \theta}$表示损失函数关于$\theta$的梯度。
在逻辑回归中,我们可以通过计算偏导数得到梯度的表达式。
梯度下降法推导逻辑回归摘要:1.梯度下降法简介2.逻辑回归介绍3.梯度下降法在逻辑回归中的应用4.梯度下降法推导逻辑回归的步骤5.结论正文:梯度下降法是一种常用的数值优化算法,它通过计算函数的梯度来不断更新参数,从而使损失函数值最小化。
在机器学习中,梯度下降法被广泛应用于参数优化,以提高模型性能。
逻辑回归是一种用于分类问题的线性模型,其基本思想是通过计算输入特征与输出标签之间的线性关系来进行分类。
逻辑回归模型的损失函数通常使用二元交叉熵损失。
梯度下降法在逻辑回归中的应用主要体现在参数优化过程。
通过计算损失函数对参数的偏导数,我们可以得到参数更新的方向和步长。
在每次迭代过程中,梯度下降法会根据计算出的梯度更新参数,从而使损失函数值逐渐减小。
下面我们来推导梯度下降法在逻辑回归中的应用。
假设我们的输入数据集为X,输出标签为Y,模型参数为θ。
逻辑回归的目标是最小化损失函数L(θ),即:L(θ) = -1/n * Σ [Y * log(hθ(X))]其中,hθ(X)表示逻辑回归模型在输入X和参数θ下的输出概率。
为了使用梯度下降法优化参数θ,我们需要计算损失函数对参数的偏导数。
根据链式法则,我们可以得到:dL/dθ = 1/n * Σ [Y * d(log(hθ(X)))/dθ]为了计算d(log(hθ(X)))/dθ,我们需要利用链式法则和对数函数的性质。
首先,我们可以将log(hθ(X))写成log(h(θ)) + log(h(X))的形式,其中h(θ)表示逻辑回归模型的输出概率与参数θ无关的部分,h(X)表示输入特征X与参数θ无关的部分。
然后,我们可以得到:d(log(hθ(X)))/dθ = d(log(h(θ)))/dθ + d(log(h(X)))/dθ其中,d(log(h(θ)))/dθ等于h(θ)的导数,即h(θ)关于θ的偏导数。
对于h(X),由于它与θ无关,所以d(log(h(X)))/dθ等于0。
Logistic RegressionThe data我们将建立一个逻辑回归模型来预测一个学生是否被大学录取。
假设你是一个大学系的管理员,你想根据两次考试的结果来决定每个申请人的录取机会。
你有以前的申请人的历史数据,你可以用它作为逻辑回归的训练集。
对于每一个培训例子,你有两个考试的申请人的分数和录取决定。
为了做到这一点,我们将建立一个分类模型,根据考试成绩估计入学概率。
#三大件import numpy as npimport pandas as pdimport matplotlib.pyplot as plt%matplotlib inlineimport os#path = 'data' + os.sep + 'LogiReg_data.txt'pdData = pd.read_csv("F:\\研究课程\\机器学习\\宇迪系列\\python数据分析与机器学习实战-全-E\\唐宇迪-机器学习课程资料\\机器学习算法配套案例实战\梯度下降\\data\\LogiReg_data.txt", header=None, names=['Exam 1', 'Exam 2', 'Admitted'])pdData.head()pdData.shapepositive = pdData[pdData['Admitted'] == 1] # returns the subset of rows such Admitted = 1, i.e. the set of *positive* examplesnegative = pdData[pdData['Admitted'] == 0] # returns the subset of rows such Admitted = 0, i.e. the set of *negative* examplesfig, ax = plt.subplots(figsize=(10,5))ax.scatter(positive['Exam 1'], positive['Exam 2'], s=30, c='b', marker='o', label='Admitted')ax.scatter(negative['Exam 1'], negative['Exam 2'], s=30, c='r', marker='x', label='Not Admitted') ax.legend()ax.set_xlabel('Exam 1 Score')ax.set_ylabel('Exam 2 Score')def sigmoid(z):return 1 / (1 + np.exp(-z))nums = np.arange(-10, 10, step=1) #creates a vector containing 20 equally spaced values from -10 to 10fig, ax = plt.subplots(figsize=(12,4))ax.plot(nums, sigmoid(nums), 'r')def model(X, theta):return sigmoid(np.dot(X, theta.T))pdData.insert(0, 'Ones', 1) # in a try / except structure so as not to return an error if the block si executed several times# set X (training data) and y (target variable)orig_data = pdData.as_matrix() # convert the Pandas representation of the data to an array useful for further computationscols = orig_data.shape[1]X = orig_data[:,0:cols-1]y = orig_data[:,cols-1:cols]# convert to numpy arrays and initalize the parameter array theta#X = np.matrix(X.values)#y = np.matrix(data.iloc[:,3:4].values) #np.array(y.values)theta = np.zeros([1, 3])X[:5]y[:5]def cost(X, y, theta):left = np.multiply(-y, np.log(model(X, theta)))right = np.multiply(1 - y, np.log(1 - model(X, theta)))return np.sum(left - right) / (len(X))cost(X, y, theta)def gradient(X, y, theta):grad = np.zeros(theta.shape)error = (model(X, theta)- y).ravel()for j in range(len(theta.ravel())): #for each parmeterterm = np.multiply(error, X[:,j])grad[0, j] = np.sum(term) / len(X)return gradGradient descent比较3中不同梯度下降方法STOP_ITER = 0STOP_COST = 1STOP_GRAD = 2def stopCriterion(type, value, threshold):#设定三种不同的停止策略if type == STOP_ITER: return value > thresholdelif type == STOP_COST: return abs(value[-1]-value[-2]) < threshold elif type == STOP_GRAD: return np.linalg.norm(value) < threshold import numpy.random#洗牌def shuffleData(data):np.random.shuffle(data)cols = data.shape[1]X = data[:, 0:cols-1]y = data[:, cols-1:]return X, yimport timedef descent(data, theta, batchSize, stopType, thresh, alpha):#梯度下降求解init_time = time.time()i = 0 # 迭代次数k = 0 # batchX, y = shuffleData(data)grad = np.zeros(theta.shape) # 计算的梯度costs = [cost(X, y, theta)] # 损失值while True:grad = gradient(X[k:k+batchSize], y[k:k+batchSize], theta)k += batchSize #取batch数量个数据if k >= n:k = 0X, y = shuffleData(data) #重新洗牌theta = theta - alpha*grad # 参数更新costs.append(cost(X, y, theta)) # 计算新的损失i += 1if stopType == STOP_ITER: value = ielif stopType == STOP_COST: value = costselif stopType == STOP_GRAD: value = gradif stopCriterion(stopType, value, thresh): breakreturn theta, i-1, costs, grad, time.time() - init_timedef runExpe(data, theta, batchSize, stopType, thresh, alpha):#import pdb; pdb.set_trace();theta, iter, costs, grad, dur = descent(data, theta, batchSize, stopType, thresh, alpha)name = "Original" if (data[:,1]>2).sum() > 1 else "Scaled"name += " data - learning rate: {} - ".format(alpha)if batchSize==n: strDescType = "Gradient"elif batchSize==1: strDescType = "Stochastic"else: strDescType = "Mini-batch ({})".format(batchSize)name += strDescType + " descent - Stop: "if stopType == STOP_ITER: strStop = "{} iterations".format(thresh)elif stopType == STOP_COST: strStop = "costs change < {}".format(thresh)else: strStop = "gradient norm < {}".format(thresh)name += strStopprint ("***{}\nTheta: {} - Iter: {} - Last cost: {:03.2f} - Duration: {:03.2f}s".format( name, theta, iter, costs[-1], dur))fig, ax = plt.subplots(figsize=(12,4))ax.plot(np.arange(len(costs)), costs, 'r')ax.set_xlabel('Iterations')ax.set_ylabel('Cost')ax.set_title(name.upper() + ' - Error vs. Iteration')return theta不同的停止策略设定迭代次数#选择的梯度下降方法是基于所有样本的n=100runExpe(orig_data, theta, n, STOP_ITER, thresh=5000, alpha=0.000001)根据损失值停止设定阈值1E-6, 差不多需要110 000次迭代runExpe(orig_data, theta, n, STOP_COST, thresh=0.000001, alpha=0.001)根据梯度变化停止设定阈值0.05,差不多需要40 000次迭代runExpe(orig_data, theta, n, STOP_GRAD, thresh=0.05, alpha=0.001)Mini-batch descentrunExpe(orig_data, theta, 16, STOP_ITER, thresh=15000, alpha=0.001)浮动仍然比较大,我们来尝试下对数据进行标准化将数据按其属性(按列进行)减去其均值,然后除以其方差。