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中requirements.txt的一切
Mar 03 Python
Python实现的栈(Stack)
Jan 26 Python
python实现数据库跨服务器迁移
Apr 12 Python
基于DATAFRAME中元素的读取与修改方法
Jun 08 Python
python+mysql实现教务管理系统
Feb 20 Python
简单易懂Pytorch实战实例VGG深度网络
Aug 27 Python
分享一个pycharm专业版安装的永久使用方法
Sep 24 Python
文件上传服务器-jupyter 中python解压及压缩方式
Apr 22 Python
Python类成员继承重写的实现
Sep 16 Python
python 实现单例模式的5种方法
Sep 23 Python
python 窃取摄像头照片的实现示例
Jan 08 Python
Python Matplotlib绘制动画的代码详解
May 30 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
为IP查询添加GOOGLE地图功能的代码
2010/08/08 PHP
浏览器关闭后,能继续执行的php函数(ignore_user_abort)
2012/08/01 PHP
PHP把MSSQL数据导入到MYSQL的方法
2014/12/27 PHP
详解PHP数组赋值方法
2015/11/07 PHP
Thinkphp3.2.3分页使用实例解析
2016/07/28 PHP
PHP中$GLOBALS与global的区别详解
2019/03/21 PHP
Jquery 动态添加按钮实现代码
2010/05/06 Javascript
JavaScript伸缩的菜单简单示例
2013/12/03 Javascript
JS使用getComputedStyle()方法获取CSS属性值
2014/04/23 Javascript
javascript实例--教你实现扑克牌洗牌功能
2014/05/15 Javascript
jQuery左侧大图右侧小图焦点图幻灯切换代码分享
2015/08/19 Javascript
基于jquery实现百度新闻导航菜单滑动动画
2016/03/15 Javascript
jquery 实现滚动条下拉时无限加载的简单实例
2016/06/01 Javascript
基于原生js运动方式关键点的总结(推荐)
2017/10/01 Javascript
Nuxt.js实战详解
2018/01/18 Javascript
NW.js 简介与使用方法
2018/02/01 Javascript
详解js动态获取浏览器或页面等容器的宽高
2019/03/13 Javascript
解决vue打包后刷新页面报错:Unexpected token
2019/08/27 Javascript
[43:18]NB vs Infamous 2019国际邀请赛淘汰赛 败者组 BO3 第一场 8.22
2019/09/05 DOTA
Python获取网页上图片下载地址的方法
2015/03/11 Python
Python中字符串的修改及传参详解
2016/11/30 Python
Python判断变量是否为Json格式的字符串示例
2017/05/03 Python
Python实现的简单模板引擎功能示例
2017/09/02 Python
使用Python通过win32 COM打开Excel并添加Sheet的方法
2018/05/02 Python
python代理工具mitmproxy使用指南
2019/07/04 Python
pandas的连接函数concat()函数的具体使用方法
2019/07/09 Python
python中利用numpy.array()实现俩个数值列表的对应相加方法
2019/08/26 Python
利用Python pandas对Excel进行合并的方法示例
2020/11/04 Python
python将下载到本地m3u8视频合成MP4的代码详解
2020/11/24 Python
Python将QQ聊天记录生成词云的示例代码
2021/02/10 Python
巴西一家专门从事家居和装饰的连锁店:Camicado
2019/08/14 全球购物
应聘自荐信
2013/12/14 职场文书
七一党日活动总结
2014/07/08 职场文书
国富论读书笔记
2015/06/26 职场文书
MySQL窗口函数的具体使用
2021/11/17 MySQL
详解Go语言中Get/Post请求测试
2022/06/01 Golang