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 相关文章推荐
python实现ip查询示例
Mar 26 Python
Django中模版的子目录与include标签的使用方法
Jul 16 Python
Python的语言类型(详解)
Jun 24 Python
python中将一个全部为int的list 转化为str的list方法
Apr 09 Python
Python魔法方法功能与用法简介
Apr 04 Python
Python内置random模块生成随机数的方法
May 31 Python
python 计算积分图和haar特征的实例代码
Nov 20 Python
基于python cut和qcut的用法及区别详解
Nov 22 Python
python3 Scrapy爬虫框架ip代理配置的方法
Jan 17 Python
python字符串,元组,列表,字典互转代码实例详解
Feb 14 Python
python爬取音频下载的示例代码
Oct 19 Python
Jupyter notebook命令和编辑模式常用快捷键汇总
Nov 17 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
php 求质素(素数) 的实现代码
2011/04/12 PHP
php引用返回与取消引用的详解
2013/06/08 PHP
php object转数组示例
2014/01/15 PHP
thinkphp文件引用与分支结构用法实例
2014/11/26 PHP
php解析xml 的四种简单方法(附实例)
2016/07/11 PHP
Thinkphp 中 distinct 的用法解析
2016/12/14 PHP
PHP基于自定义类随机生成姓名的方法示例
2017/08/05 PHP
Ext JS Grid在IE6 下宽度的问题解决方法
2009/02/15 Javascript
javascript动态加载实现方法一
2012/08/22 Javascript
jquery文本框中的事件应用以输入邮箱为例
2014/05/06 Javascript
滚动条响应鼠标滑轮事件实现上下滚动的js代码
2014/06/30 Javascript
JS加载器如何动态加载外部js文件
2016/05/26 Javascript
微信小程序 rich-text的使用方法
2017/08/04 Javascript
详解bootstrap用dropdown-menu实现上下文菜单
2017/09/22 Javascript
讲解vue-router之命名路由和命名视图
2018/05/28 Javascript
浅谈vue项目打包优化策略
2018/09/29 Javascript
微信小程序如何获取用户收货地址
2018/11/27 Javascript
jqGrid表格底部汇总、合计行footerrow处理
2019/08/21 Javascript
解决vuex刷新数据消失问题
2020/11/12 Javascript
[02:08]DOTA2英雄基础教程 马格纳斯
2014/01/17 DOTA
Python爬虫工程师面试问题总结
2018/03/22 Python
python如何使用unittest测试接口
2018/04/04 Python
详解python-图像处理(映射变换)
2019/03/22 Python
Python Tornado批量上传图片并显示功能
2020/03/26 Python
使用python求斐波那契数列中第n个数的值示例代码
2020/07/26 Python
Tessabit日本:集世界奢侈品和设计师品牌的意大利精品买手店
2020/01/07 全球购物
芭比波朗加拿大官方网站:Bobbi Brown Cosmetics CA
2020/11/05 全球购物
经典婚礼主持开场白
2014/03/13 职场文书
公司贷款承诺书
2014/05/30 职场文书
应届大专生自荐书
2014/06/16 职场文书
活动总结格式
2014/08/30 职场文书
2015幼儿园庆元旦活动方案
2014/12/09 职场文书
检讨书格式
2015/01/23 职场文书
交通事故代理词范文
2015/05/23 职场文书
80行代码写一个Webpack插件并发布到npm
2021/05/24 Javascript
React forwardRef的使用方法及注意点
2021/06/13 Javascript