Logistic Regression Classifier逻辑回归

Logistic Regression Classifier逻辑回归主要思想就是用最大似然概率方法构建出方程,为最大化方程,利用牛顿梯度上升求解方程参数。

  • 优点:计算代价不高,易于理解和实现。
  • 缺点:容易欠拟合,分类精度可能不高。
  • 使用数据类型:数值型和标称型数据。

介绍逻辑回归之前,我们先看一问题,有个黑箱,里面有白球和黑球,如何判断它们的比例。

我们从里面抓3个球,2个黑球,1个白球。这时候,有人就直接得出了黑球67%,白球占比33%。这个时候,其实这个人使用了最大似然概率的思想,通俗来讲,当黑球是67%的占比的时候,我们抓3个球,出现2黑1白的概率最大。我们直接用公式来说明。

假设黑球占比为P,白球为1-P。于是我们要求解MAX(P*P*(1-P)),显而易见P=67%(求解方法:对方程求导,使导数为0的P值即为最优解)

我们看逻辑回归,解决的是二分类问题,是不是和上面黑球白球问题很像,是的,逻辑回归也是最大似然概率来求解。

假设我们有n个独立的训练样本{(x1, y1) ,(x2, y2),…, (xn, yn)},y={0, 1}。那每一个观察到的样本(xi, yi)出现的概率是: 
这里写图片描述 
上面为什么是这样呢?当y=1的时候,后面那一项是不是没有了,那就只剩下x属于1类的概率,当y=0的时候,第一项是不是没有了,那就只剩下后面那个x属于0的概率(1减去x属于1的概率)。所以不管y是0还是1,上面得到的数,都是(x, y)出现的概率。那我们的整个样本集,也就是n个独立的样本出现的似然函数为(因为每个样本都是独立的,所以n个样本出现的概率就是他们各自出现的概率相乘): 
这里写图片描述

这里我们稍微变换下L(θ):取自然对数,然后化简(不要看到一堆公式就害怕哦,很简单的哦,只需要耐心一点点,自己动手推推就知道了。注:有xi的时候,表示它是第i个样本,下面没有做区分了,相信你的眼睛是雪亮的),得到:

这里写图片描述 
其中第三步到第四步使用了下面替换。 
这里写图片描述 
这时候为求最大值,对L(θ)对θ求导,得到: 
这里写图片描述 
然后我们令该导数为0,即可求出最优解。但是这个方程是无法解析求解(这里就不证明了)。 
最后问题变成了,求解参数使方程L最大化,求解参数的方法梯度上升法(原理这里不解释了,看详细的代码的计算方式应该更容易理解些)。 
根据这个转换公式 
这里写图片描述 
我们代入参数和特征,求P,也就是发生1的概率。 
这里写图片描述 
上面这个也就是常提及的sigmoid函数,俗称激活函数,最后用于分类(若P(y=1|x;Θ )大于0.5,则判定为1)。

下面是详细的逻辑回归代码,代码比较简单,主要是要理解上面的算法思想。个人建议,可以结合代码看一步一步怎么算的,然后对比上面推导公式,可以让人更加容易理解,并加深印象。

from numpy import *
filename='...\\testSet.txt' #文件目录
def loadDataSet():   #读取数据(这里只有两个特征)dataMat = []labelMat = []fr = open(filename)for line in fr.readlines():lineArr = line.strip().split()dataMat.append([1.0, float(lineArr[0]), float(lineArr[1])])   #前面的1,表示方程的常量。比如两个特征X1,X2,共需要三个参数,W1+W2*X1+W3*X2labelMat.append(int(lineArr[2]))return dataMat,labelMatdef sigmoid(inX):  #sigmoid函数return 1.0/(1+exp(-inX))def gradAscent(dataMat, labelMat): #梯度上升求最优参数dataMatrix=mat(dataMat) #将读取的数据转换为矩阵classLabels=mat(labelMat).transpose() #将读取的数据转换为矩阵m,n = shape(dataMatrix)alpha = 0.001  #设置梯度的阀值,该值越大梯度上升幅度越大maxCycles = 500 #设置迭代的次数,一般看实际数据进行设定,有些可能200次就够了weights = ones((n,1)) #设置初始的参数,并都赋默认值为1。注意这里权重以矩阵形式表示三个参数。for k in range(maxCycles):h = sigmoid(dataMatrix*weights)error = (classLabels - h)     #求导后差值weights = weights + alpha * dataMatrix.transpose()* error #迭代更新权重return weightsdef stocGradAscent0(dataMat, labelMat):  #随机梯度上升,当数据量比较大时,每次迭代都选择全量数据进行计算,计算量会非常大。所以采用每次迭代中一次只选择其中的一行数据进行更新权重。dataMatrix=mat(dataMat)classLabels=labelMatm,n=shape(dataMatrix)alpha=0.01maxCycles = 500weights=ones((n,1))for k in range(maxCycles):for i in range(m): #遍历计算每一行h = sigmoid(sum(dataMatrix[i] * weights))error = classLabels[i] - hweights = weights + alpha * error * dataMatrix[i].transpose()return weightsdef stocGradAscent1(dataMat, labelMat): #改进版随机梯度上升,在每次迭代中随机选择样本来更新权重,并且随迭代次数增加,权重变化越小。dataMatrix=mat(dataMat)classLabels=labelMatm,n=shape(dataMatrix)weights=ones((n,1))maxCycles=500for j in range(maxCycles): #迭代dataIndex=[i for i in range(m)]for i in range(m): #随机遍历每一行alpha=4/(1+j+i)+0.0001  #随迭代次数增加,权重变化越小。randIndex=int(random.uniform(0,len(dataIndex)))  #随机抽样h=sigmoid(sum(dataMatrix[randIndex]*weights))error=classLabels[randIndex]-hweights=weights+alpha*error*dataMatrix[randIndex].transpose()del(dataIndex[randIndex]) #去除已经抽取的样本return weightsdef plotBestFit(weights):  #画出最终分类的图import matplotlib.pyplot as pltdataMat,labelMat=loadDataSet()dataArr = array(dataMat)n = shape(dataArr)[0]xcord1 = []; ycord1 = []xcord2 = []; ycord2 = []for i in range(n):if int(labelMat[i])== 1:xcord1.append(dataArr[i,1])ycord1.append(dataArr[i,2])else:xcord2.append(dataArr[i,1])ycord2.append(dataArr[i,2])fig = plt.figure()ax = fig.add_subplot(111)ax.scatter(xcord1, ycord1, s=30, c='red', marker='s')ax.scatter(xcord2, ycord2, s=30, c='green')x = arange(-3.0, 3.0, 0.1)y = (-weights[0]-weights[1]*x)/weights[2]ax.plot(x, y)plt.xlabel('X1')plt.ylabel('X2')plt.show()def main():dataMat, labelMat = loadDataSet()weights=gradAscent(dataMat, labelMat).getA()plotBestFit(weights)if __name__=='__main__':main()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90
  • 91

跑完代码结果: 
这里写图片描述
当然,还可以换随机梯度上升和改进的随机梯度上升算法试试,效果都还不错。 
下面是代码使用的数据,可以直接复制本地text里面,跑上面代码。

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

参考: 
- http://blog.csdn.net/zouxy09/article/details/20319673 
- Machine Learning in Action 
- 统计学习方法

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/387260.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

机器学习07应用机器学习的建议

决定下一步做什么(Deciding What to Try Next) 确保在设计机器学习系统时,能够选择一条最合适、最正确的道路。 具体来讲,将重点关注的问题是:假如你在开发一个机器学习系统,或者想试着改进一个机器学习…

CSS3--5.颜色属性

HTML5中添加了一些新的颜色的表示方式 1.RGBA:说得简单一点就是在RGB的基础上加进了一个通道Alpha。RGBA在RGB的基础上多了控制alpha透明度的参数。以上R、G、B三个参数,正整数值的取值范围为:0 - 255。百分数值的取值范围为:0.0%…

逻辑回归的通俗解释 逻辑回归的定位

1 逻辑回归的定位 首先,逻辑回归是一种分类(Classification)算法。比如说: 给定一封邮件,判断是不是垃圾邮件给出一个交易明细数据,判断这个交易是否是欺诈交易给出一个肿瘤检查的结果数据,判断…

机器学习08机器学习系统设计

首先要做什么 一个垃圾邮件分类器算法为例: 为了解决这样一个问题,首先要做的决定是如何选择并表达特征向量 x。 可以选择一个由 100 个最常出现在垃圾邮件中的词所构成的列表,根据这些词是否有在邮件中 出现,来获得我们的特…

数学笔记1——导数1(导数的基本概念)

什么是导数导数是高数中的重要概念,被应用于多种学科。从物理意义上讲,导数就是求解变化率的问题;从几何意义上讲,导数就是求函数在某一点上的切线的斜率。我们熟知的速度公式:v s/t,这求解的是平均速度&a…

python接口自动化(四)--接口测试工具介绍(详解)

简介 “工欲善其事必先利其器”,通过前边几篇文章的介绍,大家大致对接口有了进一步的认识。那么接下来让我们看看接口测试的工具有哪些。 目前,市场上有很多支持接口测试的工具。利用工具进行接口测试,能够提供测试效率。例如&…

机器学习09支持向量机

支持向量机(Support Vector Machines) 在监督学习中,许多学习算法的性能都非常类似,因此,重要的不是你该选择使用学习算法 A 还是学习算法 B,而更重要的是, 应用这些算法时,所创建的大量数据在应用这些算…

数学笔记2

数学笔记2——导数2(求导法则和高阶导数)和、差、积、商求导法则设uu(x),vv(x)都可导,则:(Cu)’ Cu’, C是常数(u v)’ u’ v’(uv)’ u’ v’(u/v)’ (u’v – uv’) / v21、2不解释,下面给出3、4的推导过程乘法法则的推导过乘法法则…

机器学习10聚类

无监督学习 在非监督学习中,我们需要将一系列无标签的训练数据,输入到一个算法中, 然后让它找这个数据的内在结构。 我们可能需要某种算法帮助我们寻找一种结构。图上的数据看起来可以分成两个分开的点集(称为簇)&am…

关联分析(Association analysis)

关联分析(Association analysis) 简介 大量数据中隐藏的关系可以以‘关联规则’和‘频繁项集’的形式表示。rules:{Diapers}–>{Beer}说明两者之间有很强的关系,购买Diapers的消费者通常会购买Beer。 除…

机器学习11主成分分析

降维(Dimensionality Reduction) : 一、 降维目的: 目的一:数据压缩(Data Compression) 目的二:数据可视化(Visualization) 二、 主成分分析(PCA) 主成分…

使用Apriori进行关联分析(一)

使用Apriori进行关联分析(一)大型超市有海量交易数据,我们可以通过聚类算法寻找购买相似物品的人群,从而为特定人群提供更具个性化的服务。但是对于超市来讲,更有价值的是如何找出商品的隐藏关联,从而打包促…

主成分分析法 (PCA) 用于数据可视化实验 -- Matlab版

第一步:下载数据集。 https://www.csie.ntu.edu.tw/~cjlin/libsvmtools/datasets/multiclass.html#pendigits 第二步:改变数据格式。 注:此数据集的各特征值均为像素,即属于同一量纲,故无需归一化步骤。 原格式为&a…

机器学习12推荐系统

推荐系统(Recommender Systems) 推荐系统根据浏览用户过去买过什么书,或过去评价过什么电影来判断并推荐新产品给用户。 这些系统会为像亚马逊和网飞这样的公司带来很大一部分收入。 因此,对推荐系统性能的改善,将对这些企业的有实质性和…

使用Apriori进行关联分析(二)

使用Apriori进行关联分析(二)书接上文(使用Apriori进行关联分析(一)),介绍如何挖掘关联规则。发现关联规则我们的目标是通过频繁项集挖掘到隐藏的关联规则。所谓关联规则,指通过某个…

数学笔记3——导数3(隐函数的导数)

数学笔记3——导数3(隐函数的导数)幂函数的扩展形式f(x) xn的导数:f’(x) nxn-1,n是整数,该公式对f(x) xm/n, m,n 是整数同样适用。推导过程:什么是隐函数引自知乎:“如果方程F(x,y)0能确定y…

机器学习13大规模数据集

大型数据集的学习(Learning With Large Datasets) 如果我们有一个低方差的模型, 增加数据集的规模可以帮助你获得更好的结果。 我们应该怎样应对一个有 100 万条记录的训练集? 以线性回归模型为例,每一次梯度下降…

Java07多线程

14 多线程 操作系统的多任务(multitasking):在同一时刻运行多个程序的能力。 多线程在较低的层次上扩展了多任务的概念:一个程序同时执行多个任务。 通常,每一个任务称为一个线程(tread)&…

MySQL字段拼接Concat

有时候,从数据库中拿出的数据并不是我们想要的格式,比如,有以下的vendors表 如果,想以 name (location)的格式展现出来,那么就要用到MySQL的Concat了。 Concat()拼接串,即把多个串连接起来形成一个较长的串…

使用pycharm调用模块后字体变灰 是什么原因呢?

使用pycharm调用模块后字体变灰 是什么原因呢?点击小灯泡提示出现以下内容:This inspection detects names that should resolve but dont. Due to dynamic dispatch and duck typing, this is possible in a limited but useful number of cases. Top-l…