python实现logistic分类算法代码

作者:Mr_Ten 时间:2021-12-24 14:19:15 

最近在看吴恩达的机器学习课程,自己用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分类算法代码

来源:https://blog.csdn.net/u012722531/article/details/79274528

标签:python,logistic,分类算法
0
投稿

猜你喜欢

  • python设置Pyplot的动态rc参数、绘图的填充

    2023-12-15 22:52:29
  • MySQL RC事务隔离的实现原理

    2024-01-29 06:12:23
  • vuex 第三方包实现数据持久化的方法

    2024-04-30 10:34:56
  • AspJpeg 2.0组件使用教程(GIF篇)

    2008-12-16 19:37:00
  • JavaScript Dom编程:介绍学习书籍

    2008-02-20 08:32:00
  • Python图像阈值化处理及算法比对实例解析

    2022-08-14 19:32:33
  • python将字符串list写入excel和txt的实例

    2022-02-28 05:07:01
  • sql server 2000阻塞和死锁问题的查看与解决方法

    2024-01-20 01:46:45
  • JS获取当前时间的实例代码(昨天、今天、明天)

    2024-04-23 09:28:36
  • matplotlib绘制多子图共享鼠标光标的方法示例

    2023-06-15 13:45:19
  • vue实现父子组件之间的通信以及兄弟组件的通信功能示例

    2024-05-21 10:15:43
  • JS 函数的 call、apply 及 bind 超详细方法

    2024-04-30 10:42:28
  • 浅谈Python中函数的定义及其调用方法

    2022-09-01 09:35:35
  • python判断自身是否正在运行的方法

    2022-07-30 02:34:44
  • python:解析requests返回的response(json格式)说明

    2023-11-05 15:43:25
  • 深入理解Python单元测试unittest的使用示例

    2022-03-18 04:51:00
  • 注意:php5.4删除了session_unregister函数

    2023-11-24 12:31:54
  • Mysql动态更新数据库脚本的示例讲解

    2024-01-23 11:22:49
  • Python地图四色原理的遗传算法着色实现

    2022-10-07 20:57:45
  • python实战教程之OCR文字识别方法汇总

    2021-09-20 05:36:21
  • asp之家 网络编程 m.aspxhome.com