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 相关文章推荐
Django中实现一个高性能计数器(Counter)实例
Jul 09 Python
详解Python的Django框架中Manager方法的使用
Jul 21 Python
python利用selenium进行浏览器爬虫
Apr 25 Python
python提取log文件内容并画出图表
Jul 08 Python
django+tornado实现实时查看远程日志的方法
Aug 12 Python
python正则过滤字母、中文、数字及特殊字符方法详解
Feb 11 Python
使用wxpy实现自动发送微信消息功能
Feb 28 Python
Python如何读取、写入CSV数据
Jul 28 Python
基于Python爬取51cto博客页面信息过程解析
Aug 25 Python
python 爬虫爬取京东ps4售卖情况
Dec 18 Python
Python类型转换的魔术方法详解
Dec 23 Python
使用Python制作一个数据预处理小工具(多种操作一键完成)
Feb 07 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中return 和 exit 、break和contiue 区别与用法
2012/04/09 PHP
php全局变量和类配合使用深刻理解
2013/06/05 PHP
PHP 面向对象程序设计(oop)学习笔记(三) - 单例模式和工厂模式
2014/06/12 PHP
Javascript实例教程(19) 使用HoTMetal(1)
2006/12/23 Javascript
js中eval详解
2012/03/30 Javascript
node.js中实现同步操作的3种实现方法
2014/12/05 Javascript
javascript操作字符串的原生方法
2014/12/22 Javascript
jQuery实现查找链接文字替换属性的方法
2016/06/27 Javascript
JS实现的自动打字效果示例
2017/03/10 Javascript
JavaScript之Map和Set_动力节点Java学院整理
2017/06/29 Javascript
20170918 前端开发周报之JS前端开发必看
2017/09/18 Javascript
JS实现点击链接切换显示隐藏内容的方法
2017/10/19 Javascript
jQuery实现的点击标题文字切换字体效果示例【测试可用】
2018/04/26 jQuery
使用koa-log4管理nodeJs日志笔记的使用方法
2018/11/30 NodeJs
Angular6 发送手机验证码按钮倒计时效果实现方法
2019/01/08 Javascript
微信小程序模板消息限制实现无限制主动推送的示例代码
2019/08/27 Javascript
使用vue-cli4.0快速搭建一个项目的方法步骤
2019/12/04 Javascript
微信小程序修改checkbox的样式代码实例
2020/01/21 Javascript
完美解决vue 中多个echarts图表自适应的问题
2020/07/19 Javascript
python访问sqlserver示例
2014/02/10 Python
使用python分析git log日志示例
2014/02/27 Python
Python程序设计入门(5)类的使用简介
2014/06/16 Python
python查询mysql中文乱码问题
2014/11/09 Python
解决Pycharm中import时无法识别自己写的程序方法
2018/05/18 Python
PyTorch线性回归和逻辑回归实战示例
2018/05/22 Python
java判断三位数的实例讲解
2019/06/10 Python
python flask框架实现重定向功能示例
2019/07/02 Python
Python Web框架之Django框架cookie和session用法分析
2019/08/16 Python
python 用opencv实现霍夫线变换
2020/11/27 Python
韩国女装NO.1网店:STYLENANDA
2016/09/16 全球购物
《故都的秋》教学反思
2014/04/15 职场文书
小学优秀教育工作者事迹材料
2014/05/09 职场文书
汽车专业求职信
2014/06/05 职场文书
老干部工作先进事迹
2014/08/17 职场文书
Nginx安装完成没有生成sbin目录的解决方法
2021/03/31 Servers
win11电脑关机鼠标灯还亮怎么解决? win11关机后鼠标灯还亮解决方法
2023/01/09 数码科技