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 相关文章推荐
10款最好的Web开发的 Python 框架
Mar 18 Python
用Python进行一些简单的自然语言处理的教程
Mar 31 Python
Python连接mysql数据库的正确姿势
Feb 03 Python
python 随机数使用方法,推导以及字符串,双色球小程序实例
Sep 12 Python
Python set常用操作函数集锦
Nov 15 Python
python素数筛选法浅析
Mar 19 Python
Python 新建文件夹与复制文件夹内所有内容的方法
Oct 27 Python
Python 监测文件是否更新的方法
Jun 10 Python
python修改字典键(key)的方法
Aug 05 Python
基于Python实现扑克牌面试题
Dec 11 Python
python自动统计zabbix系统监控覆盖率的示例代码
Apr 03 Python
详解用Python把PDF转为Word方法总结
Apr 27 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
给海燕B411配件机起死回生配上件
2021/03/02 无线电
excellent!――ASCII Art(由目标图象生成ascii)
2007/02/20 PHP
PHP简单获取多个checkbox值的方法
2016/06/13 PHP
简单谈谈PHP中的Reload操作
2016/12/12 PHP
Laravel核心解读之异常处理的实践过程
2019/02/24 PHP
php多进程并发编程防止出现僵尸进程的方法分析
2020/02/28 PHP
ExtJS PropertyGrid中使用Combobox选择值问题
2010/06/13 Javascript
js RuntimeObject() 获取ie里面自定义函数或者属性的集合
2010/11/23 Javascript
onmouseover和onmouseout的一些问题思考
2013/08/14 Javascript
处理及遍历XML文档DOM元素属性及方法整理
2013/08/23 Javascript
javascript实现博客园页面右下角返回顶部按钮
2015/02/22 Javascript
深入解读JavaScript中的Iterator和for-of循环
2015/07/28 Javascript
jquery+css实现动感的图片切换效果
2015/11/25 Javascript
jquery密码强度校验
2015/12/02 Javascript
javascript html5实现表单验证
2016/03/01 Javascript
Node.js编写爬虫的基本思路及抓取百度图片的实例分享
2016/03/12 Javascript
NodeJS整合银联网关支付(DEMO)
2016/11/09 NodeJs
vue实现添加标签demo示例代码
2017/01/21 Javascript
微信小程序如何像vue一样在动态绑定类名
2018/04/17 Javascript
angularjs手动识别字符串中的换行符方法
2018/10/02 Javascript
js实现简单的倒计时
2021/01/28 Javascript
python生成随机mac地址的方法
2015/03/16 Python
Python实现读取Properties配置文件的方法
2018/03/29 Python
Python中最好用的命令行参数解析工具(argparse)
2019/08/23 Python
matlab中imadjust函数的作用及应用举例
2020/02/27 Python
解决matplotlib.pyplot在Jupyter notebook中不显示图像问题
2020/04/22 Python
CSS3 3D立方体效果示例-transform也不过如此
2016/12/05 HTML / CSS
C#实现对任一张表的数据进行增,删,改,查要求,运用Webservice,体现出三层架构
2014/07/11 面试题
求职简历中个人的自我评价
2013/12/25 职场文书
食品行业求职人的自我评价
2014/01/19 职场文书
晚归检讨书
2014/02/19 职场文书
分公司经理任命书
2014/06/05 职场文书
领导干部学习“三严三实”思想汇报
2014/09/15 职场文书
神农溪导游词
2015/02/11 职场文书
农业项目投资意向书
2015/05/09 职场文书
Python基于百度AI实现抓取表情包
2021/06/27 Python