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 相关文章推荐
一个基于flask的web应用诞生(1)
Apr 11 Python
Python OpenCV处理图像之滤镜和图像运算
Jul 10 Python
pytz格式化北京时间多出6分钟问题的解决方法
Jun 21 Python
Python简易版图书管理系统
Aug 12 Python
python__name__原理及用法详解
Nov 02 Python
Python属性和内建属性实例解析
Jan 14 Python
python3 sleep 延时秒 毫秒实例
May 04 Python
Python异常处理机制结构实例解析
Jul 23 Python
浅谈如何使用python抓取网页中的动态数据实现
Aug 17 Python
Python实现加密的RAR文件解压的方法(密码已知)
Sep 11 Python
用python绘制樱花树
Oct 09 Python
python开发一款翻译工具
Oct 10 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版(4)
2006/10/09 PHP
php 数学运算验证码实现代码
2009/10/11 PHP
phpmyadmin导入(import)文件限制的解决办法
2009/12/11 PHP
ThinkPHP的I方法使用详解
2014/06/18 PHP
php版微信开发之接收消息,自动判断及回复相应消息的方法
2016/09/23 PHP
js同时按下两个方向键
2007/12/01 Javascript
jQueryUI如何自定义组件实现代码
2010/11/14 Javascript
JavaScript代码里的判断小结
2016/08/22 Javascript
angularjs 中$apply,$digest,$watch详解
2016/10/13 Javascript
Angular2 路由问题修复详解
2017/03/01 Javascript
Vue-router结合transition实现app前进后退动画切换效果的实例
2017/10/11 Javascript
vue-cli 自定义指令directive 添加验证滑块示例
2017/10/19 Javascript
浅谈Angular HttpClient简单入门
2018/05/04 Javascript
微信小程序实现即时通信聊天功能的实例代码
2018/08/17 Javascript
BootStrap模态框闪退问题实例代码详解
2018/12/10 Javascript
微信小程序控制台提示warning:Now you can provide attr "wx:key" for a "wx:for" to improve performance解决方法
2019/02/21 Javascript
vue实现点击出现操作弹出框的示例
2020/11/05 Javascript
Python和Perl绘制中国北京跑步地图的方法
2016/03/03 Python
Python自定义类的数组排序实现代码
2016/08/28 Python
Python实现随机创建电话号码的方法示例
2018/12/07 Python
详解Python正则表达式re模块
2019/03/19 Python
使用python将最新的测试报告以附件的形式发到指定邮箱
2019/09/20 Python
Django框架创建项目的方法入门教程
2019/11/04 Python
Python 限定函数参数的类型及默认值方式
2019/12/24 Python
Python 解码Base64 得到码流格式文本实例
2020/01/09 Python
详谈tensorflow gfile文件的用法
2020/02/05 Python
Python OpenCV读取显示视频的方法示例
2020/02/20 Python
html5 canvas简单封装一个echarts实现不了的饼图
2018/06/12 HTML / CSS
Rossignol金鸡美国官网:始于1907年法国百年雪具品牌
2019/03/06 全球购物
Ashford台湾:以折扣价提供奢华的男女用表款
2019/12/04 全球购物
《将心比心》教学反思
2014/04/08 职场文书
安全生产月宣传标语
2014/10/06 职场文书
运动会闭幕式通讯稿
2015/07/18 职场文书
总经理2015中秋节致辞
2015/07/29 职场文书
Python 装饰器(decorator)常用的创建方式及解析
2022/04/24 Python
python神经网络学习 使用Keras进行回归运算
2022/05/04 Python