纯纯python实现梯度下降、随机梯度下降

最近面试有要求手撕SGD,这里顺便就把梯度下降、随机梯度下降、批次梯度下降给写出来了
有几个注意点:
1.求梯度时注意label[i]和pred[i]不要搞反,否则会导致模型发散
2.如果跑了几千个epoch,还是没有收敛,可能是学习率太小了

# X:n*k
# Y: n*1import random
import numpyclass GD:def __init__(self,w_dim,r):# 随机初始化self.w = [random.random() for _ in range(w_dim)]self.bias = random.random()self.learningRate = rprint(f"original w is {self.w}, original bias is {self.bias}")def forward(self,x):# 前馈网络ans = []for i in range(len(x)):y=0for j in range(len(x[0])):y+=self.w[j]*x[i][j]ans.append(y+self.bias)return ansdef bp(self,X,pred,label,op="GD"):# 计算均方差loss = 0for i in range(len(pred)):loss+=(label[i]-pred[i])**2loss = loss/len(X)# 计算梯度# 梯度下降if op=="GD":grad_w = [0 for _ in range(len(self.w))]grad_bias=0for i in range(len(X)):grad_bias+=-2*(label[i]-pred[i])for j in range(len(self.w)):grad_w[j]+=-2*(label[i]-pred[i])*X[i][j]  # 反向传播,更新梯度self.bias=self.bias-self.learningRate*grad_bias/len(X)for i in range(len(self.w)):self.w[i]-=self.learningRate*grad_w[i]/len(X)# 随机梯度下降if op=="SGD":grad_w = [0 for _ in range(len(self.w))]grad_bias=0randInd = random.randint(0,len(X)-1)grad_bias+=-2*(label[randInd]-pred[randInd])for j in range(len(self.w)):grad_w[j]+=-2*(label[randInd]-pred[randInd])*X[randInd][j]  # 反向传播,更新梯度self.bias=self.bias-self.learningRate*grad_biasfor i in range(len(self.w)):self.w[i]-=self.learningRate*grad_w[i]# 批次梯度下降if op=="BGD":        grad_w = [0 for _ in range(len(self.w))]grad_bias=0BS=8randInd = random.randint(0,len(X)/BS-1)X = X[BS*randInd:BS*(randInd+1)]label = label[BS*randInd:BS*(randInd+1)]pred = pred[BS*randInd:BS*(randInd+1)]for i in range(len(X)):grad_bias+=-2*(label[i]-pred[i])for j in range(len(self.w)):grad_w[j]+=-2*(label[i]-pred[i])*X[i][j]  # 反向传播,更新梯度self.bias=self.bias-self.learningRate*grad_bias/len(X)for i in range(len(self.w)):self.w[i]-=self.learningRate*grad_w[i]/len(X)return lossdef testY(X,w):Y = []for x in X:y=0for i in range(len(x)):y+=w[i]*x[i]Y.append(y)return Y# 构建数据
n = 1000
X=[[random.random() for _ in range(2)] for _ in range(n)]
w=[0.2,0.3]
B=0.4
Y = testY(X,w)# 设置样本维度为2
k = 2
lr = GD(k,0.01)
Loss=0
epochs=2000for e in range(epochs):Loss = 0pred = lr.forward(X)loss=lr.bp(X,pred,Y,"BGD")Loss+=loss if (e%100)==0:       print(f"step:{e},Loss:{Loss}") X_test=[[random.random() for _ in range(2)] for _ in range(2)]
Y_test=testY(X_test,w)print("X_test=",X_test)
print("Y_test=",Y_test)
print("Y_pred=",lr.forward(X_test))

测试效果如下:
在这里插入图片描述
也还行

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/802450.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

基于逻辑回归和支持向量机的前馈网络进行乳腺癌组织病理学图像分类

CNN(卷积神经网络)通过使用反向传播方法来学习特征,这种方法需要大量的训练数据,并且存在梯度消失问题,从而恶化了特征学习。 CNN卷积神经网络 CNN由一个多层神经网络组成,该网络从标记的训练数据集中学习…

计算机视觉入门 详细教程实例

计算机视觉是人工智能领域的一个重要分支,涉及使用计算机来理解和解释图像和视频内容。以下是一个计算机视觉入门的详细教程实例,包括基本概念、常用技术和示例代码: 1. 理解计算机视觉的基本概念 介绍计算机视觉的定义和应用领域。解释图像…

ScreenToGif录制屏幕保存为gif

录制屏幕操作转成gif保存很实用,适合录制场景还原 https://www.screentogif.com/ Releases NickeManarin/ScreenToGif GitHub

C#WPF给控件增加滚动条

本文实例演示C#WPF中给控件增加滚动条。 XAML代码如下: <Windowx:Class="PageDemo.MainWindow"xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"xmlns:d="…

HarmonyOS实战开发-使用OpenGL实现2D图形绘制和动画。

介绍 基于XComponent组件调用Native API来创建EGL/GLES环境&#xff0c;从而使用标准OpenGL ES进行图形渲染。本项目实现了两个示例&#xff1a; 使用OpenGL实现2D的图形绘制和动画&#xff1b;使用OpenGL实现了在主页面绘制两个立方体&#xff0c;光源可以在当前场景中移动&…

LeetCode 2009.使数组连续的最少操作数:去重排序 + 滑动窗口

【LetMeFly】2009.使数组连续的最少操作数&#xff1a;去重排序 滑动窗口 力扣题目链接&#xff1a;https://leetcode.cn/problems/minimum-number-of-operations-to-make-array-continuous/ 给你一个整数数组 nums 。每一次操作中&#xff0c;你可以将 nums 中 任意 一个元…

从高频到低频:全面解析压控振荡器结构与应用场景

压控振荡器&#xff08;简称VCO&#xff09;是一种电子电路&#xff0c;其特点是输出的振荡频率能够随着输入电压的变化而连续改变。在VCO中&#xff0c;通过调控输入端的电压信号&#xff0c;可以相应地改变内部谐振电路的参数&#xff08;如电感、电容或者变容二极管的电容值…

【智能算法】人工电场算法(AEFA)原理及实现

目录 1.背景2.算法原理2.1算法思想2.2算法过程 3.结果展示4.参考文献 1.背景 2019年&#xff0c;A Yadav等人受库伦定律和运动定律启发&#xff0c;提出了人工电场算法&#xff08;Artificial Electric Field Algorithm&#xff0c;AEFA&#xff09;。 2.算法原理 2.1算法思…

【Spring Cloud】服务容错中间件Sentinel入门

文章目录 什么是 SentinelSentinel 具有以下特征&#xff1a;Sentinel分为两个部分: 安装 Sentinel 控制台下载jar包&#xff0c;解压到文件夹启动控制台访问了解控制台的使用原理 微服务集成 Sentinel添加依赖增加配置测试用例编写启动程序 实现接口限流总结 欢迎来到阿Q社区 …

如何在项目中使用uni-ui组件库

1、安装uni-ui npm i dcloudio/uni-ui 2、组件自动引用 配置easycom 使用 npm 安装好 uni-ui 之后&#xff0c;需要配置 easycom 规则&#xff0c;让 npm 安装的组件支持 easycom 打开项目根目录下的 pages.json 并添加 easycom 节点&#xff1a; // pages.json {"e…

maya节点绕轴旋转

目录 旋转后并尝试冻结变换 绕x轴旋转90度 使用Python脚本 使用图形界面 使用MEL脚本 绕y轴旋转90度 使用Python脚本 ok 旋转后并尝试冻结变换 import maya.cmds as cmdsdef adjust_root_rotation_for_export(joint_name):# 选择根节点cmds.select(joint_name)# 应用旋…

HTML转EXE工具(HTML App Build)永久免费版:24.4.9.0

最新版本的HTML2EXE即将发布了。自从去年发布了HTML2EXE之后&#xff0c;我就正式上班了&#xff0c;一直忙于工作&#xff0c;实在没有时间更新&#xff08;上班时间不能做&#xff09;&#xff0c;很多网友下载使用&#xff0c;反应很好&#xff0c;提出了一些改进的建议&…

【2023】LeetCode HOT 100——二叉树

目录 1. 二叉树的中序遍历1.1 C++实现1.2 Python实现1.3 时空分析2. 二叉树的最大深度2.1 C++实现2.2 Python实现2.3 时空分析3. 翻转二叉树3.1 C++实现3.2 Python实现3.3 时空分析4. 对称二叉树4.1 C++实现

【代码随想录】day39

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 一、62.不同路径二、63. 不同路径 II 一、62.不同路径 class Solution { public:int uniquePaths(int m, int n) {vector<vector<int>> path;path.res…

感知定位篇之机器人感知定位元件概述(上)

欢迎关注微信公众号 “四足机器人研习社”&#xff0c;本公众号的文章和资料和四足机器人相关&#xff0c;包括行业的经典教材、行业资料手册&#xff0c;同时会涉及到职业知识学习及思考、行业发展、学习方法等一些方面的文章。 目录 |0.概述 |1.常用传感元件 1.1视觉传感器…

C语言什么是外部函数?怎么⽤?

一、问题 什么是外部函数呢&#xff1f;怎么使⽤&#xff1f; 二、解答 外部函数在整个源程序中都有效&#xff0c;其定义的⼀般形式如下。 extern 类型声明符 函数名(形参表); 例如&#xff1a; extern int f(int a,int b); 调⽤外部函数时&#xff0c;需要对其进⾏声明。…

医疗器械常见法规和标准

在医疗器械行业找工作&#xff0c;有些JD上会明确要求熟悉相关的医疗器械法规和标准&#xff0c;比如&#xff1a;ISO13485、NMPA、CE、IEC62304、IEC60601、IEC14971等等&#xff0c;根据这些我来简单总结下&#xff1a; ISO 13485&#xff08;医疗器械质量管理体系&#xff0…

750万人受影响,印度电子巨头boAt重大数据泄露事件

近日&#xff0c;印度消费电子巨头boAt遭遇重大数据泄露事件&#xff0c;超过750万客户的个人数据遭到泄露&#xff0c;泄露的个人数据包括姓名、地址、联系电话、电子邮件 ID 和客户 ID 以及其他敏感信息&#xff0c;目前这些泄露数据正在暗网上流传。 boAt Lifestyle数据库被…

【数据结构】考研真题攻克与重点知识点剖析 - 第 8 篇:排序

前言 本文基础知识部分来自于b站&#xff1a;分享笔记的好人儿的思维导图与王道考研课程&#xff0c;感谢大佬的开源精神&#xff0c;习题来自老师划的重点以及考研真题。此前我尝试了完全使用Python或是结合大语言模型对考研真题进行数据清洗与可视化分析&#xff0c;本人技术…

【干货】【常用电子元器件介绍】【集成电路】(一)--集成电路的类型和主要参数

声明:本人水平有限,博客可能存在部分错误的地方,请广大读者谅解并向本人反馈错误。 集成电路是一种采用特殊工艺,将晶体管、电阻、电容等元件集成在硅基片上而形成的 具有特定功能的器件,英文名称为Integrated Circuit,缩写为IC,俗称芯片。集成电路能执 行一些特定的功能,如…