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下函数参数的传递(参数带星号的说明)
Sep 19 Python
python黑魔法之参数传递
Feb 12 Python
Python实现加载及解析properties配置文件的方法
Mar 29 Python
使用Python实现从各个子文件夹中复制指定文件的方法
Oct 25 Python
Django 通过JS实现ajax过程详解
Jul 30 Python
python多进程间通信代码实例
Sep 30 Python
Python3如何判断三角形的类型
Apr 12 Python
matplotlib设置颜色、标记、线条,让你的图像更加丰富(推荐)
Sep 25 Python
pycharm 多行批量缩进和反向缩进快捷键介绍
Jan 15 Python
只需要100行Python代码就可以实现的贪吃蛇小游戏
May 27 Python
用Python实现屏幕截图详解
Jan 22 Python
python 闭包函数详细介绍
Apr 19 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
图象函数中的中文显示
2006/10/09 PHP
cache_lite试用
2007/02/14 PHP
木翼下载系统中说明的PHP安全配置方法
2007/06/16 PHP
PHP中可以自动分割查询字符的Parse_str函数使用示例
2014/07/25 PHP
php技巧小结【推荐】
2017/01/19 PHP
laravel Model 执行事务的实现
2019/10/10 PHP
JS和Jquery获取和修改label的值的示例代码
2014/01/15 Javascript
JS中判断null、undefined与NaN的方法
2014/03/26 Javascript
JavaScript中使用Callback控制流程介绍
2015/03/16 Javascript
js+css绘制颜色动态变化的圈中圈效果
2016/01/27 Javascript
基于jquery实现三级下拉菜单
2016/05/10 Javascript
JS实现登录页面记住密码和enter键登录方法推荐
2016/05/10 Javascript
使用vue.js制作分页组件
2016/06/27 Javascript
JS中对Cookie的操作详解
2016/08/05 Javascript
AngularJs中Bootstrap3 datetimepicker使用实例
2016/12/13 Javascript
数组Array的一些方法(总结)
2017/02/17 Javascript
nodejs 终端打印进度条实例代码
2017/04/22 NodeJs
使用vue官方提供的模板vue-cli搭建一个helloWorld案例分析
2018/01/16 Javascript
详解Vue3.0 前的 TypeScript 最佳入门实践
2019/06/18 Javascript
layui当点击文本框时弹出选择框,显示选择内容的例子
2019/09/02 Javascript
Python 自动补全(vim)
2014/11/30 Python
python bottle框架支持jquery ajax的RESTful风格的PUT和DELETE方法
2017/05/24 Python
Python实现单词翻译功能
2017/06/06 Python
一百多行python代码实现抢票助手
2018/09/25 Python
详解用python写网络爬虫-爬取新浪微博评论
2019/05/10 Python
VS2019+python3.7+opencv4.1+tensorflow1.13配置详解
2020/04/16 Python
Python selenium爬取微信公众号文章代码详解
2020/08/12 Python
python实现测试工具(二)——简单的ui测试工具
2020/10/19 Python
PyQt实现计数器的方法示例
2021/01/18 Python
一款恶搞头像特效的制作过程 利用css3和jquery
2014/11/21 HTML / CSS
CNC数控操作工岗位职责
2013/11/19 职场文书
团支部建设方案
2014/05/02 职场文书
美食节策划方案
2014/05/26 职场文书
企业法人代表任命书
2014/06/06 职场文书
党的群众路线专项整治方案
2014/11/03 职场文书
世界各国短波电台对东亚播送时间频率表(SW)
2021/06/28 无线电