python编写Logistic逻辑回归


Posted in Python onDecember 30, 2020

用一条直线对数据进行拟合的过程称为回归。逻辑回归分类的思想是:根据现有数据对分类边界线建立回归公式。
公式表示为:

python编写Logistic逻辑回归

一、梯度上升法

每次迭代所有的数据都参与计算。

for 循环次数:
        训练

代码如下:

import numpy as np
import matplotlib.pyplot as plt
def loadData():
 labelVec = []
 dataMat = []
 with open('testSet.txt') as f:
  for line in f.readlines():
   dataMat.append([1.0,line.strip().split()[0],line.strip().split()[1]])
   labelVec.append(line.strip().split()[2])
 return dataMat,labelVec

def Sigmoid(inX):
 return 1/(1+np.exp(-inX))

def trainLR(dataMat,labelVec):
 dataMatrix = np.mat(dataMat).astype(np.float64)
 lableMatrix = np.mat(labelVec).T.astype(np.float64)
 m,n = dataMatrix.shape
 w = np.ones((n,1))
 alpha = 0.001
 for i in range(500):
  predict = Sigmoid(dataMatrix*w)
  error = predict-lableMatrix
  w = w - alpha*dataMatrix.T*error
 return w


def plotBestFit(wei,data,label):
 if type(wei).__name__ == 'ndarray':
  weights = wei
 else:
  weights = wei.getA()
 fig = plt.figure(0)
 ax = fig.add_subplot(111)
 xxx = np.arange(-3,3,0.1)
 yyy = - weights[0]/weights[2] - weights[1]/weights[2]*xxx
 ax.plot(xxx,yyy)
 cord1 = []
 cord0 = []
 for i in range(len(label)):
  if label[i] == 1:
   cord1.append(data[i][1:3])
  else:
   cord0.append(data[i][1:3])
 cord1 = np.array(cord1)
 cord0 = np.array(cord0)
 ax.scatter(cord1[:,0],cord1[:,1],c='red')
 ax.scatter(cord0[:,0],cord0[:,1],c='green')
 plt.show()

if __name__ == "__main__":
 data,label = loadData()
 data = np.array(data).astype(np.float64)
 label = [int(item) for item in label]
 weight = trainLR(data,label)
 plotBestFit(weight,data,label)

二、随机梯度上升法

1.学习参数随迭代次数调整,可以缓解参数的高频波动。
2.随机选取样本来更新回归参数,可以减少周期性的波动。

python编写Logistic逻辑回归

for 循环次数:
    for 样本数量:
        更新学习速率
        随机选取样本
        训练
        在样本集中删除该样本

代码如下:

import numpy as np
import matplotlib.pyplot as plt
def loadData():
 labelVec = []
 dataMat = []
 with open('testSet.txt') as f:
  for line in f.readlines():
   dataMat.append([1.0,line.strip().split()[0],line.strip().split()[1]])
   labelVec.append(line.strip().split()[2])
 return dataMat,labelVec

def Sigmoid(inX):
 return 1/(1+np.exp(-inX))


def plotBestFit(wei,data,label):
 if type(wei).__name__ == 'ndarray':
  weights = wei
 else:
  weights = wei.getA()
 fig = plt.figure(0)
 ax = fig.add_subplot(111)
 xxx = np.arange(-3,3,0.1)
 yyy = - weights[0]/weights[2] - weights[1]/weights[2]*xxx
 ax.plot(xxx,yyy)
 cord1 = []
 cord0 = []
 for i in range(len(label)):
  if label[i] == 1:
   cord1.append(data[i][1:3])
  else:
   cord0.append(data[i][1:3])
 cord1 = np.array(cord1)
 cord0 = np.array(cord0)
 ax.scatter(cord1[:,0],cord1[:,1],c='red')
 ax.scatter(cord0[:,0],cord0[:,1],c='green')
 plt.show()

def stocGradAscent(dataMat,labelVec,trainLoop):
 m,n = np.shape(dataMat)
 w = np.ones((n,1))
 for j in range(trainLoop):
  dataIndex = range(m)
  for i in range(m):
   alpha = 4/(i+j+1) + 0.01
   randIndex = int(np.random.uniform(0,len(dataIndex)))
   predict = Sigmoid(np.dot(dataMat[dataIndex[randIndex]],w))
   error = predict - labelVec[dataIndex[randIndex]]
   w = w - alpha*error*dataMat[dataIndex[randIndex]].reshape(n,1)
   np.delete(dataIndex,randIndex,0)
 return w

if __name__ == "__main__":
 data,label = loadData()
 data = np.array(data).astype(np.float64)
 label = [int(item) for item in label]
 weight = stocGradAscent(data,label,300) 
 plotBestFit(weight,data,label)

三、编程技巧

1.字符串提取

将字符串中的'\n', ‘\r', ‘\t', ' ‘去除,按空格符划分。

string.strip().split()

2.判断类型

if type(secondTree[value]).__name__ == 'dict':

3.乘法

numpy两个矩阵类型的向量相乘,结果还是一个矩阵

c = a*b

c
Out[66]: matrix([[ 6.830482]])

两个向量类型的向量相乘,结果为一个二维数组

b
Out[80]: 
array([[ 1.],
  [ 1.],
  [ 1.]])

a
Out[81]: array([1, 2, 3])

a*b
Out[82]: 
array([[ 1., 2., 3.],
  [ 1., 2., 3.],
  [ 1., 2., 3.]])

b*a
Out[83]: 
array([[ 1., 2., 3.],
  [ 1., 2., 3.],
  [ 1., 2., 3.]])

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python中urllib模块用法实例详解
Nov 19 Python
python开发之基于thread线程搜索本地文件的方法
Nov 11 Python
图解Python变量与赋值
Apr 03 Python
基于python3实现socket文件传输和校验
Jul 28 Python
python如何实现异步调用函数执行
Jul 08 Python
python实现画出e指数函数的图像
Nov 21 Python
利用OpenCV和Python实现查找图片差异
Dec 19 Python
Python常用模块sys,os,time,random功能与用法实例分析
Jan 07 Python
python定义类self用法实例解析
Jan 22 Python
python多维数组分位数的求取方式
Mar 03 Python
python使用matplotlib:subplot绘制多个子图的示例
Sep 24 Python
Python 将代码转换为可执行文件脱离python环境运行(步骤详解)
Jan 25 Python
python+selenium识别验证码并登录的示例代码
Dec 21 #Python
python实现随机森林random forest的原理及方法
Dec 21 #Python
python编写分类决策树的代码
Dec 21 #Python
Python基于PyGraphics包实现图片截取功能的方法
Dec 21 #Python
用Python写王者荣耀刷金币脚本
Dec 21 #Python
python使用Apriori算法进行关联性解析
Dec 21 #Python
python实现kMeans算法
Dec 21 #Python
You might like
SONY SRF-40W电路分析
2021/03/02 无线电
使用php测试硬盘写入速度示例
2014/01/27 PHP
ThinkPHP基本的增删查改操作实例教程
2014/08/22 PHP
PHP判断上传文件类型的解决办法
2015/10/20 PHP
PHP MPDF中文乱码的解决方式
2015/12/08 PHP
PHP 根据key 给二维数组分组
2016/12/09 PHP
Zend Framework路由器用法实例详解
2016/12/11 PHP
jquery 事件冒泡的介绍以及如何阻止事件冒泡
2012/12/25 Javascript
js如何判断不同系统的浏览器类型
2013/10/28 Javascript
jQuery中.live()方法的用法深入解析
2013/12/30 Javascript
jquery实现点击展开列表同时隐藏其他列表
2015/08/10 Javascript
jQuery实现返回顶部功能
2016/02/23 Javascript
JavaScript省市区三级联动菜单效果
2016/09/21 Javascript
解决微信内置浏览器返回上一页强制刷新问题方法
2017/02/05 Javascript
Swiper 4.x 使用方法(移动端网站的内容触摸滑动)
2018/05/17 Javascript
jQuery移动端跑马灯抽奖特效升级版(抽奖概率固定)实现方法
2019/01/18 jQuery
对TypeScript库进行单元测试的方法
2019/07/18 Javascript
JavaScript实现刮刮乐效果
2020/11/01 Javascript
PyTorch上搭建简单神经网络实现回归和分类的示例
2018/04/28 Python
详解Python3中的迭代器和生成器及其区别
2018/10/09 Python
pycharm在调试python时执行其他语句的方法
2018/11/29 Python
Python项目 基于Scapy实现SYN泛洪攻击的方法
2019/07/23 Python
python根据多个文件名批量查找文件
2019/08/13 Python
Python @property使用方法解析
2019/09/17 Python
Python打开文件、文件读写操作、with方式、文件常用函数实例分析
2020/01/07 Python
简单介绍HTML5中的文件导入
2015/05/08 HTML / CSS
印度最大的旅游网站:MakeMyTrip
2016/10/05 全球购物
Larsson & Jennings官网:现代瑞士钟表匠
2018/03/20 全球购物
如何获得EntityManager
2014/02/09 面试题
十佳班主任事迹材料
2014/01/18 职场文书
决心书范文
2014/03/11 职场文书
2014年学生工作总结
2014/11/20 职场文书
2016年中学法制宣传日活动总结
2016/04/01 职场文书
浅谈JS和Nodejs中的事件驱动
2021/05/05 NodeJs
SQL注入篇学习之盲注/宽字节注入
2022/03/03 MySQL
python数字图像处理数据类型及颜色空间转换
2022/06/28 Python