Logistic回归 python实现

Logistic回归

算法优缺点:


1.计算代价不高,易于理解和实现
2.容易欠拟合,分类精度可能不高
3.适用数据类型:数值型和标称型

算法思想:

  • 其实就我的理解来说,logistic回归实际上就是加了个sigmoid函数的线性回归,这个sigmoid函数的好处就在于,将结果归到了0到1这个区间里面了,并且sigmoid(0)=0.5,也就是说里面的线性部分的结果大于零小于零就可以直接计算到了。这里的求解方式是梯度上升法,具体我就不扯了,最推荐的资料还是Ng的视频,那里面的梯度下降就是啦,只不过一个是梯度上升的方向一个是下降的方向,做法什么的都一样。
  • 而梯度上升(准确的说叫做“批梯度上升”)的一个缺点就是计算量太大了,每一次迭代都需要把所有的数据算一遍,这样一旦训练集大了之后,那么计算量将非常大,所以这里后面还提出了随机梯度下降,思想就是每次只是根据一个data进行修正。这样得到的最终的结果可能会有所偏差但是速度却提高了很多,而且优化之后的偏差还是很小的。随机梯度上升的另一个好处是这是一个在线算法,可以根据新数据的到来不断处理

函数:

loadDataSet()
创建数据集,这里的数据集就是在一个文件中,这里面有三行,分别是两个特征和一个标签,但是我们在读出的时候还加了X0这个属性
sigmoid(inX)
sigmoid函数的计算,这个函数长这样的,基本坐标大点就和阶跃函数很像了


gradAscend(dataMatIn, classLabels)
梯度上升算法的实现,里面用到了numpy的数组,并且设定了迭代次数500次,然后为了计算速度都采取了矩阵计算,计算的过程中的公式大概是:w= w+alpha*(y-h)x[i](一直懒得写公式,见谅。。。)
gradAscendWithDraw(dataMatIn, classLabels)
上面的函数加强版,增加了一个weight跟着迭代次数的变化曲线
stocGradAscent0(dataMatrix, classLabels)
这里为了加快速度用来随机梯度上升,即每次根据一组数据调整(额,好吧,这个际没有随机因为那是线面那个函数)
stocGradAscentWithDraw0(dataMatrix, classLabels)
上面的函数加强版,增加了一个weight跟着迭代次数的变化曲线
stocGradAscent1(dataMatrix, classLabels, numIter=150)
这就真的开始随机了,随机的主要好处是减少了周期性的波动了。另外这里还加入了alpha的值随迭代变化,这样可以让alpha的值不断的变化,但是都不会减小到0。
stocGradAscentWithDraw1(dataMatrix, classLabels, numIter=150)
上面的函数加强版,增加了一个weight跟着迭代次数的变化曲线
plotBestFit(wei)
根据计算的weight值画出拟合的线,直观观察效果

运行效果分析:
1、梯度上升:
迭代变化趋势
分类结果:
2、随机梯度上升版本1
迭代变化趋势
分类结果:
这个速度虽然快了很多但是效果不太理想啊。不过这个计算量那么少,我们如果把这个迭代200次肯定不一样了,效果如下
果然好多了
3、随机梯度上升版本2
迭代变化趋势
分类结果:
恩,就是这样啦,效果还是不错的啦。代码的画图部分写的有点烂,见谅啦
  1.   1 #coding=utf-8
      2 from numpy import *
      3 
      4 def loadDataSet():
      5     dataMat = []
      6     labelMat = []
      7     fr = open('testSet.txt')
      8     for line in fr.readlines():
      9         lineArr = line.strip().split()
     10         dataMat.append([1.0, float(lineArr[0]), float(lineArr[1])])
     11         labelMat.append(int(lineArr[2]))
     12     return dataMat, labelMat
     13     
     14 def sigmoid(inX):
     15     return 1.0/(1+exp(-inX))
     16     
     17 def gradAscend(dataMatIn, classLabels):
     18     dataMatrix = mat(dataMatIn)
     19     labelMat = mat(classLabels).transpose()
     20     m,n = shape(dataMatrix)
     21     alpha = 0.001
     22     maxCycle = 500
     23     weight = ones((n,1))
     24     for k in range(maxCycle):
     25         h = sigmoid(dataMatrix*weight)
     26         error = labelMat - h
     27         weight += alpha * dataMatrix.transpose() * error
     28         #plotBestFit(weight)
     29     return weight
     30 
     31 def gradAscendWithDraw(dataMatIn, classLabels):
     32     import matplotlib.pyplot as plt
     33     fig = plt.figure()
     34     ax = fig.add_subplot(311,ylabel='x0')
     35     bx = fig.add_subplot(312,ylabel='x1')
     36     cx = fig.add_subplot(313,ylabel='x2')
     37     dataMatrix = mat(dataMatIn)
     38     labelMat = mat(classLabels).transpose()
     39     m,n = shape(dataMatrix)
     40     alpha = 0.001
     41     maxCycle = 500
     42     weight = ones((n,1))
     43     wei1 = []
     44     wei2 = []
     45     wei3 = []
     46     for k in range(maxCycle):
     47         h = sigmoid(dataMatrix*weight)
     48         error = labelMat - h
     49         weight += alpha * dataMatrix.transpose() * error
     50         wei1.extend(weight[0])
     51         wei2.extend(weight[1])
     52         wei3.extend(weight[2])
     53     ax.plot(range(maxCycle), wei1)
     54     bx.plot(range(maxCycle), wei2)
     55     cx.plot(range(maxCycle), wei3)
     56     plt.xlabel('iter_num')
     57     plt.show()
     58     return weight
     59     
     60 def stocGradAscent0(dataMatrix, classLabels):
     61     m,n = shape(dataMatrix)
     62     
     63     alpha = 0.001
     64     weight = ones(n)
     65     for i in range(m):
     66         h = sigmoid(sum(dataMatrix[i]*weight))
     67         error = classLabels[i] - h
     68         weight = weight + alpha * error * dataMatrix[i]
     69     return weight
     70     
     71 def stocGradAscentWithDraw0(dataMatrix, classLabels):
     72     import matplotlib.pyplot as plt
     73     fig = plt.figure()
     74     ax = fig.add_subplot(311,ylabel='x0')
     75     bx = fig.add_subplot(312,ylabel='x1')
     76     cx = fig.add_subplot(313,ylabel='x2')
     77     m,n = shape(dataMatrix)
     78     
     79     alpha = 0.001
     80     weight = ones(n)
     81     wei1 = array([])
     82     wei2 = array([])
     83     wei3 = array([])
     84     numIter = 200
     85     for j in range(numIter):
     86         for i in range(m):
     87             h = sigmoid(sum(dataMatrix[i]*weight))
     88             error = classLabels[i] - h
     89             weight = weight + alpha * error * dataMatrix[i]
     90             wei1 =append(wei1, weight[0])
     91             wei2 =append(wei2, weight[1])
     92             wei3 =append(wei3, weight[2])
     93     ax.plot(array(range(m*numIter)), wei1)
     94     bx.plot(array(range(m*numIter)), wei2)
     95     cx.plot(array(range(m*numIter)), wei3)
     96     plt.xlabel('iter_num')
     97     plt.show()
     98     return weight
     99     
    100 def stocGradAscent1(dataMatrix, classLabels, numIter=150):
    101     m,n = shape(dataMatrix)
    102     
    103     #alpha = 0.001
    104     weight = ones(n)
    105     for j in range(numIter):
    106         dataIndex = range(m)
    107         for i in range(m):
    108             alpha = 4/ (1.0+j+i) +0.01
    109             randIndex = int(random.uniform(0,len(dataIndex)))
    110             h = sigmoid(sum(dataMatrix[randIndex]*weight))
    111             error = classLabels[randIndex] - h
    112             weight = weight + alpha * error * dataMatrix[randIndex]
    113             del(dataIndex[randIndex])
    114     return weight
    115     
    116 def stocGradAscentWithDraw1(dataMatrix, classLabels, numIter=150):
    117     import matplotlib.pyplot as plt
    118     fig = plt.figure()
    119     ax = fig.add_subplot(311,ylabel='x0')
    120     bx = fig.add_subplot(312,ylabel='x1')
    121     cx = fig.add_subplot(313,ylabel='x2')
    122     m,n = shape(dataMatrix)
    123     
    124     #alpha = 0.001
    125     weight = ones(n)
    126     wei1 = array([])
    127     wei2 = array([])
    128     wei3 = array([])
    129     for j in range(numIter):
    130         dataIndex = range(m)
    131         for i in range(m):
    132             alpha = 4/ (1.0+j+i) +0.01
    133             randIndex = int(random.uniform(0,len(dataIndex)))
    134             h = sigmoid(sum(dataMatrix[randIndex]*weight))
    135             error = classLabels[randIndex] - h
    136             weight = weight + alpha * error * dataMatrix[randIndex]
    137             del(dataIndex[randIndex])
    138             wei1 =append(wei1, weight[0])
    139             wei2 =append(wei2, weight[1])
    140             wei3 =append(wei3, weight[2])
    141     ax.plot(array(range(len(wei1))), wei1)
    142     bx.plot(array(range(len(wei2))), wei2)
    143     cx.plot(array(range(len(wei2))), wei3)
    144     plt.xlabel('iter_num')
    145     plt.show()
    146     return weight
    147     
    148 def plotBestFit(wei):
    149     import matplotlib.pyplot as plt
    150     weight = wei
    151     dataMat,labelMat = loadDataSet()
    152     dataArr = array(dataMat)
    153     n = shape(dataArr)[0]
    154     xcord1 = []
    155     ycord1 = []
    156     xcord2 = []
    157     ycord2 = []
    158     for i in range(n):
    159         if int(labelMat[i]) == 1:
    160             xcord1.append(dataArr[i,1])
    161             ycord1.append(dataArr[i,2])
    162         else:
    163             xcord2.append(dataArr[i,1])
    164             ycord2.append(dataArr[i,2])
    165     fig = plt.figure()
    166     ax = fig.add_subplot(111)
    167     ax.scatter(xcord1, ycord1, s=30, c='red', marker='s')
    168     ax.scatter(xcord2, ycord2, s=30, c='green')
    169     x = arange(-3.0, 3.0, 0.1)
    170     y = (-weight[0] - weight[1]*x)/weight[2]
    171     ax.plot(x,y)
    172     plt.xlabel('X1')
    173     plt.ylabel('X2')
    174     plt.show()
    175     
    176 def main():
    177     dataArr,labelMat = loadDataSet()
    178     #w = gradAscendWithDraw(dataArr,labelMat)
    179     w = stocGradAscentWithDraw0(array(dataArr),labelMat)
    180     plotBestFit(w)
    181     
    182 if __name__ == '__main__':
    183     main()

     

    机器学习笔记索引

来自为知笔记(Wiz)



转载于:https://www.cnblogs.com/MrLJC/p/4117805.html

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

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

相关文章

python 定时自动爬取_python实现scrapy爬虫每天定时抓取数据的示例代码

1. 前言。1.1. 需求背景。每天抓取的是同一份商品的数据,用来做趋势分析。要求每天都需要抓一份,也仅限抓取一份数据。但是整个爬取数据的过程在时间上并不确定,受本地网络,代理速度,抓取数据量有关,一般情…

博客园win8客户端开发记录5-app设置 登录 回复评论

这段时间完成了博客园cnblogs登录,注销和设置的相关功能 ,进入软件, 打开win8的charm setting 选择设置就是当前软件的设置选项了, 感觉这有点山寨mac os x系统(所有软件包括当前系统使用统一的设置)。 扯远…

简单工厂模式,工厂方法模式,抽象工厂模式,spring的狂想

菜鸟D在项目中遇见一个比较纠结的高耦合,所以就想办法来解耦。情况是这样的:系统通过用户选择treeview控件的节点判断调用不同的处理,这些处理中某些东西又是类似的。同事的建议是采用简单工厂,耦合就耦合吧,反正treev…

如何使用CSS实现居中

前言: 这一篇主要是翻译 《how-to-center-anything-with-css》这一篇文章的主要内容,再加上自己的一些概括理解;主要问题是解决垂直居中的问题。我们知道实现水平居中的方式很多种,比如: text-align:center; margin:0 …

java布局_运用 BoxLayout 进行 Swing 控件布局

引言在用户使用 Java Swing 进行用户界面开发过程中,会碰到如何对 Java Swing 的控件进行布局的问题。Swing 的控件放置在容器 (Container) 中,容器就是能够容纳控件或者其它容器的类,容器的具体例子有 Frame、Panel 等等。容器需要定义一个布…

java链表实现_链表的原理及java实现

一:单向链表基本介绍链表是一种数据结构,和数组同级。比如,Java中我们使用的ArrayList,其实现原理是数组。而LinkedList的实现原理就是链表了。链表在进行循环遍历时效率不高,但是插入和删除时优势明显。下面对单向链表…

xss challenge 解题思路(1-3)

challenge1: 用很基本的方法即可&#xff0c;截图如下&#xff1a; 提交后成功弹窗&#xff0c;完成。 challenge2 这次我们发现我们输入的内容被放入value”“ 中&#xff0c;所以需要将前面的结构闭合&#xff0c;构造如下&#xff1a; "><script>alert(docume…

宾得准饼干广角镜头DA15

DA15的挂机效果图&#xff0c;感觉还是超级的小&#xff0c;是最小的广角镜头了&#xff1a; 主要特点1. 超广视角当安装在宾得数码单反相机上时&#xff0c;这款全新的镜头提供相当于35mm胶片规格的约23mm画面视角&#xff0c;可使拍摄者拍摄出独特的诱人影像和超广角镜头独有…

java slf4j_SLF4J 使用手册

原文链接 译者&#xff1a;zivyuJava的简单日志门面( Simple Logging Facade for Java SLF4J)作为一个简单的门面或抽象&#xff0c;用来服务于各种各样的日志框架&#xff0c;比如java.util.logging、logback和log4j。SLF4J允许最终用户在部署时集成自己想要的日志框架。需要…

[译]Java 垃圾回收介绍

说明&#xff1a;这篇文章来翻译来自于Javapapers 的Java Garbage Collection Introduction 在Java中&#xff0c;对象内存空间的分配与回收是由JVM中的垃圾回收进程自动完成的。和C语言不一样的是&#xff0c;开发中不需要在Java中写垃圾回收代码。这也是使Java更加流行而且帮…

打印三角形

直角三角形 #include<iostream> using namespace std; int main() { int i,j; for(i1;i<10;i) {for(j1;j<i;j) cout<<"*"; cout<<endl; } } ———————————————————————————…

Linux基础入门学习笔记之二

第三节 用户及文件权限管理 Linux用户管理 Linux是可以实现多用户登录的操作系统 查看用户who命令用于查看用户 shiyanlou是当前登录用户的用户名 pts/0中pts表示伪终端&#xff0c;后面的数字表示伪终端的序号。 后面是当前伪终端启动时间 创建用户创建用户需要root权限&#…

这几天有django和python做了一个多用户博客系统(可选择模板) 没完成,先分享下...

这个TBlog已经全新改版了&#xff0c;更名为UUBlog 新版地址&#xff1a; 用Python和Django实现多用户博客系统——UUBlog 断断续续2周时间吧&#xff0c;用django做了一个多用户博客系统&#xff0c;现在还没有做完&#xff0c;做分享下,以后等完善了再慢慢说 做的时候房展了博…

MySQL数据高级查询之连接查询、联合查询、子查询

2019独角兽企业重金招聘Python工程师标准>>> 一、连接查询 连接查询: 将多张表(>2)进行记录的连接(按照某个指定的条件进行数据拼接)。 连接查询的意义: 在用户查看数据的时候,需要显示的数据来自多张表. 连接查询: join, 使用方式: 左表 join 右表&#xff1b;左…

Oracle11g解锁报错SP2-0306-选项无效

普通用户登录isqlplus: (一)在浏览器中输入URL &#xff08;http://localhost:5560/isqlplus&#xff09;。显示登录界面 这里只能用普通用户进行登录&#xff0c;因为要用sys登录&#xff0c;必须用sys的DBA身份登录。所以用普通用户SCOTT&#xff0c;但是还未解锁 问题:SP2-0…

Chrome浏览器无法观看视频,一直提示“adobe flash player 已过期” ?

很多新用户在安装了Chrome浏览器或者更新过的的时候&#xff0c;经常提示“ adobe flash player 已过期”的问题&#xff0c;反复提示&#xff0c;导致无法观看视频。于是从网上也找了很多办法都没有解决。这里给大家提供一个最完美的解决方案。经亲自测试&#xff0c;完美解决…

关于JVM的垃圾回收GC的一些记录

目录 一、JVM内存区域划分 二、从一个基本问题开始引入垃圾回收 三、GC作用的区域 三、如何确定一个对象是否可以被当成垃圾进行回收 &#xff08;1&#xff09;引用计数法 &#xff08;2&#xff09;可达性分析算法 &#xff08;3&#xff09;引用的类型 &#xff08;3…

codevs1219 骑士遍历(棋盘DP)

题目描述 Description设有一个n*m的棋盘&#xff08;2≤n≤50&#xff0c;2≤m≤50&#xff09;&#xff0c;如下图&#xff0c;在棋盘上有一个中国象棋马。 规定&#xff1a; 1)马只能走日字 2)马只能向右跳 问给定起点x1,y1和终点x2,y2&#xff0c;求出马从x1,y1出发到x2,y2的…

java ssh免密登录_SSH公钥、私钥配置(SSH免密码登录方式)

1.首先使用想要发起ssh免密访问的用户A登录Linux(简称客户端Linux)2.进入该用户的家目录(cd ~)&#xff0c;看是否有.ssh文件夹(linux中以.开头文件夹是隐藏的&#xff0c;使用ll -a进行查看)&#xff0c;如果没有则创建(mkdir ~/.ssh)&#xff0c;并修改访问权限(chmod 700 ~…

win8, VS2013 .NET 4.5在哪找svcutil.exe?

我这个纠结呀&#xff0c;公司用win8&#xff0c; .NET 4.5。想做一个很简单的项目&#xff0c;就是wcf宿主iis&#xff0c;项目根目录下有aspx文件和svc文件。于是参考了一个博客http://www.cnblogs.com/yjmyzz/archive/2008/08/19/1270961.html&#xff0c;[原创]WCF入门级使…