python实现逻辑回归的方法示例


Posted in Python onMay 02, 2017

本文实现的原理很简单,优化方法是用的梯度下降。后面有测试结果。

先来看看实现的示例代码:

# coding=utf-8
from math import exp

import matplotlib.pyplot as plt
import numpy as np
from sklearn.datasets.samples_generator import make_blobs


def sigmoid(num):
 '''

 :param num: 待计算的x
 :return: sigmoid之后的数值
 '''
 if type(num) == int or type(num) == float:
  return 1.0 / (1 + exp(-1 * num))
 else:
  raise ValueError, 'only int or float data can compute sigmoid'


class logistic():
 def __init__(self, x, y): 
  if type(x) == type(y) == list:
   self.x = np.array(x)
   self.y = np.array(y)
  elif type(x) == type(y) == np.ndarray:
   self.x = x
   self.y = y
  else:
   raise ValueError, 'input data error'

 def sigmoid(self, x):
  '''

  :param x: 输入向量
  :return: 对输入向量整体进行simgoid计算后的向量结果
  '''
  s = np.frompyfunc(lambda x: sigmoid(x), 1, 1)
  return s(x)

 def train_with_punish(self, alpha, errors, punish=0.0001):
  '''

  :param alpha: alpha为学习速率
  :param errors: 误差小于多少时停止迭代的阈值
  :param punish: 惩罚系数
  :param times: 最大迭代次数
  :return:
  '''
  self.punish = punish
  dimension = self.x.shape[1]
  self.theta = np.random.random(dimension)
  compute_error = 100000000
  times = 0
  while compute_error > errors:
   res = np.dot(self.x, self.theta)
   delta = self.sigmoid(res) - self.y
   self.theta = self.theta - alpha * np.dot(self.x.T, delta) - punish * self.theta # 带惩罚的梯度下降方法
   compute_error = np.sum(delta)
   times += 1

 def predict(self, x):
  '''

  :param x: 给入新的未标注的向量
  :return: 按照计算出的参数返回判定的类别
  '''
  x = np.array(x)
  if self.sigmoid(np.dot(x, self.theta)) > 0.5:
   return 1
  else:
   return 0


def test1():
 '''
 用来进行测试和画图,展现效果
 :return:
 '''
 x, y = make_blobs(n_samples=200, centers=2, n_features=2, random_state=0, center_box=(10, 20))
 x1 = []
 y1 = []
 x2 = []
 y2 = []
 for i in range(len(y)):
  if y[i] == 0:
   x1.append(x[i][0])
   y1.append(x[i][1])
  elif y[i] == 1:
   x2.append(x[i][0])
   y2.append(x[i][1])
 # 以上均为处理数据,生成出两类数据
 p = logistic(x, y)
 p.train_with_punish(alpha=0.00001, errors=0.005, punish=0.01) # 步长是0.00001,最大允许误差是0.005,惩罚系数是0.01
 x_test = np.arange(10, 20, 0.01)
 y_test = (-1 * p.theta[0] / p.theta[1]) * x_test
 plt.plot(x_test, y_test, c='g', label='logistic_line')
 plt.scatter(x1, y1, c='r', label='positive')
 plt.scatter(x2, y2, c='b', label='negative')
 plt.legend(loc=2)
 plt.title('punish value = ' + p.punish.__str__())
 plt.show()


if __name__ == '__main__':
 test1()

运行结果如下图

python实现逻辑回归的方法示例

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流,谢谢大家对三水点靠木的支持。

Python 相关文章推荐
在Docker上部署Python的Flask框架的教程
Apr 08 Python
python脚本监控docker容器
Apr 27 Python
Python爬取京东的商品分类与链接
Aug 26 Python
利用Python批量生成任意尺寸的图片
Aug 29 Python
python中的闭包函数
Feb 09 Python
python安装twisted的问题解析
Aug 21 Python
Python设置matplotlib.plot的坐标轴刻度间隔以及刻度范围
Jun 25 Python
keras 自定义loss损失函数,sample在loss上的加权和metric详解
May 23 Python
Python爬虫中Selenium实现文件上传
Dec 04 Python
PyTorch 如何检查模型梯度是否可导
Jun 05 Python
只用Python就可以制作的简单词云
Jun 07 Python
Python 的演示平台支持 WSGI 接口的应用
Apr 20 Python
pycharm中连接mysql数据库的步骤详解
May 02 #Python
Python多线程实现同步的四种方式
May 02 #Python
Python之Web框架Django项目搭建全过程
May 02 #Python
python3实现抓取网页资源的 N 种方法
May 02 #Python
Pycharm学习教程(2) 代码风格
May 02 #Python
Pycharm学习教程(1) 定制外观
May 02 #Python
pycharm安装图文教程
May 02 #Python
You might like
构建简单的Webmail系统
2006/10/09 PHP
PHP的PDO预处理语句与存储过程
2019/01/27 PHP
PHP下用Swoole实现Actor并发模型的方法
2019/06/12 PHP
jquery 日期分离成年月日的代码
2010/05/14 Javascript
删除条目时弹出的确认对话框
2014/06/05 Javascript
javascript格式化json显示实例分析
2015/04/21 Javascript
javascript制作的滑动图片菜单
2015/05/15 Javascript
JS实现Fisheye效果动感放大菜单代码
2015/10/21 Javascript
微信小程序  audio音频播放详解及实例
2016/11/02 Javascript
js canvas仿支付宝芝麻信用分仪表盘
2016/11/16 Javascript
js数字舍入误差以及解决方法(必看篇)
2017/02/28 Javascript
react.js CMS 删除功能的实现方法
2017/04/17 Javascript
详解Angular5 路由传参的3种方法
2018/04/28 Javascript
vue 实现Web端的定位功能 获取经纬度
2019/08/08 Javascript
Vue实现base64编码图片间的切换功能
2019/12/04 Javascript
使用PreloadJS加载图片资源的基础方法详解
2020/02/03 Javascript
[02:28]DOTA2 2015国际邀请赛中国区预选赛首日现场百态
2015/05/26 DOTA
[55:39]DOTA2-DPC中国联赛 正赛 VG vs LBZS BO3 第二场 1月19日
2021/03/11 DOTA
python使用os模块的os.walk遍历文件夹示例
2014/01/27 Python
python的构建工具setup.py的方法使用示例
2017/10/23 Python
琳达·法罗眼镜英国官网:Linda Farrow英国
2021/01/19 全球购物
我有一个char * 型指针正巧指向一些int 型变量, 我想跳过它们。 为什么如下的代码((int *)p)++; 不行?
2013/05/09 面试题
北京一家公司的.net开发工程师笔试题
2012/04/17 面试题
Delphi工程师笔试题
2013/09/21 面试题
汽车专业人才自我鉴定范文
2013/12/29 职场文书
小学家长评语大全
2014/04/16 职场文书
建筑工地大门标语
2014/06/18 职场文书
多媒体教室标语
2014/06/26 职场文书
大学生求职信例文
2014/06/29 职场文书
学习考察心得体会
2014/09/04 职场文书
项目合作协议书
2014/09/23 职场文书
2014年仓库管理工作总结
2014/12/17 职场文书
校友会致辞
2015/07/30 职场文书
创业项目(超低成本创业项目)
2019/08/16 职场文书
JavaScript 数组去重详解
2021/09/15 Javascript
经典《舰娘》游改全新动画预告 预定11月开播
2022/04/01 日漫