python实现logistic分类算法代码


Posted in Python onFebruary 28, 2020

最近在看吴恩达的机器学习课程,自己用python实现了其中的logistic算法,并用梯度下降获取最优值。

logistic分类是一个二分类问题,而我们的线性回归函数

python实现logistic分类算法代码

的取值在负无穷到正无穷之间,对于分类问题而言,我们希望假设函数的取值在0~1之间,因此logistic函数的假设函数需要改造一下

python实现logistic分类算法代码

由上面的公式可以看出,0 < h(x) < 1,这样,我们可以以1/2为分界线

python实现logistic分类算法代码

cost function可以这样定义

python实现logistic分类算法代码

其中,m是样本的数量,初始时θ可以随机给定一个初始值,算出一个初始的J(θ)值,再执行梯度下降算法迭代,直到达到最优值,我们知道,迭代的公式主要是每次减少一个偏导量

python实现logistic分类算法代码

如果将J(θ)代入化简之后,我们发现可以得到和线性回归相同的迭代函数

python实现logistic分类算法代码

按照这个迭代函数不断调整θ的值,直到两次J(θ)的值差值不超过某个极小的值之后,即认为已经达到最优解,这其实只是一个相对较优的解,并不是真正的最优解。 其中,α是学习速率,学习速率越大,就能越快达到最优解,但是学习速率过大可能会让惩罚函数最终无法收敛,整个过程python的实现如下

import math

ALPHA = 0.3
DIFF = 0.00001


def predict(theta, data):
  results = []
  for i in range(0, data.__len__()):
    temp = 0
    for j in range(1, theta.__len__()):
      temp += theta[j] * data[i][j - 1]
    temp = 1 / (1 + math.e ** (-1 * (temp + theta[0])))
    results.append(temp)
  return results


def training(training_data):
  size = training_data.__len__()
  dimension = training_data[0].__len__()
  hxs = []
  theta = []
  for i in range(0, dimension):
    theta.append(1)
  initial = 0
  for i in range(0, size):
    hx = theta[0]
    for j in range(1, dimension):
      hx += theta[j] * training_data[i][j]
    hx = 1 / (1 + math.e ** (-1 * hx))
    hxs.append(hx)
    initial += (-1 * (training_data[i][0] * math.log(hx) + (1 - training_data[i][0]) * math.log(1 - hx)))
  initial /= size
  iteration = initial
  initial = 0
  counts = 1
  while abs(iteration - initial) > DIFF:
    print("第", counts, "次迭代, diff=", abs(iteration - initial))
    initial = iteration
    gap = 0
    for j in range(0, size):
      gap += (hxs[j] - training_data[j][0])
    theta[0] = theta[0] - ALPHA * gap / size
    for i in range(1, dimension):
      gap = 0
      for j in range(0, size):
        gap += (hxs[j] - training_data[j][0]) * training_data[j][i]
      theta[i] = theta[i] - ALPHA * gap / size
      for m in range(0, size):
        hx = theta[0]
        for j in range(1, dimension):
          hx += theta[j] * training_data[i][j]
        hx = 1 / (1 + math.e ** (-1 * hx))
        hxs[i] = hx
        iteration += -1 * (training_data[i][0] * math.log(hx) + (1 - training_data[i][0]) * math.log(1 - hx))
      iteration /= size
    counts += 1
  print('training done,theta=', theta)
  return theta


if __name__ == '__main__':
  training_data = [[1, 1, 1, 1, 0, 0], [1, 1, 0, 1, 0, 0], [1, 0, 1, 0, 0, 0], [0, 0, 0, 0, 1, 1], [0, 1, 0, 0, 0, 1],
        [0, 0, 0, 0, 1, 1]]
  test_data = [[0, 1, 0, 0, 0], [0, 0, 0, 0, 1]]
  theta = training(training_data)
  res = predict(theta, test_data)
  print(res)

运行结果如下

python实现logistic分类算法代码

以上这篇python实现logistic分类算法代码就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python函数的5种参数详解
Feb 24 Python
Python 中pandas.read_excel详细介绍
Jun 23 Python
Python实现好友全头像的拼接实例(推荐)
Jun 24 Python
Python中列表list以及list与数组array的相互转换实现方法
Sep 22 Python
python中使用正则表达式的后向搜索肯定模式(推荐)
Nov 11 Python
python使用mysql的两种使用方式
Mar 07 Python
PyQt5每天必学之滑块控件QSlider
Apr 20 Python
python实现复制大量文件功能
Aug 31 Python
在tensorflow下利用plt画论文中loss,acc等曲线图实例
Jun 15 Python
python 使用多线程创建一个Buffer缓存器的实现思路
Jul 02 Python
解决TensorFlow调用Keras库函数存在的问题
Jul 06 Python
教你如何用python开发一款数字推盘小游戏
Apr 14 Python
python GUI库图形界面开发之PyQt5打印控件QPrinter详细使用方法与实例
Feb 28 #Python
使用sklearn的cross_val_score进行交叉验证实例
Feb 28 #Python
彻底搞懂 python 中文乱码问题(深入分析)
Feb 28 #Python
python GUI库图形界面开发之PyQt5状态栏控件QStatusBar详细使用方法实例
Feb 28 #Python
python sklearn包——混淆矩阵、分类报告等自动生成方式
Feb 28 #Python
python GUI库图形界面开发之PyQt5计数器控件QSpinBox详细使用方法与实例
Feb 28 #Python
python GUI库图形界面开发之PyQt5切换按钮控件QPushButton详细使用方法与实例
Feb 28 #Python
You might like
Smarty模板引擎缓存机制详解
2016/05/23 PHP
laravel 实现划分admin和home 模块分组
2019/10/15 PHP
EXTJS记事本 当CompositeField遇上RowEditor
2011/07/31 Javascript
深入理解JavaScript系列(44):设计模式之桥接模式详解
2015/03/04 Javascript
JavaScript中的立即执行函数表达式介绍
2015/03/15 Javascript
JavaSciprt中处理字符串之sup()方法的使用教程
2015/06/08 Javascript
jQuery flip插件实现的翻牌效果示例【附demo源码下载】
2016/09/20 Javascript
javascript中活灵活现的Array对象详解
2016/11/30 Javascript
深入理解Nodejs Global 模块
2017/06/03 NodeJs
利用jquery去掉时光轴头尾部线条的方法实例
2017/06/16 jQuery
ES6深入理解之“let”能替代”var“吗?
2017/06/28 Javascript
javascript兼容性(实例讲解)
2017/08/15 Javascript
VUE引入第三方js包及调用方法讲解
2019/03/01 Javascript
浅谈redux, koa, express 中间件实现对比解析
2019/05/23 Javascript
JS使用cookie保存用户登录信息操作示例
2019/05/30 Javascript
layui layer select 选择被遮挡的解决方法
2019/09/21 Javascript
浅谈Vue static 静态资源路径 和 style问题
2020/11/07 Javascript
[03:05]《我与DAC》之xiao8:DAC与BG
2018/03/27 DOTA
python备份文件的脚本
2008/08/11 Python
使用Python编写一个模仿CPU工作的程序
2015/04/16 Python
python 设置文件编码格式的实现方法
2017/12/21 Python
简单了解Python matplotlib线的属性
2019/06/29 Python
python通过对字典的排序,对json字段进行排序的实例
2020/02/27 Python
Django Auth用户认证组件实现代码
2020/10/13 Python
python中温度单位转换的实例方法
2020/12/27 Python
CSS3实现跳动的动画效果
2016/09/12 HTML / CSS
详解Canvas实用库Fabric.js使用手册
2019/01/07 HTML / CSS
goodhealth官方海外旗舰店:新西兰国民营养师
2017/12/15 全球购物
娇韵诗法国官网:Clarins法国
2019/01/29 全球购物
毕业生就业推荐信范文
2013/12/01 职场文书
青年创业培训欢迎词
2014/01/10 职场文书
长安大学毕业生自我鉴定
2014/01/17 职场文书
《长城》教学反思
2014/02/14 职场文书
《东方明珠》教学反思
2014/04/20 职场文书
离婚起诉书范本
2015/05/18 职场文书
爱国主义电影观后感
2015/06/18 职场文书