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实现QQ游戏大家来找茬辅助工具
Sep 14 Python
python处理PHP数组文本文件实例
Sep 18 Python
python BeautifulSoup设置页面编码的方法
Apr 03 Python
python爬虫实战之爬取京东商城实例教程
Apr 24 Python
使用Python写一个贪吃蛇游戏实例代码
Aug 21 Python
python 3.5实现检测路由器流量并写入txt的方法实例
Dec 17 Python
Python简单实现阿拉伯数字和罗马数字的互相转换功能示例
Apr 17 Python
Python 字符串换行的多种方式
Sep 06 Python
python实现两个dict合并与计算操作示例
Jul 01 Python
tensorflow多维张量计算实例
Feb 11 Python
Python实现动态循环输出文字功能
May 07 Python
解决python打开https出现certificate verify failed的问题
Sep 03 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
这部好评如潮的动漫 知名梗频出 但是画风劝退很多人
2020/03/08 日漫
一个oracle+PHP的查询的例子
2006/10/09 PHP
Codeigniter中mkdir创建目录遇到权限问题和解决方法
2014/07/25 PHP
PHP微信红包API接口
2015/12/05 PHP
PHP上传图片类显示缩略图功能
2016/06/30 PHP
PHP+jQuery实现即点即改功能示例
2019/02/21 PHP
基于jquery的拖动布局插件
2011/11/25 Javascript
Javascript 中的 call 和 apply使用介绍
2012/02/22 Javascript
JS localStorage实现本地缓存的方法
2013/06/22 Javascript
js 3秒后跳转页面的实现代码
2014/03/10 Javascript
扒一扒JavaScript 预解释
2015/01/28 Javascript
javascript实现图片上传前台页面
2015/08/18 Javascript
js精准的倒计时函数分享
2016/06/29 Javascript
浅析如何利用angular结合translate为项目实现国际化
2016/12/08 Javascript
jQuery简单实现遍历单选框的方法
2017/03/06 Javascript
PHP 实现一种多文件上传的方法
2017/09/20 Javascript
使用 Angular RouteReuseStrategy 缓存(路由)组件的实例代码
2019/11/01 Javascript
[02:55]2018DOTA2国际邀请赛勇士令状不朽珍藏Ⅲ饰品一览
2018/08/01 DOTA
python实现发送邮件功能代码
2017/12/14 Python
python调用c++传递数组的实例
2019/02/13 Python
python实现手机销售管理系统
2019/03/19 Python
利用Django模版生成树状结构实例代码
2019/05/19 Python
python定间隔取点(np.linspace)的实现
2019/11/27 Python
Python实现名片管理系统
2020/02/14 Python
Python统计文本词汇出现次数的实例代码
2020/02/27 Python
Jupyter Notebook远程登录及密码设置操作
2020/04/10 Python
tensorflow 大于某个值为1,小于为0的实例
2020/06/30 Python
Python调用高德API实现批量地址转经纬度并写入表格的功能
2021/01/12 Python
CSS3 @media的基本用法总结
2019/09/10 HTML / CSS
比利时买床:Beter Bed
2017/12/06 全球购物
什么是SQL Server的确定性函数和不确定性函数
2016/08/04 面试题
房屋租赁意向书
2014/04/01 职场文书
负责人任命书范本
2014/06/04 职场文书
大学生英文求职信范文
2015/03/19 职场文书
考勤制度通知
2015/04/25 职场文书
仙境之桥观后感
2015/06/16 职场文书