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队列通信:rabbitMQ的使用(实例讲解)
Dec 22 Python
Python爬虫框架Scrapy实例代码
Mar 04 Python
pycharm下查看python的变量类型和变量内容的方法
Jun 26 Python
python读取几个G的csv文件方法
Jan 07 Python
pytorch自定义二值化网络层方式
Jan 07 Python
Python2与Python3的区别详解
Feb 09 Python
Windows 下更改 jupyterlab 默认启动位置的教程详解
May 18 Python
解决Python paramiko 模块远程执行ssh 命令 nohup 不生效的问题
Jul 14 Python
pycharm 代码自动补全的实现方法(图文)
Sep 18 Python
Django Model层F,Q对象和聚合函数原理解析
Nov 12 Python
PyTorch 实现L2正则化以及Dropout的操作
May 27 Python
如何判断pytorch是否支持GPU加速
Jun 01 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
解决了Ajax、MySQL 和 Zend Framework 的乱码问题
2009/03/03 PHP
apache+php完美解决301重定向的两种方法
2011/06/08 PHP
PHP的switch判断语句的“高级”用法详解
2014/10/01 PHP
php版微信js-sdk支付接口类用法示例
2016/10/12 PHP
PHP正则之正向预查与反向预查讲解与实例
2020/04/06 PHP
设置下载不需要倒计时cookie(倒计时代码)
2008/11/19 Javascript
JavaScript asp.net 获取当前超链接中的文本
2009/04/14 Javascript
新浪微博字数统计 textarea字数统计实现代码
2011/08/28 Javascript
javascript 判断中文字符长度的函数代码
2012/08/27 Javascript
js history对象简单实现返回和前进
2013/10/30 Javascript
webapp框架AngularUI的demo改造之路
2014/12/21 Javascript
浅谈Nodejs观察者模式
2015/10/13 NodeJs
HTML5canvas 绘制一个圆环形的进度表示实例
2016/12/16 Javascript
React实现点击删除列表中对应项
2017/01/10 Javascript
详解webpack进阶之插件篇
2017/07/06 Javascript
防止页面url缓存中ajax中post请求的处理方法
2017/10/10 Javascript
angularJs 表格添加删除修改查询方法
2018/02/27 Javascript
vue写一个组件
2018/04/09 Javascript
vue.js过滤器+ajax实现事件监听及后台php数据交互实例
2018/05/22 Javascript
Python实现扫描指定目录下的子目录及文件的方法
2014/07/16 Python
wxPython使用系统剪切板的方法
2015/06/16 Python
Python自动生产表情包
2017/03/17 Python
python如何实现int函数的方法示例
2018/02/19 Python
Python操作mongodb的9个步骤
2018/06/04 Python
python3实现zabbix告警推送钉钉的示例
2019/02/20 Python
python多线程扫描端口(线程池)
2019/09/04 Python
巧用CSS3 border实现图片遮罩效果代码
2012/04/09 HTML / CSS
CSS3 不定高宽垂直水平居中的几种方式
2020/03/26 HTML / CSS
英国老牌潮鞋店:Offspring
2019/08/19 全球购物
会计专业自荐信
2013/12/02 职场文书
小学安全教育月活动总结
2014/07/07 职场文书
4s店活动策划方案
2014/08/25 职场文书
2015年世界环境日演讲稿
2015/03/18 职场文书
《卧薪尝胆》读后感3篇
2019/12/26 职场文书
opencv读取视频并保存图像的方法
2021/06/04 Python
Python测试框架pytest核心库pluggy详解
2022/08/05 Golang