python 牛顿法实现逻辑回归(Logistic Regression)


Posted in Python onOctober 15, 2020

本文采用的训练方法是牛顿法(Newton Method)。

代码

import numpy as np

class LogisticRegression(object):
 """
 Logistic Regression Classifier training by Newton Method
 """

 def __init__(self, error: float = 0.7, max_epoch: int = 100):
  """
  :param error: float, if the distance between new weight and 
      old weight is less than error, the process 
      of traing will break.
  :param max_epoch: if training epoch >= max_epoch the process 
       of traing will break.
  """
  self.error = error
  self.max_epoch = max_epoch
  self.weight = None
  self.sign = np.vectorize(lambda x: 1 if x >= 0.5 else 0)

 def p_func(self, X_):
  """Get P(y=1 | x)
  :param X_: shape = (n_samples + 1, n_features)
  :return: shape = (n_samples)
  """
  tmp = np.exp(self.weight @ X_.T)
  return tmp / (1 + tmp)

 def diff(self, X_, y, p):
  """Get derivative
  :param X_: shape = (n_samples, n_features + 1) 
  :param y: shape = (n_samples)
  :param p: shape = (n_samples) P(y=1 | x)
  :return: shape = (n_features + 1) first derivative
  """
  return -(y - p) @ X_

 def hess_mat(self, X_, p):
  """Get Hessian Matrix
  :param p: shape = (n_samples) P(y=1 | x)
  :return: shape = (n_features + 1, n_features + 1) second derivative
  """
  hess = np.zeros((X_.shape[1], X_.shape[1]))
  for i in range(X_.shape[0]):
   hess += self.X_XT[i] * p[i] * (1 - p[i])
  return hess

 def newton_method(self, X_, y):
  """Newton Method to calculate weight
  :param X_: shape = (n_samples + 1, n_features)
  :param y: shape = (n_samples)
  :return: None
  """
  self.weight = np.ones(X_.shape[1])
  self.X_XT = []
  for i in range(X_.shape[0]):
   t = X_[i, :].reshape((-1, 1))
   self.X_XT.append(t @ t.T)

  for _ in range(self.max_epoch):
   p = self.p_func(X_)
   diff = self.diff(X_, y, p)
   hess = self.hess_mat(X_, p)
   new_weight = self.weight - (np.linalg.inv(hess) @ diff.reshape((-1, 1))).flatten()

   if np.linalg.norm(new_weight - self.weight) <= self.error:
    break
   self.weight = new_weight

 def fit(self, X, y):
  """
  :param X_: shape = (n_samples, n_features)
  :param y: shape = (n_samples)
  :return: self
  """
  X_ = np.c_[np.ones(X.shape[0]), X]
  self.newton_method(X_, y)
  return self

 def predict(self, X) -> np.array:
  """
  :param X: shape = (n_samples, n_features] 
  :return: shape = (n_samples]
  """
  X_ = np.c_[np.ones(X.shape[0]), X]
  return self.sign(self.p_func(X_))

测试代码

import matplotlib.pyplot as plt
import sklearn.datasets

def plot_decision_boundary(pred_func, X, y, title=None):
 """分类器画图函数,可画出样本点和决策边界
 :param pred_func: predict函数
 :param X: 训练集X
 :param y: 训练集Y
 :return: None
 """

 # Set min and max values and give it some padding
 x_min, x_max = X[:, 0].min() - .5, X[:, 0].max() + .5
 y_min, y_max = X[:, 1].min() - .5, X[:, 1].max() + .5
 h = 0.01
 # Generate a grid of points with distance h between them
 xx, yy = np.meshgrid(np.arange(x_min, x_max, h), np.arange(y_min, y_max, h))
 # Predict the function value for the whole gid
 Z = pred_func(np.c_[xx.ravel(), yy.ravel()])
 Z = Z.reshape(xx.shape)
 # Plot the contour and training examples
 plt.contourf(xx, yy, Z, cmap=plt.cm.Spectral)
 plt.scatter(X[:, 0], X[:, 1], s=40, c=y, cmap=plt.cm.Spectral)
 if title:
  plt.title(title)
 plt.show()

效果

python 牛顿法实现逻辑回归(Logistic Regression)

更多机器学习代码,请访问 https://github.com/WiseDoge/plume

以上就是python 牛顿法实现逻辑回归(Logistic Regression)的详细内容,更多关于python 逻辑回归的资料请关注三水点靠木其它相关文章!

Python 相关文章推荐
从零学Python之hello world
May 21 Python
使用django-suit为django 1.7 admin后台添加模板
Nov 18 Python
python比较两个列表大小的方法
Jul 11 Python
Python中常用操作字符串的函数与方法总结
Feb 04 Python
实例讲解Python中函数的调用与定义
Mar 14 Python
Python抓取电影天堂电影信息的代码
Apr 07 Python
Python 3中print函数的使用方法总结
Aug 08 Python
解决Django中修改js css文件但浏览器无法及时与之改变的问题
Aug 31 Python
详解使用django-mama-cas快速搭建CAS服务的实现
Oct 30 Python
python随机生成大小写字母数字混合密码(仅20行代码)
Feb 01 Python
python实现根据给定坐标点生成多边形mask的例子
Feb 18 Python
使用 django orm 写 exists 条件过滤实例
May 20 Python
PyCharm 2020.2.2 x64 下载并安装的详细教程
Oct 15 #Python
Python 实现3种回归模型(Linear Regression,Lasso,Ridge)的示例
Oct 15 #Python
Python在centos7.6上安装python3.9的详细教程(默认python版本为2.7.5)
Oct 15 #Python
Pycharm编辑器功能之代码折叠效果的实现代码
Oct 15 #Python
如何用Python 实现全连接神经网络(Multi-layer Perceptron)
Oct 15 #Python
python 实现非极大值抑制算法(Non-maximum suppression, NMS)
Oct 15 #Python
解决pip安装的第三方包在PyCharm无法导入的问题
Oct 15 #Python
You might like
PHP5 操作MySQL数据库基础代码
2009/09/29 PHP
PHP不使用递归的无限级分类简单实例
2016/11/05 PHP
万能的php分页类
2017/07/06 PHP
Jquery实现无刷新DropDownList联动实现代码
2010/03/08 Javascript
用js来定义浏览器中一个左右浮动元素相对于页面主体宽度的位置的函数
2012/01/21 Javascript
JQuery操作单选按钮以及复选按钮示例
2013/09/23 Javascript
jQuery中first()方法用法实例
2015/01/06 Javascript
简介JavaScript中的getUTCFullYear()方法的使用
2015/06/10 Javascript
js实现的简洁网页滑动tab菜单效果代码
2015/08/24 Javascript
JavaScript &amp; jQuery完美判断图片是否加载完毕
2017/01/08 Javascript
老生常谈angularjs中的$state.go
2017/04/24 Javascript
js前端实现图片懒加载(lazyload)的两种方式
2017/04/24 Javascript
利用node.js如何搭建一个简易的即时响应服务器
2017/05/28 Javascript
vue.js选中动态绑定的radio的指定项
2017/06/02 Javascript
vue+Element-ui实现分页效果实例代码详解
2018/12/10 Javascript
jQuery加PHP实现图片上传并提交的示例代码
2020/07/16 jQuery
[02:30]辉夜杯主赛事第二日胜者组半决赛 CDEC.Y赛后采访
2015/12/26 DOTA
[02:11]完美世界DOTA2联赛10月28日赛事精彩集锦:来吧展示实力强劲
2020/10/29 DOTA
python获取从命令行输入数字的方法
2015/04/29 Python
Python实现读取文件最后n行的方法
2017/02/23 Python
Python实现的当前时间多加一天、一小时、一分钟操作示例
2018/05/21 Python
Python实现App自动签到领取积分功能
2018/09/29 Python
django 单表操作实例详解
2019/07/30 Python
Python pandas RFM模型应用实例详解
2019/11/20 Python
python实现坦克大战
2020/04/24 Python
Python中Selenium模块的使用详解
2020/10/09 Python
python基于pexpect库自动获取日志信息
2021/02/01 Python
python编写扎金花小程序的实例代码
2021/02/23 Python
HTML5 Canvas 绘图——使用 Canvas 绘制图形图文教程 使用html5 canvas 绘制精美的图
2015/08/31 HTML / CSS
工程班组长岗位职责
2013/12/30 职场文书
公司优秀员工获奖感言
2014/08/14 职场文书
2014年建筑工程工作总结
2014/12/03 职场文书
趵突泉导游词
2015/02/03 职场文书
美术教师求职信范文
2015/03/20 职场文书
mysql sql常用语句大全
2022/06/21 MySQL
Flink 侧流输出源码示例解析
2022/09/23 Servers