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中input和raw_input的一点区别
Oct 21 Python
python实现自动更换ip的方法
May 05 Python
python利用requests库进行接口测试的方法详解
Jul 06 Python
python matplotlib画图库学习绘制常用的图
Mar 19 Python
python启动应用程序和终止应用程序的方法
Jun 28 Python
如何用Python做一个微信机器人自动拉群
Jul 03 Python
python绘制多个子图的实例
Jul 07 Python
python障碍式期权定价公式
Jul 19 Python
Python  Django 母版和继承解析
Aug 09 Python
python中的global关键字的使用方法
Aug 20 Python
python分别打包出32位和64位应用程序
Feb 18 Python
Python super()函数使用及多重继承
May 06 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的FTP学习(四)
2006/10/09 PHP
jQuery+php实现ajax文件即时上传的详解
2013/06/17 PHP
php实现保存submit内容之后禁止刷新
2014/03/19 PHP
php清空(删除)指定目录下的文件,不删除目录文件夹的实现代码
2014/09/04 PHP
PHP实现QQ、微信和支付宝三合一收款码实例代码
2018/02/19 PHP
详解PHP素材图片上传、下载功能
2019/04/12 PHP
laravel5表单唯一验证的实例代码
2019/09/30 PHP
JQquery的一些使用心得分享
2012/08/01 Javascript
jQuery插件 selectToSelect使用方法
2013/10/02 Javascript
javascript实现的平方米、亩、公顷单位换算小程序
2014/08/11 Javascript
浅析javascript的间隔调用和延时调用
2014/11/12 Javascript
javascript父子页面通讯实例详解
2015/07/17 Javascript
全面解析Bootstrap表单使用方法(表单按钮)
2015/11/24 Javascript
xcode中获取js文件的路径方法(推荐)
2016/11/05 Javascript
BootStrap 图标icon符号图标glyphicons不正常显示的快速解决办法
2016/12/08 Javascript
React组件的三种写法总结
2017/01/12 Javascript
JAVA中截取字符串substring用法详解
2017/04/14 Javascript
js判断用户是输入的地址请求的路径(实例讲解)
2017/07/18 Javascript
使用 electron 实现类似新版 QQ 的登录界面效果(阴影、背景动画、窗体3D翻转)
2018/10/23 Javascript
javascript中函数的写法实例代码详解
2018/10/28 Javascript
VUEX 数据持久化,刷新后重新获取的例子
2019/11/12 Javascript
vue-router为激活的路由设置样式操作
2020/07/18 Javascript
Python高效编程技巧
2013/01/07 Python
python实现将html表格转换成CSV文件的方法
2015/06/28 Python
Python的组合模式与责任链模式编程示例
2016/02/02 Python
flask使用session保存登录状态及拦截未登录请求代码
2018/01/19 Python
Python实现检测文件MD5值的方法示例
2018/04/11 Python
如何使用html5与css3完成google涂鸦动画
2012/12/16 HTML / CSS
C++是不是类型安全的
2014/02/18 面试题
房地产管理毕业生自荐信
2013/11/04 职场文书
大学专科生推荐信范文
2013/11/23 职场文书
大学生个人求职信
2014/06/02 职场文书
2014客服代表实习自我鉴定
2014/09/18 职场文书
营业用房租赁协议书
2014/11/26 职场文书
后天观后感
2015/06/08 职场文书
MySQL常用慢查询分析工具详解
2022/08/14 MySQL