当前位置: 首页 > 科技观察

HowToSolveLogisticRegressionProblemswithNewton'sMethod

时间:2023-03-12 01:59:30 科技观察

本文介绍了牛顿法以及如何用它来解决逻辑回归问题。逻辑回归在伯努利分布中引入了对数似然的概念,并涉及称为S型函数的简单变换。本文还介绍了Hessian矩阵(它是二阶偏微分的方阵),并展示了如何结合Hessian矩阵和梯度来实现牛顿法。与最初介绍线性回归和梯度的文章类似,为了理解我们的数学思想如何转化为二元分类问题解决方案的实现,我们也将使用Python语言以直观、数学的方式探索牛顿法:如何解决逻辑回归问题。读者先验知识:微分和链式法则(微积分)偏微分和梯度(多元微积分)基本向量运算(线性代数)基本了解NumPy基本了解独立概率数据我们的数据集来自南波士顿,包括价格每个家庭和一个布尔值,指示家庭是否有两个浴室。x是房产价格的向量,y是房产是否有两个卫生间的向量。蓝色圆点代表两间以上卫生间的房产,橙色圆点代表两间及以下卫生间的房产,横坐标为房价。模型我们将学习一个逻辑回归模型,该模型将作为二元分类器来预测具有给定价格(以美元计)的房产是否有两个或更多浴室。我们仍然需要求解一个权值和特征的线性组合,但是我们需要在[0,1]之间组合一个平滑函数来对这个线性组合进行变换(因为我们需要将线性组合与二进制输出0或1进行映射.)logistic函数,也称为sigmoid函数,可以做所有这些事情,函数表达式如下:注:为了使函数更加灵活,我们在指数项中加入了θ2作为截距;我们只有一维数据,即house_value,但我们想求解一个二维模型。在线性回归问题中我们定义我们的平方和目标函数,类似于这种方法,我们要使用假设函数h(x),并定义似然函数(likelihoodfunction)来最大化目标函数,拟合我们的参数。以下是相关内容的数学分析:数学:定义似然函数首先,我们需要定义一个概率质量函数(ProbabilityMassFunction):注:在第一个公式中,左边代表增益和损失:在在给定参数θ和特征向量x的情况下,结果为1的概率,我们的假设函数h_θ(x)来计算这个概率。这两个表达式可以合并为一个,如下所示:下表显示了如何通过生成较小的值来惩罚使用假设函数的不正确结果(例如,h(x)=.25,y=1h(x)=.25,y=1)。它还有助于理解我们如何将两个表达式合二为一。自然地,我们希望最大化上面正确预测的值,这恰好是我们的似然函数。我喜欢将似然函数描述为“我们的模型在给定y值的相应特征向量x^的情况下正确预测结果的可能性”。但是,区分概率和可能性很重要。现在我们将似然函数扩展到训练集中的所有数据。我们将每个单独的可能性相乘,得到我们的模型准确预测训练数据上y值的可能性的乘积。如下图:可以看到我们乘以了n个似然值(每个似然值都小于1.0),其中n是训练样本的个数,我们最终结果的数量级是10^(-n)。这是一个糟糕的点!由于数字太小,Python会将极小的浮点数视为0。我们的解决方案是对似然函数取对数,如下所示:注意:log(x*y)=log(x)+log(y);日志(x^n)=n*日志(x)。这是我们假设函数的对数似然。请记住,我们的假设函数通过生成较小的值来惩罚错误的预测,因此我们希望最大化对数似然函数。对数似然函数的曲线如下图所示:注意:通过对函数取对数,我们得到对数似然值(log-likelihood),我们保证我们的目标函数是严格凸的(这是附加条件),这意味着它具有全局最大值。数学:单变量的牛顿法在我们最大化对数似然函数之前,我们需要介绍一下牛顿法。牛顿法是一种迭代求解方程的方法;它是用于求多项式函数根的方法。在简单的单变量情况下,牛顿法可以通过以下步骤实现;求函数f(x)在点(xn,yn)处的切线:求点x_n+1的切线,在x轴的截距:求y值在x处的截距如果yn+1?yn≈0:返回yn+1,因为我们的结果收敛了!否则,更新点(xn,yn)并继续迭代:下面的gif帮助我们可视化方法:如果你能更详细地理解上面的算法,你会看到这归结为:学校数学考试可以理解以上内容。但是我们如何将其推广到多元“n维”情况呢?数学:N维问题中的牛顿法说到n维情况,我们用称为梯度的偏微分向量代替单变量微分。如果你觉得这个概念很模糊,请复习梯度知识。所以在多元形式下,我们的更新规则变成了参数x^减去f(x^)的向量,如下:注:f(xn)f'(xn)中的f'(xn)变成了?f(x^n)^(?1),因为我们将标量f(xn)推广到多变量情况,将其转化为梯度的倒数?f(x^n)^(?1)。数学:使用牛顿法最大化对数似然函数我们想要最大化假设函数hθ(x)的对数似然值?(θ)。为了最大化我们的函数,我们找到函数f?(θ)的偏微分,将其设为0,然后从中求出θ1和θ2以获得微分的临界点。这个临界点是对数似然函数的最大值点。注意:因为对数似然函数是严格凸的,所以我们会有一个全局最大值。这意味着我们只有一个临界点,所以通过上述方法得到的解就是我们唯一的解。这听起来应该很熟悉。我们寻找θ1和θ2使得偏微分为0。我们找到了梯度向量的根。我们可以用牛顿法来做到这一点!回想一下牛顿法的更新步骤:我们可以用梯度替换f(x^n),所以我们得到:那么“?”是什么意思?以上是指?直觉告诉我们,我们需要微分梯度向量,就像我们之前对f(x^n)所做的那样。开始进入海森矩阵(TheHessian)。数学:Hessian矩阵可以从多元微分的初步知识中知道。我们应该知道求解一个函数的“二阶”导数。然后,我们为每个参数赋予每个一阶偏导数一个偏导数。如果我们有n个参数,那么我们将有n^2个二阶偏导数。结果,Hessian矩阵是一个n*n的二阶偏导方阵。在我们的例子中,有两个参数(θ1,θ2),所以我们的Hessian矩阵是这样的形式::我们采用了Hessian矩阵的逆矩阵,而不是它的逆矩阵,因为它是一个矩阵。为简单起见,本文省略了推导梯度和Hessian矩阵的实际过程。想了解后续的推导过程,可以参考以下资源:1.DerivationoftheGradientofourLog-Likelihood(我们对数似然梯度的推导),吴恩达课程笔记第17-18页2.Hessian矩阵的解决方案实际上非常简单。如果你计算过梯度,你会在吴恩达的课件笔记中“Derivingg'(z)forthesigmoidfunction”部分看到。?(θ)的梯度为:?(θ)的Hessian矩阵为:其中:实现牛顿法我们首先定义假设函数,即sigmoid函数:defsigmoid(x,Θ_1,Θ_2):z=(Θ_1*x+Θ_2).astype("float_")返回1.0/(1.0+np.exp(-z))然后定义我们的对数似然函数?(θ):deflog_likelihood(x,y,Θ_1,Θ_2):sigmoidsigmoid_probs=sigmoid(x,Θ_1,Θ_2)returnnp.sum(y*np.log(sigmoid_probs)+(1-y)*np.log(1-sigmoid_probs)最后实现log-likelihood的梯度求解函数和Hessian矩阵解:defgradient(x,y,Θ_1,Θ_2):sigmoidsigmoid_probs=sigmoid(x,Θ_1,Θ_2)returnnp.array([[np.sum((y-sigmoid_probs)*x),np.sum((y-sigmoid_probs)*1)]])defhessian(x,y,Θ_1,Θ_2):sigmoidsigmoid_probs=sigmoid(x,Θ_1,Θ_2)d1=np.sum((sigmoid_probs*(1-sigmoid_probs))*x*x)d2=np.sum((sigmoid_probs*(1-sigmoid_probs))*x*1)d3=np.sum((sigmoid_probs*(1-sigmoid_probs))*1*1)H=np.array([[d1,d2],[d2,d3]])returnH经过以上4个数学过程,我们创建我们的外部while循环使用牛顿法,直到结果收敛于最大值。defnewtons_method(x,y):""":paramx(np.array(float)):VectorofBostonHouseValuesindollars:paramy(np.array(boolean)):VectorofBoolsindictingifhousehas>2bedrooms::returns:np.arrayoflogreg'sparametersafterconvergence,[Θ_1,Θ_2]"""#Initializelog_likelihood¶metersΘ_1=15.1Θ_2=-.4#TheintercepttermΔl=np.Infinityl=log_likelihood(x,y,Θ_1,Θ_2)#ConvergenceConditionsδ=.0000000001max_iterations=15i=0whileabs(Δl)>δandi