python实现logistic分类算法代码
作者:Mr_Ten 发布时间:2021-12-24 14:19:15
标签:python,logistic,分类算法
最近在看吴恩达的机器学习课程,自己用python实现了其中的logistic算法,并用梯度下降获取最优值。
logistic分类是一个二分类问题,而我们的线性回归函数
的取值在负无穷到正无穷之间,对于分类问题而言,我们希望假设函数的取值在0~1之间,因此logistic函数的假设函数需要改造一下
由上面的公式可以看出,0 < h(x) < 1,这样,我们可以以1/2为分界线
cost function可以这样定义
其中,m是样本的数量,初始时θ可以随机给定一个初始值,算出一个初始的J(θ)值,再执行梯度下降算法迭代,直到达到最优值,我们知道,迭代的公式主要是每次减少一个偏导量
如果将J(θ)代入化简之后,我们发现可以得到和线性回归相同的迭代函数
按照这个迭代函数不断调整θ的值,直到两次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)
运行结果如下
来源:https://blog.csdn.net/u012722531/article/details/79274528


猜你喜欢
- 一、前言在生活中,我们经常会遇到电脑中文件重复的情况。在文件较少的情况下,这类情况还比较容易处理,最不济就是一个个手动对比删除;而在重复文件
- 1.直接输入sql执行MySQL> select now();+---------------------+| now() |+---
- 在数据库应用,我们经常要用到唯一编号,以标识记录。在MySQL中可通过数据列的AUTO_INCREMENT属性来自动生成。MySQL支持多种
- 在 JavaScript 中,可以用 instanceof 来判断一个对象是不是某个类或其子类的实例。比如:// 代码
- 前言go.Panel面板是gojs重要的绘图模板,上文中我们提到的是可视化图形中的节点分组.而go.Panel可以把节点内部分成很多的模块,
- 最近肺炎的发展速度属实有点恐怖。刚知道python的pyecharts这个库,想到pyecharts可视化的特点,正好可以扒一下肺炎实时播报
- 最近项目中遇见 Jquery Ajax 缓存问题,load出来的页面状态有时正常,有时不对,记录一下,希望对大家有帮助使用jquery里lo
- 贪心算法贪心算法(又称贪婪算法)是指,在对问题求解时,总是做出在当前看来是最好的选择。也就是说,不从整体最优上加以考虑,他所做出的是在某种意
- 本文实例为大家分享了vue实现轮播图帧率播放的具体代码,供大家参考,具体内容如下需求传入一个数组,数组中放的是目录名称,通过本目录名称,读取
- 01、文件操作文件是操作系统提供给用户/应用程序操作硬盘的一个虚拟的概念/接口用户/应用程序可以通过文件将数据永久保存在硬盘中用户/应用程序
- window.onload=function{} 表示页面加载完了后(包括dom和js),再执行函数里面的内容; $(function(){
- 标题:按某字段合并字符串之一(简单合并)描述:将如下形式的数据按id字段合并value字段。id val
- 1. 什么是链表链表是一种物理存储单元上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的。链表由一系列结点(链表
- 尽管XML还处在开发阶段,其标准正在由W3C组织制定,但是已经有许多公司表示全力支持XML,并开发了不少XML工具。Adobe公司的Fram
- sql server中变量要先申明后赋值:局部变量用一个@标识,全局变量用两个@(常用的全局变量一般都是已经定义好的);申明局部变量语法:d
- SELECT SUBSTR (T.RPT_ID, &nb
- <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN&
- 静态链表和动态链表区别静态链表和动态链表的共同点是,数据之间"一对一"的逻辑关系都是依靠指针(静态链表中称"游
- 使用Python+OpenCV实现鼠标画框的代码,供大家参考,具体内容如下# -*-coding: utf-8 -*-""
- step函数概述step函数用于绘制阶梯图。根据源码可知,step函数是对plot函数的轻量级封装,很多概念和用法与plot函数非常相似。d