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爬取国外天气预报网站的方法
Jul 10 Python
Python设置Socket代理及实现远程摄像头控制的例子
Nov 13 Python
利用Python-iGraph如何绘制贴吧/微博的好友关系图详解
Nov 02 Python
pip命令无法使用的解决方法
Jun 12 Python
Python 获取div标签中的文字实例
Dec 20 Python
Python hashlib模块实例使用详解
Dec 24 Python
python安装读取grib库总结(推荐)
Jun 24 Python
详解Python 最短匹配模式
Jul 29 Python
python 解决pycharm运行py文件只有unittest选项的问题
Sep 01 Python
Python生成pdf目录书签的实例方法
Oct 29 Python
python批量生成身份证号到Excel的两种方法实例
Jan 14 Python
Python读写yaml文件
Mar 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的SQL注入实现(测试代码安全不错)
2011/02/27 PHP
Codeigniter注册登录代码示例
2014/06/12 PHP
php中socket的用法详解
2014/10/24 PHP
php遍历类中包含的所有元素的方法
2015/05/12 PHP
PHP环境搭建(php+Apache+mysql)
2016/11/14 PHP
PHP 实现 JSON 数据的编码和解码操作详解
2020/04/22 PHP
JavaScript 中的事件教程
2007/04/05 Javascript
css图片自适应大小
2007/11/28 Javascript
THREE.JS入门教程(5)你应当知道的十件事
2013/01/24 Javascript
Js 去掉字符串中的空格(实现代码)
2013/11/19 Javascript
jquery中JSON的解析方式
2015/03/16 Javascript
avalonjs制作响应式瀑布流特效
2015/05/06 Javascript
黑帽seo劫持程序,js劫持搜索引擎代码
2015/09/15 Javascript
jQuery+CSS3折叠卡片式下拉列表框实现效果
2015/11/02 Javascript
基于JavaScript的操作系统你听说过吗?
2016/01/28 Javascript
bootstrap PrintThis打印插件使用详解
2017/02/20 Javascript
微信小程序自定义弹窗实现详解(可通用)
2019/07/04 Javascript
解决Element中el-date-picker组件不回填的情况
2020/11/07 Javascript
vue使用require.context实现动态注册路由
2020/12/25 Vue.js
原生js实现下拉框选择组件
2021/01/20 Javascript
[05:08]第一届“网鱼杯”DOTA2比赛精彩集锦
2014/09/05 DOTA
Python中的字典与成员运算符初步探究
2015/10/13 Python
利用django如何解析用户上传的excel文件
2017/07/24 Python
Python实现采用进度条实时显示处理进度的方法
2017/12/19 Python
python多线程分块读取文件
2019/08/29 Python
Python内置异常类型全面汇总
2020/05/28 Python
Django使用django-simple-captcha做验证码的实现示例
2021/01/07 Python
html5表单及新增的改良元素详解
2016/06/07 HTML / CSS
HTML5 新标签全部总汇(推荐)
2016/06/13 HTML / CSS
个人委托书怎么写
2014/09/17 职场文书
优秀学生干部事迹材料
2014/12/24 职场文书
开除通知书范本
2015/04/25 职场文书
《领导干部从政道德启示录》学习心得体会
2016/01/20 职场文书
python关于集合的知识案例详解
2021/05/30 Python
CSS实现渐变色边框(Gradient borders)的5种方法
2022/03/25 HTML / CSS
在Python 中将类对象序列化为JSON
2022/04/06 Python