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之永远强大的函数
Sep 14 Python
Python入门篇之函数
Oct 20 Python
Python的Django框架中URLconf相关的一些技巧整理
Jul 18 Python
python遍历序列enumerate函数浅析
Oct 17 Python
Python实现列表删除重复元素的三种常用方法分析
Nov 24 Python
python3 对list中每个元素进行处理的方法
Jun 29 Python
Python3.5局部变量与全局变量作用域实例分析
Apr 30 Python
python3实现小球转动抽奖小游戏
Apr 15 Python
Python selenium文件上传下载功能代码实例
Apr 13 Python
Python子进程subpocess原理及用法解析
Jul 16 Python
python如何做代码性能分析
Apr 26 Python
学会用Python实现滑雪小游戏,再也不用去北海道啦
May 20 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
PHP mb_convert_encoding 获取字符串编码类型实现代码
2009/04/26 PHP
PHP 函数学习简单小结
2010/07/08 PHP
优化php效率,提高php性能的一些方法
2011/03/24 PHP
用PHP读取超大文件的实例代码
2012/04/01 PHP
php环境套包 dedeampz 伪静态设置示例
2014/03/26 PHP
ThinkPHP中的关联模型注意点
2014/06/16 PHP
php实现常见图片格式的水印和缩略图制作(面向对象)
2016/06/15 PHP
PHP生成推广海报的方法分享
2018/04/22 PHP
异步javascript的原理和实现技巧介绍
2012/11/08 Javascript
如何让页面在打开时自动刷新一次让图片全部显示
2012/12/17 Javascript
Javascript函数式编程语言
2015/10/11 Javascript
浅谈JS函数定义方式的区别
2016/10/30 Javascript
jquery UI Datepicker时间控件冲突问题解决
2016/12/16 Javascript
AngularJS的ng-click传参的方法
2017/06/19 Javascript
AngularJs 最新验证手机号码的实例,成功测试通过
2017/11/26 Javascript
详解Vue快速零配置的打包工具——parcel
2018/01/16 Javascript
JS实现同一DOM元素上onClick事件与onDblClick事件并存的解决方法
2018/06/07 Javascript
详解vue-template-admin三级路由无法缓存的解决方案
2020/03/10 Javascript
js获取url页面id,也就是最后的数字文件名
2020/09/25 Javascript
[13:16]INFAMOUS vs VGJ T BO3
2018/06/07 DOTA
Python3爬虫教程之利用Python实现发送天气预报邮件
2018/12/16 Python
使用python无账号无限制获取企查查信息的实例代码
2020/04/17 Python
python爬虫如何解决图片验证码
2021/02/14 Python
德国化妆品和天然化妆品网上商店:kosmetikfuchs.de
2017/06/09 全球购物
澳大利亚最好的厨具店:Kitchen Warehouse
2018/03/13 全球购物
联想加拿大官方网站:Lenovo Canada
2018/04/05 全球购物
几道数据库的面试题或笔试题
2014/05/31 面试题
教师求职信
2014/06/17 职场文书
学院党的群众路线教育实践活动第一阶段情况汇报
2014/10/25 职场文书
车间质检员岗位职责
2015/04/08 职场文书
2015年幼儿园保育员工作总结
2015/04/23 职场文书
仙境之桥观后感
2015/06/16 职场文书
详细总结Python常见的安全问题
2021/05/21 Python
OpenCV-Python实现图像平滑处理操作
2021/06/08 Python
解决xampp安装后Apache无法启动
2022/03/21 Servers
Java 多态分析
2022/04/26 Java/Android