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使用面向对象方式创建线程实现12306售票系统
Dec 24 Python
实践Python的爬虫框架Scrapy来抓取豆瓣电影TOP250
Jan 20 Python
基于Python实现通过微信搜索功能查看谁把你删除了
Jan 27 Python
使用Python内置的模块与函数进行不同进制的数的转换
Mar 12 Python
Python标准模块--ContextManager上下文管理器的具体用法
Nov 27 Python
Python使用pip安装报错:is not a supported wheel on this platform的解决方法
Jan 23 Python
对pandas中apply函数的用法详解
Apr 10 Python
运行django项目指定IP和端口的方法
May 14 Python
Python实现的拟合二元一次函数功能示例【基于scipy模块】
May 15 Python
Python实现捕获异常发生的文件和具体行数
Apr 25 Python
python设置中文界面实例方法
Oct 27 Python
使用python将HTML转换为PDF pdfkit包(wkhtmltopdf) 的使用方法
Apr 21 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源代码数组统计count分析
2011/08/02 PHP
PHP _construct()函数讲解
2019/02/03 PHP
jQuery 性能优化指南(2)
2009/05/21 Javascript
javascript 年月日联动实现核心代码
2009/12/21 Javascript
jquery checkbox,radio是否选中的判断代码
2010/03/20 Javascript
jQuery中setTimeout的几种使用方法小结
2013/04/07 Javascript
JavaScript中如何通过arguments对象实现对象的重载
2014/05/12 Javascript
extjs 分页使用jsp传递数据示例
2014/07/29 Javascript
JavaScript 学习笔记之语句
2015/01/14 Javascript
Node.js 去掉种子(torrent)文件里的邪恶信息
2015/03/27 Javascript
javascript实现简单的分页特效
2015/08/12 Javascript
jQuery鼠标经过方形图片切换成圆边效果代码分享
2015/08/20 Javascript
Angularjs中如何使用filterFilter函数过滤
2016/02/06 Javascript
Node.js的Express框架使用上手指南
2016/03/12 Javascript
jQuery控制文本框只能输入数字和字母及使用方法
2016/05/26 Javascript
jQuery生成假加载动画效果
2016/12/01 Javascript
Angular2开发——组件规划篇
2017/03/28 Javascript
在Debian(Raspberry Pi)树莓派上安装NodeJS的教程详解
2017/09/19 NodeJs
vue.extend与vue.component的区别和联系
2018/09/19 Javascript
脚手架vue-cli工程webpack的基本用法详解
2018/09/29 Javascript
使用Vue做一个简单的todo应用的三种方式的示例代码
2018/10/20 Javascript
Easyui 去除jquery-easui tab页div自带滚动条的方法
2019/05/10 jQuery
实例分析JS中的相等性判断===、 ==和Object.is()
2019/11/17 Javascript
微信小程序自定义胶囊样式
2020/12/27 Javascript
matplotlib绘制动画代码示例
2018/01/02 Python
python: 自动安装缺失库文件的方法
2018/10/22 Python
Python while true实现爬虫定时任务
2020/06/08 Python
基于python实现生成指定大小txt文档
2020/07/20 Python
使用CSS3实现input多选框自定义样式的方法示例
2019/07/19 HTML / CSS
美术师范毕业生自荐信
2013/11/16 职场文书
我的中国梦口号
2014/06/16 职场文书
学校总务处领导班子民主生活会对照检查材料思想汇报
2014/09/27 职场文书
小学学习委员竞选稿
2015/11/20 职场文书
2016年公共机构节能宣传周活动总结
2016/04/05 职场文书
详解CSS开发过程中的20个快速提升技巧
2021/05/21 HTML / CSS
JavaScript与JQuery框架基础入门教程
2021/07/15 Javascript