最近一直在看机器学习相关的算法,今天学习logistic回归,在对算法进行了简单分析编程实现之后,通过实例进行验证。

一 logistic概述

  个人理解的回归就是发现变量之间的关系,也就是求回归系数,经常用回归来预测目标值。回归和分类同属于监督学习,所不同的是回归的目标变量必须是连续数值型。

  今天要学习的logistic回归的主要思想是根据现有的数据对分类边界线建立回归公式,以此进行分类。主要在流行病学中应用较多,比较常用的情形是探索某疾病的危险因素,根据危险因素预测某疾病发生的概率等等。logistic回归的因变量可以是二分类的,也可以是多分类的,但是二分类的更为常用,也更加容易解释,所以实际中最为常用的就是二分类的logistic回归。

  今天我们就二分类进行分析,我们在回归分析中需要一个函数可以接受所有的输入然后预测出类别,假定用0和1分别表示两个类别,logistic函数曲线很像S型,故此我们可以联系sigmoid函数:σ = 1/(1/(1+e-z))。为了实现logistic回归分类器,我们可以在每个特征上乘以一个回归系数,将所有的乘积相加,将和值代入sigmoid函数中,得到一个范围为0-1之间的数,如果该数值大于0.5则被归入1类,否则被归为0类。

  基于之前的分析,需要找到回归系数,首先我们可以将sigmoid函数的输入形式记为:z = w0x0 + w1x1 +...+wnxn,其中x为输入数据,相应的w就是我们要求的系数,为了求得最佳系数,结合最优化理论,我们可以选取梯度上升法优化算法。梯度上升法的基本思想是:要找到函数的最大值,最好的方法是沿着该函数的梯度方向寻找。要想更进一步的了解这个方法,建议去看Andrew Ng的机器学习课程,记得在第二节主要讲述的就是梯度下降法,与梯度上升所不同的是它求得的是函数的最小值,不过思想是一致的。

二 python实现                                                                             

  基于之前的分析,在本节我们对logistic回归一步一步采用python编程实现,今天我用的是2.7版本的,代码如下:

  1. #coding:utf-8
  2. from numpy import *
  3. import math
  4. import matplotlib.pyplot as plt
  5.  
  6. #导入数据
  7. def loadDataSet():
  8. dataMat = []
  9. labelMat = []
  10. fr = open('testSet.txt')
  11. for line in fr.readlines():
  12. lineArr = line.strip().split()#将文本中的每行中的字符一个个分开,变成list
  13. dataMat.append([1.0,float(lineArr[0]),float(lineArr[1])])
  14. labelMat.append(int(lineArr[2]))
  15. return dataMat,labelMat
  16.  
  17. #定义sigmoid函数
  18. def sigmoid(inX):
  19. return 1.0/(1+exp(-inX))
  20.  
  21. #梯度上升方法求出回归系数
  22. def gradAscent(data,label):
  23. dataMat = mat(data)
  24. labelMat = mat(label).transpose()
  25. m,n = shape(dataMat)
  26. alpha = 0.001
  27. maxCycles = 500
  28. weights = ones((n,1))
  29. for item in range(maxCycles):
  30. h = sigmoid(dataMat * weights)
  31. error = (labelMat - h)#注意labelMat中的元素的数据类型应为int
  32. weights = weights + alpha * dataMat.transpose() * error
  33. return weights
  34.  
  35. '''
  36. #测试
  37. data,label = loadDataSet()
  38. print gradAscent(data,label)
  39. '''
  40.  
  41. ##求出回归系数之后,就确定了不同数据类别之间的分隔线,为了便于理解,可以画出那条线
  42. def plotBestFit(weights):
  43. dataMat,labelMat = loadDataSet()
  44. dataArr = array(dataMat)
  45. n = shape(dataArr)[0]
  46. xcode1 = []
  47. ycode1 = []
  48. xcode2 = []
  49. ycode2 = []
  50. for i in range(n):
  51. if int(labelMat[i]) == 1:
  52. xcode1.append(dataArr[i,1])
  53. ycode1.append(dataArr[i,2])
  54. else:
  55. xcode2.append(dataArr[i,1])
  56. ycode2.append(dataArr[i,2])
  57. fig = plt.figure()
  58. ax = fig.add_subplot(111)
  59. ax.scatter(xcode1,ycode1,s = 30,c = 'red',marker = 's')
  60. ax.scatter(xcode2,ycode2,s = 30,c = 'green')
  61. x = arange(-3.0,3.0,0.1)
  62. y = (-weights[0] - weights[1] * x) / weights[2]
  63. ax.plot(x,y)
  64. plt.xlabel('x1')
  65. plt.ylabel('y1')
  66. plt.show()
  67.  
  68. '''
  69. #测试
  70. data,label = loadDataSet()
  71. weights = gradAscent(data,label)
  72. plotBestFit(weights.getA())
  73. '''
  74. ##改进的梯度上升法
  75. def stocGradAscent1(dataMatrix, classLabels, numIter=150):
  76. m,n = shape(dataMatrix)
  77. weights = ones(n) #initialize to all ones
  78. for j in range(numIter):
  79. dataIndex = range(m)
  80. for i in range(m):
  81. alpha = 4/(1.0+j+i)+0.0001
  82. randIndex = int(random.uniform(0,len(dataIndex)))
  83. h = sigmoid(sum(dataMatrix[randIndex]*weights))
  84. error = classLabels[randIndex] - h
  85. weights = weights + alpha * error * dataMatrix[randIndex]
  86. del(dataIndex[randIndex])
  87. return weights
  88. '''
  89. #测试
  90. data,label = loadDataSet()
  91. weights = stocGradAscent1(array(data),label)
  92. plotBestFit(weights)
  93. '''

三 实例分析                                                                                         

基于之前的分析,本节采用Logistic回归来预测患有疝病的马的存活问题,代码如下:

  1. def classifyVector(inX,weights):
  2. prob = sigmoid(sum(inX * weights))
  3. if prob > 0.5:
  4. return 1.0
  5. else:
  6. return 0.0
  7. def colicTest():
  8. frTrain = open('horseColicTraining.txt'); frTest = open('horseColicTest.txt')
  9. trainingSet = []; trainingLabels = []
  10. for line in frTrain.readlines():
  11. currLine = line.strip().split('\t')
  12. lineArr =[]
  13. for i in range(21):
  14. lineArr.append(float(currLine[i]))
  15. trainingSet.append(lineArr)
  16. trainingLabels.append(float(currLine[21]))
  17. trainWeights = stocGradAscent1(array(trainingSet), trainingLabels, 1000)
  18. errorCount = 0; numTestVec = 0.0
  19. for line in frTest.readlines():
  20. numTestVec += 1.0
  21. currLine = line.strip().split('\t')
  22. lineArr =[]
  23. for i in range(21):
  24. lineArr.append(float(currLine[i]))
  25. if int(classifyVector(array(lineArr), trainWeights))!= int(currLine[21]):
  26. errorCount += 1
  27. errorRate = (float(errorCount)/numTestVec)
  28. print "错误率是:",errorRate
  29. return errorRate
  30. def multiTest():
  31. numTests = 10; errorSum=0.0
  32. for k in range(numTests):
  33. errorSum += colicTest()
  34. print "平均错误率是",(numTests, errorSum/float(numTests))
  35.  
  36. multiTest()

最后可以看出错误率在35%左右,通过调节步长还是可以进一步减小错误率。

  Logistic回归的目的是寻找到一个非线性sigmoid函数的最佳拟合参数,可以采用梯度上升法优化,而在这个过程中,为了减少时间复杂度,又可以使用随机梯度上升法来简化梯度上升法。

机器学习(六)— logistic回归的更多相关文章

  1. [机器学习实战-Logistic回归]使用Logistic回归预测各种实例

    目录 本实验代码已经传到gitee上,请点击查收! 一.实验目的 二.实验内容与设计思想 实验内容 设计思想 三.实验使用环境 四.实验步骤和调试过程 4.1 基于Logistic回归和Sigmoid ...

  2. 机器学习之Logistic 回归算法

    1 Logistic 回归算法的原理 1.1 需要的数学基础 我在看机器学习实战时对其中的代码非常费解,说好的利用偏导数求最值怎么代码中没有体现啊,就一个简单的式子:θ= θ - α Σ [( hθ( ...

  3. 机器学习之logistic回归算法与代码实现原理

    Logistic回归算法原理与代码实现 本文系作者原创,转载请注明出处:https://www.cnblogs.com/further-further-further/p/10033567.html ...

  4. 机器学习5—logistic回归学习笔记

    机器学习实战之logistic回归 test5.py #-*- coding:utf-8 import sys sys.path.append("logRegres.py") fr ...

  5. 机器学习笔记—Logistic回归

    本文申明:本系列笔记全部为原创内容,如有转载请申明原地址出处.谢谢 序言:what is logistic regression? Logistics 一词表示adj.逻辑的;[军]后勤学的n.[逻] ...

  6. 机器学习笔记—Logistic 回归

    前面我们介绍了线性回归,为捕获训练集中隐藏的线性模型,提高预测准确率,我们寻找最佳参数 θ,使得预测值与真实值误差尽量小,也就是使均方误差最小.而经过验证,最小均方误差是符合最大似然估计理论的. 在 ...

  7. 机器学习基础-Logistic回归1

    利用Logistic回归进行分类的主要思想是:根据现有数据对分类边界线建立回归公式,以此进行分类. 训练分类器时的做法就是寻找最佳拟合参数,使用的时最优化算法. 优点:计算代价不高,利于理解和实现. ...

  8. 吴裕雄--天生自然python机器学习:Logistic回归

    假设现在有一些数据点,我们用 一条直线对这些点进行拟合(该线称为最佳拟合直线),这个拟合过程就称作回归.利用Logistic回归进行分类的主要思想是:根据现有数据对分类边界线建立回归公式,以此进行分类 ...

  9. 机器学习算法-logistic回归算法

    Logistic回归算法调试 一.算法原理 Logistic回归算法是一种优化算法,主要用用于只有两种标签的分类问题.其原理为对一些数据点用一条直线去拟合,对数据集进行划分.从广义上来讲这也是一种多元 ...

  10. 机器学习:logistic回归

    逻辑回归是一个形式是Y=1/(1+E(-X))的函数,它的特点是: 1, 当X>0,随着X增大,Y很快的接近1: 2,当x<0,随着X的减小,Y很快的接近0: 3,当X=0时,Y=1/2. ...

随机推荐

  1. TCP协议的三次握手和四次挥手机制

    核心知识点: 1.三次握手:seq和ack number 2.四次挥手:FIN和随机数 一.TCP/IP协议 TCP/IP协议(Transmission control protool/Interne ...

  2. 解释一下python中的继承

    当一个类继承另一个类,它就被称为一个子类/派生类,继承父类/基类/超类.它会继承/获取所有类成员(属性和方法) 继承能让我们重新使用代码,也能更容易的创建和维护应用 单继承:一个类继承单个基类 多继承 ...

  3. Linux图像系统框架-理解X11与Qt的层次结构

    转:http://blog.csdn.net/kjfureone/article/details/52848550 1. 前言 图形子系统是linux系统中比较复杂的子系统之一:对下,它要管理形态各异 ...

  4. p2p网络中的NAT穿透技术----常见NAT穿越解决方案

    转:http://blog.csdn.net/cllzw/article/details/46438257 常见NA丁穿越解决方案 NAT技术在缓解IPv4地址紧缺问题.构建防火墙.保证网络安全等方面 ...

  5. Linux基础四---系统监控&硬盘分区

    ---恢复内容开始--- 一系统分区 1.top [参数] -b 批处理 -c 显示命令完全模式 -I 忽略失效过程 -s 保密模式 -S 累积模式 -i<时间> 设置间隔时间 -u< ...

  6. Linux基础三---打包压缩&vim&系统的初始化和服务

    一,常用命令——tar&vim 1. tar [参数]  文件名  [路径] 参数: -c :建立一个压缩文件的参数指令(create 的意思):     -x :解开一个压缩文件的参数指令! ...

  7. 数据结构与算法分析:C语言描述(原书第2版 简体中文版!!!) PDF+源代码+习题答案

    转自:http://www.linuxidc.com/Linux/2014-04/99735.htm 数据结构与算法分析:C语言描述(原书第2版中文版!!!) PDF+源代码+习题答案 数据结构与算法 ...

  8. INSPIRED启示录 读书笔记 - 第1章 关键角色及其职责

    现代软件产品团队 1.产品经理的主要职责分为两项:评估产品机会和定义要开发的产品 2.用户体验设计师(由多种角色组成,这里面最关键的是交互设计师)      交互设计师负责深入理解目标用户,设计有价值 ...

  9. leetcode刷题1:两数之和two_sum

    题目:(难度:Easy) 给定一个整数数组和一个目标值,找出数组中和为目标值的两个数. 你可以假设每个输入只对应一种答案,且同样的元素不能被重复利用. 示例: 给定 nums = [2, 7, 11, ...

  10. 微信内置浏览器和小程序的 User Agent 区别及判断方法

    通过UA来判断不同的设备或者浏览器是开发者最常用的方式方法,而对于微信开发和小程序也是同样的一个情况,我们可以通过微信内置浏览器 User Agent 信息来判断其具体类型或者设备. 所以子凡就通过徒 ...