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获取豆瓣电影简介代码分享
Jan 16 Python
Python中的错误和异常处理简单操作示例【try-except用法】
Jul 25 Python
Python装饰器用法实例总结
May 26 Python
[原创]Python入门教程4. 元组基本操作
Oct 31 Python
selenium设置proxy、headers的方法(phantomjs、Chrome、Firefox)
Nov 29 Python
python 返回一个列表中第二大的数方法
Jul 09 Python
python 实现简单的FTP程序
Dec 27 Python
python使用SQLAlchemy操作MySQL
Jan 02 Python
pytorch梯度剪裁方式
Feb 04 Python
关于keras中keras.layers.merge的用法说明
May 23 Python
Python脚本破解压缩文件口令实例教程(zipfile)
Jun 14 Python
解决Alexnet训练模型在每个epoch中准确率和loss都会一升一降问题
Jun 17 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
php中使用__autoload()自动加载未定义类的实现代码
2013/02/06 PHP
解析dedeCMS验证码的实现代码
2013/06/07 PHP
PHP+Ajax检测用户名或邮件注册时是否已经存在实例教程
2014/08/23 PHP
PHP执行linux命令常用函数汇总
2016/02/02 PHP
PHP中利用sleep函数实现定时执行功能实现代码
2016/08/25 PHP
php开发最强大的IDE编辑的phpstorm 2020.2配置Xdebug调试的详细教程
2020/08/17 PHP
javascript IE中的DOM ready应用技巧
2008/07/23 Javascript
jquery模拟按下回车实现代码
2011/09/20 Javascript
简单介绍JavaScript的变量和数据类型
2015/06/03 Javascript
基于javascript如何传递特殊字符
2015/11/30 Javascript
javascript编程异常处理实例小结
2015/11/30 Javascript
jquery实现具有收缩功能的垂直导航菜单
2016/02/16 Javascript
Javascript blur与click冲突解决办法
2017/01/09 Javascript
Vue实现路由跳转和嵌套
2017/06/20 Javascript
Vue中的数据监听和数据交互案例解析
2017/07/12 Javascript
详解从零搭建 vue2 vue-router2 webpack3 工程
2017/11/22 Javascript
使用mock.js随机数据和使用express输出json接口的实现方法
2018/01/07 Javascript
解决vue-cli + webpack 新建项目出错的问题
2018/03/20 Javascript
原生js封装的ajax方法示例
2018/08/02 Javascript
React+Webpack快速上手指南(小结)
2018/08/15 Javascript
使用vue脚手架(vue-cli)搭建一个项目详解
2019/05/09 Javascript
解决vue的过渡动画无法正常实现问题
2019/10/31 Javascript
Vue实现移动端拖拽交换位置
2020/07/29 Javascript
vue 实现把路由单独分离出来
2020/08/13 Javascript
pyramid配置session的方法教程
2013/11/27 Python
Python实现对excel文件列表值进行统计的方法
2015/07/25 Python
Pythont特殊语法filter,map,reduce,apply使用方法
2016/02/27 Python
python合并同类型excel表格的方法
2018/04/01 Python
numpy 对矩阵中Nan的处理:采用平均值的方法
2018/10/30 Python
python实现网页自动签到功能
2019/01/21 Python
对python生成业务报表的实例详解
2019/02/03 Python
python将pandas datarame保存为txt文件的实例
2019/02/12 Python
Django实现分页显示效果
2019/10/31 Python
使用python修改文件并立即写回到原始位置操作(inplace读写)
2020/06/28 Python
师德师风自查总结
2014/10/14 职场文书
营销计划书范文
2015/01/17 职场文书