数学专业论文 逻辑回归初步.doc

上传人:文库蛋蛋多 文档编号:3424798 上传时间:2023-03-13 格式:DOC 页数:17 大小:2.53MB
返回 下载 相关 举报
数学专业论文 逻辑回归初步.doc_第1页
第1页 / 共17页
数学专业论文 逻辑回归初步.doc_第2页
第2页 / 共17页
数学专业论文 逻辑回归初步.doc_第3页
第3页 / 共17页
数学专业论文 逻辑回归初步.doc_第4页
第4页 / 共17页
数学专业论文 逻辑回归初步.doc_第5页
第5页 / 共17页
点击查看更多>>
资源描述

《数学专业论文 逻辑回归初步.doc》由会员分享,可在线阅读,更多相关《数学专业论文 逻辑回归初步.doc(17页珍藏版)》请在三一办公上搜索。

1、数学专业论文 逻辑回归初步1、总述逻辑回归是应用非常广泛的一个分类机器学习算法,它将数据拟合到一个logit函数(或者叫做logistic函数)中,从而能够完成对事件发生的概率进行预测。2、由来要说逻辑回归,我们得追溯到线性回归,想必大家对线性回归都有一定的了解,即对于多维空间中存在的样本点,我们用特征的线性组合去拟合空间中点的分布和轨迹。如下图所示:线性回归能对连续值结果进行预测,而现实生活中常见的另外一类问题是,分类问题。最简单的情况是是与否的二分类问题。比如说医生需要判断病人是否生病,银行要判断一个人的信用程度是否达到可以给他发信用卡的程度,邮件收件箱要自动对邮件分类为正常邮件和垃圾邮件

2、等等。当然,我们最直接的想法是,既然能够用线性回归预测出连续值结果,那根据结果设定一个阈值是不是就可以解决这个问题了呢?事实是,对于很标准的情况,确实可以的,这里我们套用Andrew Ng老师的课件中的例子,下图中X为数据点肿瘤的大小,Y为观测结果是否是恶性肿瘤。通过构建线性回归模型,如h(x)所示,构建线性回归模型后,我们设定一个阈值0.5,预测h(x)0.5的这些点为恶性肿瘤,而h(x)0.5为良性肿瘤。但很多实际的情况下,我们需要学习的分类数据并没有这么精准,比如说上述例子中突然有一个不按套路出牌的数据点出现,如下图所示:你看,现在你再设定0.5,这个判定阈值就失效了,而现实生活的分类问

3、题的数据,会比例子中这个更为复杂,而这个时候我们借助于线性回归+阈值的方式,已经很难完成一个鲁棒性很好的分类器了。在这样的场景下,逻辑回归就诞生了。它的核心思想是,如果线性回归的结果输出是一个连续值,而值的范围是无法限定的,那我们有没有办法把这个结果值映射为可以帮助我们判断的结果呢。而如果输出结果是 (0,1) 的一个概率值,这个问题就很清楚了。我们在数学上找了一圈,还真就找着这样一个简单的函数了,就是很神奇的sigmoid函数(如下):如果把sigmoid函数图像画出来,是如下的样子:Sigmoid Logistic Function从函数图上可以看出,函数y=g(z)在z=0的时候取值为1

4、/2,而随着z逐渐变小,函数值趋于0,z逐渐变大的同时函数值逐渐趋于1,而这正是一个概率的范围。所以我们定义线性回归的预测函数为Y=WTX,那么逻辑回归的输出Y=g(WTX),其中y=g(z)函数正是上述sigmoid函数(或者简单叫做S形函数)。3、判定边界我们现在再来看看,为什么逻辑回归能够解决分类问题。这里引入一个概念,叫做判定边界,可以理解为是用以对不同类别的数据分割的边界,边界的两旁应该是不同类别的数据。从二维直角坐标系中,举几个例子,大概是如下这个样子:有时候是这个样子:甚至可能是这个样子:上述三幅图中的红绿样本点为不同类别的样本,而我们划出的线,不管是直线、圆或者是曲线,都能比较

5、好地将图中的两类样本分割开来。这就是我们的判定边界,下面我们来看看,逻辑回归是如何根据样本点获得这些判定边界的。我们依旧借用Andrew Ng教授的课程中部分例子来讲述这个问题。回到sigmoid函数,我们发现: 当g(z)0.5时,z0;对于h(x)=g(TX)0.5, 则TX0, 此时意味着预估y=1;反之,当预测y = 0时,TX,这很好地惩罚了最后的结果。 而对于y=0的情况,如下图所示,也同样合理: 下面我们说说梯度下降,梯度下降算法是调整参数使得代价函数J()取得最小值的最基本方法之一。从直观上理解,就是我们在碗状结构的凸函数上取一个初始值,然后挪动这个值一步步靠近最低点的过程,如

6、下图所示: 我们先简化一下逻辑回归的代价函数: 从数学上理解,我们为了找到最小值点,就应该朝着下降速度最快的方向(导函数/偏导方向)迈进,每次迈进一小步,再看看此时的下降最快方向是哪,再朝着这个方向迈进,直至最低点。 用迭代公式表示出来的最小化J()的梯度下降算法如下:5、代码与实现 我们来一起看两个具体数据上做逻辑回归分类的例子,其中一份数据为线性判定边界,另一份为非线性。示例1。第一份数据为data1.txt,部分内容如下:我们先来看看数据在空间的分布,代码如下。pythonview plaincopy1. fromnumpyimportloadtxt,where2. frompylabi

7、mportscatter,show,legend,xlabel,ylabel3. 4. #loadthedataset5. data=loadtxt(/home/HanXiaoyang/data/data1.txt,delimiter=,)6. 7. X=data:,0:28. y=data:,29. 10. pos=where(y=1)11. neg=where(y=0)12. scatter(Xpos,0,Xpos,1,marker=o,c=b)13. scatter(Xneg,0,Xneg,1,marker=x,c=r)14. xlabel(Feature1/Exam1score)15.

8、 ylabel(Feature2/Exam2score)16. legend(Fail,Pass)17. show()得到的结果如下:下面我们写好计算sigmoid函数、代价函数、和梯度下降的程序:pythonview plaincopy1. defsigmoid(X):2. Computesigmoidfunction3. den=1.0+e*(-1.0*X)4. gz=1.0/den5. returngz6. defcompute_cost(theta,X,y):7. computescostgivenpredictedandactualvalues8. m=X.shape0#number

9、oftrainingexamples9. theta=reshape(theta,(len(theta),1)10. 11. J=(1./m)*(-transpose(y).dot(log(sigmoid(X.dot(theta)-transpose(1-y).dot(log(1-sigmoid(X.dot(theta)12. 13. grad=transpose(1./m)*transpose(sigmoid(X.dot(theta)-y).dot(X)14. #optimize.fminexpectsasinglevalue,socannotreturngrad15. returnJ00#

10、,grad16. defcompute_grad(theta,X,y):17. computegradient18. theta.shape=(1,3)19. grad=zeros(3)20. h=sigmoid(X.dot(theta.T)21. delta=h-y22. l=grad.size23. foriinrange(l):24. sumdelta=delta.T.dot(X:,i)25. gradi=(1.0/m)*sumdelta*-126. theta.shape=(3,)27. returngrad我们用梯度下降算法得到的结果判定边界是如下的样子:最后我们使用我们的判定边界对

11、training data做一个预测,然后比对一下准确率:pythonview plaincopy1. defpredict(theta,X):2. Predictlabelusinglearnedlogisticregressionparameters3. m,n=X.shape4. p=zeros(shape=(m,1)5. h=sigmoid(X.dot(theta.T)6. foritinrange(0,h.shape0):7. ifhit0.5:8. pit,0=19. else:10. pit,0=011. returnp12. #Computeaccuracyonourtrain

12、ingset13. p=predict(array(theta),it)14. printTrainAccuracy:%f%(ywhere(p=y).size/float(y.size)*100.0)计算出来的结果是89.2%示例2.第二份数据为data2.txt,部分内容如下:我们同样把数据的分布画出来,如下:我们发现在这个例子中,我们没有办法再用一条直线把两类样本点近似分开了,所以我们打算试试多项式的判定边界,那么我们先要对给定的两个feature做一个多项式特征的映射。比如说,我们做了如下的一个映射:代码如下:pythonview plaincopy1. defmap_feature(x

13、1,x2):2. 3. Mapsthetwoinputfeaturestopolonomialfeatures.4. Returnsanewfeaturearraywithmorefeaturesof5. X1,X2,X1*2,X2*2,X1*X2,X1*X2*2,etc.6. 7. x1.shape=(x1.size,1)8. x2.shape=(x2.size,1)9. degree=610. mapped_fea=ones(shape=(x1:,0.size,1)11. m,n=mapped_fea.shape12. foriinrange(1,degree+1):13. forjinr

14、ange(i+1):14. r=(x1*(i-j)*(x2*j)15. mapped_fea=append(out,r,axis=1)16. returnmapped_fea17. mapped_fea=map_feature(X:,0,X:,1) 接着做梯度下降:pythonview plaincopy1. defcost_function_reg(theta,X,y,l):2. Computethecostandpartialderivativesasgrads3. 4. h=sigmoid(X.dot(theta)5. thetaR=theta1:,06. J=(1.0/m)*(-y.T

15、.dot(log(h)-(1-y.T).dot(log(1.0-h)7. +(l/(2.0*m)*(thetaR.T.dot(thetaR)8. delta=h-y9. sum_delta=delta.T.dot(X:,1)10. grad1=(1.0/m)*sumdelta11. XR=X:,1:X.shape112. sum_delta=delta.T.dot(XR)13. grad=(1.0/m)*(sum_delta+l*thetaR)14. out=zeros(shape=(grad.shape0,grad.shape1+1)15. out:,0=grad116. out:,1:=g

16、rad17. returnJ.flatten(),out.T.flatten()18. m,n=X.shape19. y.shape=(m,1)20. it=map_feature(X:,0,X:,1)21. #Initializethetaparameters22. initial_theta=zeros(shape=(it.shape1,1)23. #Useregularizationandsetparameterlambdato124. l=125. #Computeanddisplayinitialcostandgradientforregularizedlogistic26. #re

17、gression27. cost,grad=cost_function_reg(initial_theta,it,y,l)28. defdecorated_cost(theta):29. returncost_function_reg(theta,it,y,l)30. printfmin_bfgs(decorated_cost,initial_theta,maxfun=500) 接着在数据点上画出判定边界:pythonview plaincopy1. #PlotBoundary2. u=linspace(-1,1.5,50)3. v=linspace(-1,1.5,50)4. z=zeros(

18、shape=(len(u),len(v)5. foriinrange(len(u):6. forjinrange(len(v):7. zi,j=(map_feature(array(ui),array(vj).dot(array(theta)8. z=z.T9. contour(u,v,z)10. title(lambda=%f%l)11. xlabel(MicrochipTest1)12. ylabel(MicrochipTest2)13. legend(y=1,y=0,Decisionboundary)14. show()15. defpredict(theta,X):16. Predic

19、twhetherthelabel17. is0or1usinglearnedlogistic18. regressionparameters19. m,n=X.shape20. p=zeros(shape=(m,1)21. h=sigmoid(X.dot(theta.T)22. foritinrange(0,h.shape0):23. ifhit0.5:24. pit,0=125. else:26. pit,0=027. returnp28. #%Computeaccuracyonourtrainingset29. p=predict(array(theta),it)30. printTrai

20、nAccuracy:%f%(ywhere(p=y).size/float(y.size)*100.0) 得到的结果如下图所示: 我们发现我们得到的这条曲线确实将两类点区分开来了。6、总结 最后我们总结一下逻辑回归。它始于输出结果为有实际意义的连续值的线性回归,但是线性回归对于分类的问题没有办法准确而又具备鲁棒性地分割,因此我们设计出了逻辑回归这样一个算法,它的输出结果表征了某个样本属于某类别的概率。 逻辑回归的成功之处在于,将原本输出结果范围可以非常大的TX通过sigmoid函数映射到(0,1),从而完成概率的估测。 而直观地在二维空间理解逻辑回归,是sigmoid函数的特性,使得判定的阈值能够映射为平面的一条判定边界,当然随着特征的复杂化,判定边界可能是多种多样的样貌,但是它能够较好地把两类样本点分隔开,解决分类问题。 求解逻辑回归参数的传统方法是梯度下降,构造为凸函数的代价函数后,每次沿着偏导方向(下降速度最快方向)迈进一小部分,直至N次迭代后到达最低点。

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 教育教学 > 成人教育


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号