【cs229-Lecture3】Logistic回归

参考:

http://www.itongji.cn/article/12112cH013.html

http://blog.csdn.net/zouxy09/article/details/20319673

https://class.coursera.org/ml-006/lecture/58(一定要看!)

 

 

 

 


 

简要认识一下Logistic函数(sigmoid曲线):(from wiki)

Logistic函数Logistic曲线是一种常见的S形函数,它是皮埃尔·弗朗索瓦·韦吕勒在1844或1845年在研究它与人口增长的关系时命名的。广义Logistic曲线可以模仿一些情况人口增长(P)的S形曲线。起初阶段大致是指数增长;然后随着开始变得饱和,增加变慢;最后,达到成熟时增加停止。

一个简单的Logistic函数可用下式表示:P(t) = \frac{1}{1 + e^{-t}}

 

image_thumb[1]

                                        标准LogisticS形函数

百度上比较好的Logistic模型的解释:

 logistic回归又称logistic回归分析,主要在流行病学中应用较多,比较常用的情形是探索某疾病的危险因素,根据危险因素预测某疾病发生的概率,等等。例如,想探讨胃癌发生的危险因素,可以选择两组人群,一组是胃癌组,一组是非胃癌组,两组人群肯定有不同的体征和生活方式等。这里的因变量就是是否胃癌,即“是”或“否”,为两分类变量,自变量就可以包括很多了,例如年龄、性别、饮食习惯、幽门螺杆菌感染等。自变量既可以是连续的,也可以是分类的。通过logistic回归分析,就可以大致了解到底哪些因素是胃癌的危险因素。
  logistic回归与多重线性回归实际上有很多相同之处,最大的区别就在于他们的因变量不同,其他的基本都差不多,正是因为如此,这两种回归可以归于同一个家族,即广义线性模型(generalized linear model)。这一家族中的模型形式基本上都差不多,不同的就是因变量不同,如果是连续的,就是多重线性回归,如果是二项分布,就是logistic回归,如果是poisson分布,就是poisson回归,如果是负二项分布,就是负二项回归,等等。只要注意区分它们的因变量就可以了。
  

logistic回归的因变量可以是二分类的,也可以是多分类的,但是二分类的更为常用,也更加容易解释。所以实际中最为常用的就是二分类的logistic回归。

  

logistic回归的主要用途:一是寻找危险因素,正如上面所说的寻找某一疾病的危险因素等。二是预测,如果已经建立了logistic回归模型,则可以根据模型,预测在不同的自变量情况下,发生某病或某种情况的概率有多大。三是判别,实际上跟预测有些类似,也是根据logistic模型,判断某人属于某病或属于某种情况的概率有多大,也就是看一下这个人有多大的可能性是属于某病。

  这是logistic回归最常用的三个用途,实际中的logistic回归用途是极为广泛的,logistic回归几乎已经成了流行病学和医学中最常用的分析方法,因为它与多重线性回归相比有很多的优势。

 

推导过程如下:

IMG_0605IMG_0606

IMG_0607

 

 

 

 

 

 

最后,附上一个实际问题:(from http://www.medsci.cn/shownews.asp?id=2315

问:Logistic回归模型为什么要先做单因素,然后做多因素?

问: Logistic回归模型为什么要先做单因素,然后做多因素
有的文献上是直接做卡方检验有意义的再进入回归模型,但是有的是Logistic 单因素分析,然后在进行多因素分析,不知道这个操作过程在SPSS中如何实现? 还有这两种方法的区别是什么?

答:logistic回归在分析时是否必须按照“单因素—多因素”的分析过程,是否必须先进行单因素分析,然后才能进行多因素分析?单因素分析是否必须的?
这一问题是一个很实际的,许多人在分析时总是不知道如何下手?以下阐述一下我个人的意见,不一定正确,纯属个人心得。
理论上讲,在样本足够大的情况下,最好把所有的因素都放到方程中,以矫正所有可能的混杂因素,但这是有条件的,即必须所有的这些因素之间无相关,且样本足够大。而实际中,因素之间不可能是毫无相关的。当然,这种相关程度也不一样。如果所有的因素之间相关程度都非常低,最好是没有相关,那这时我可以把所有的变量都放在方程中同时进行分析,可以不做单因素分析。
如果你的例数不够多,比如,你有100例,但是有20个因素,那这时你如果把所有因素放在方程中,结果肯定要出问题。这种情况下,最好先进行单因素分析,筛选出一部分变量,将有意义的变量放入方程进行多因素分析。当然,单因素分析时最好将p值放宽一些,比如0.1或0.15等。避免漏掉一些重要因素。
真正进行多因素分析时,是很复杂的,需要仔细验证各个因素之间的关系,一旦发现因素之间有关系,需要仔细分析。如果某一因素放入方程中后,前面的几个变量变化比较大,那就需要小心了。仔细探讨因素之间存在何种关系。
总之,如果样本不多而变量较多,可以先进行单因素分析,筛掉一些可能无意义的变量,然后进行多因素分析,这样可以保证结果更加可靠些。即使样本足够大,也不建议直接把所有的变量放入方程直接分析,一定要先弄清楚各个变量之间的相互关系,弄清楚自变量进入方程的形式,这样才能有效的进行分析。
不论任何情况,分析时必须具体问题具体分析,不能一概而论,更不能套用。即使目的相同、变量相同的数据,也不一定分析结果会一样,因为总会有抽样误差存在的,设计的好坏是不一样的。所以千万不要看一篇类似的文章,然后照搬上面的分析步骤和分析方法,这是不可取的。

 

 

 

 

算法实现:

数据:

 

  1 -0.017612    14.053064    0
  2 -1.395634    4.662541    1
  3 -0.752157    6.538620    0
  4 -1.322371    7.152853    0
  5 0.423363    11.054677    0
  6 0.406704    7.067335    1
  7 0.667394    12.741452    0
  8 -2.460150    6.866805    1
  9 0.569411    9.548755    0
 10 -0.026632    10.427743    0
 11 0.850433    6.920334    1
 12 1.347183    13.175500    0
 13 1.176813    3.167020    1
 14 -1.781871    9.097953    0
 15 -0.566606    5.749003    1
 16 0.931635    1.589505    1
 17 -0.024205    6.151823    1
 18 -0.036453    2.690988    1
 19 -0.196949    0.444165    1
 20 1.014459    5.754399    1
 21 1.985298    3.230619    1
 22 -1.693453    -0.557540    1
 23 -0.576525    11.778922    0
 24 -0.346811    -1.678730    1
 25 -2.124484    2.672471    1
 26 1.217916    9.597015    0
 27 -0.733928    9.098687    0
 28 -3.642001    -1.618087    1
 29 0.315985    3.523953    1
 30 1.416614    9.619232    0
 31 -0.386323    3.989286    1
 32 0.556921    8.294984    1
 33 1.224863    11.587360    0
 34 -1.347803    -2.406051    1
 35 1.196604    4.951851    1
 36 0.275221    9.543647    0
 37 0.470575    9.332488    0
 38 -1.889567    9.542662    0
 39 -1.527893    12.150579    0
 40 -1.185247    11.309318    0
 41 -0.445678    3.297303    1
 42 1.042222    6.105155    1
 43 -0.618787    10.320986    0
 44 1.152083    0.548467    1
 45 0.828534    2.676045    1
 46 -1.237728    10.549033    0
 47 -0.683565    -2.166125    1
 48 0.229456    5.921938    1
 49 -0.959885    11.555336    0
 50 0.492911    10.993324    0
 51 0.184992    8.721488    0
 52 -0.355715    10.325976    0
 53 -0.397822    8.058397    0
 54 0.824839    13.730343    0
 55 1.507278    5.027866    1
 56 0.099671    6.835839    1
 57 -0.344008    10.717485    0
 58 1.785928    7.718645    1
 59 -0.918801    11.560217    0
 60 -0.364009    4.747300    1
 61 -0.841722    4.119083    1
 62 0.490426    1.960539    1
 63 -0.007194    9.075792    0
 64 0.356107    12.447863    0
 65 0.342578    12.281162    0
 66 -0.810823    -1.466018    1
 67 2.530777    6.476801    1
 68 1.296683    11.607559    0
 69 0.475487    12.040035    0
 70 -0.783277    11.009725    0
 71 0.074798    11.023650    0
 72 -1.337472    0.468339    1
 73 -0.102781    13.763651    0
 74 -0.147324    2.874846    1
 75 0.518389    9.887035    0
 76 1.015399    7.571882    0
 77 -1.658086    -0.027255    1
 78 1.319944    2.171228    1
 79 2.056216    5.019981    1
 80 -0.851633    4.375691    1
 81 -1.510047    6.061992    0
 82 -1.076637    -3.181888    1
 83 1.821096    10.283990    0
 84 3.010150    8.401766    1
 85 -1.099458    1.688274    1
 86 -0.834872    -1.733869    1
 87 -0.846637    3.849075    1
 88 1.400102    12.628781    0
 89 1.752842    5.468166    1
 90 0.078557    0.059736    1
 91 0.089392    -0.715300    1
 92 1.825662    12.693808    0
 93 0.197445    9.744638    0
 94 0.126117    0.922311    1
 95 -0.679797    1.220530    1
 96 0.677983    2.556666    1
 97 0.761349    10.693862    0
 98 -2.168791    0.143632    1
 99 1.388610    9.341997    0
100 0.317029    14.739025    0

 

用R语言可视化:

1 data <- read.table("D:\\MachineLearning\\Sample\\LogisticRegression\\data.txt",header=T)
2 attach(data)
3 plot(xpos,ypos,col=ifelse(factor(type)==0,"blue", "red"))

 

如图:

 

 

接下来,我们的目的就是找到一条直线,能够尽可能准确地把这两类点分隔开。

 

posted @ 2014-09-10 09:37  max_xbw  阅读(885)  评论(0编辑  收藏  举报