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中给List添加元素的4种方法分享
Nov 28 Python
用Python制作在地图上模拟瘟疫扩散的Gif图
Mar 31 Python
wxPython使用系统剪切板的方法
Jun 16 Python
Python每天必学之bytes字节
Jan 28 Python
python 如何快速找出两个电子表中数据的差异
May 26 Python
Python实现简单的文本相似度分析操作详解
Jun 16 Python
python 列表输出重复值以及对应的角标方法
Jun 11 Python
Python3 串口接收与发送16进制数据包的实例
Jun 12 Python
python实现信号时域统计特征提取代码
Feb 26 Python
基于Python绘制个人足迹地图
Jun 01 Python
opencv-python的RGB与BGR互转方式
Jun 02 Python
解决Pymongo insert时会自动添加_id的问题
Dec 05 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的面试题集,附我的答案和分析(一)
2006/11/19 PHP
php empty函数 使用说明
2009/08/10 PHP
PHP mkdir()无写权限的问题解决方法
2014/06/19 PHP
PHP记录搜索引擎蜘蛛访问网站足迹的方法
2015/04/15 PHP
PHP编程之设置apache虚拟目录
2016/07/08 PHP
php设计模式之备忘模式分析【星际争霸游戏案例】
2020/03/24 PHP
ThinkPHP5 框架引入 Go AOP,PHP AOP编程项目详解
2020/05/12 PHP
JavaScript Array扩展实现代码
2009/10/14 Javascript
JSON 教程 json入门学习笔记
2020/09/22 Javascript
JQuery 弹出框定位实现方法
2010/12/02 Javascript
js的Prototype属性解释及常用方法
2014/05/08 Javascript
理解javascript中的回调函数(callback)
2014/09/02 Javascript
node-webkit打包成exe文件被360误报木马的解决方法
2015/03/11 Javascript
Javascript函数式编程语言
2015/10/11 Javascript
浅析JS操作DOM的一些常用方法
2016/05/13 Javascript
js 判断一个数字是不是2的n次方幂的实例
2017/11/26 Javascript
vue 实现全选全不选的示例代码
2018/03/29 Javascript
vue项目中使用tinymce编辑器的步骤详解
2018/09/11 Javascript
vue实现移动端触屏拖拽功能
2020/08/21 Javascript
Python GAE、Django导出Excel的方法
2008/11/24 Python
深入理解Python装饰器
2016/07/27 Python
Python如何import文件夹下的文件(实现方法)
2017/01/24 Python
神经网络(BP)算法Python实现及应用
2018/04/16 Python
利用python将pdf输出为txt的实例讲解
2018/04/23 Python
使用NumPy和pandas对CSV文件进行写操作的实例
2018/06/14 Python
Python3.5 Pandas模块缺失值处理和层次索引实例详解
2019/04/23 Python
python地震数据可视化详解
2019/06/18 Python
Python语法垃圾回收机制原理解析
2020/03/25 Python
荷兰游戏商店:Allyouplay
2019/03/16 全球购物
程序员经常用到的UNIX命令
2015/04/13 面试题
js实现弹框效果
2021/03/24 Javascript
大学生简历的个人自我评价
2013/12/04 职场文书
学生请假条
2014/04/11 职场文书
小学课外阅读总结
2014/07/09 职场文书
试用期转正员工自我评价
2014/09/18 职场文书
2014年综治维稳工作总结
2014/11/17 职场文书