将上述的梯度下降函数改为批量梯度下降函数,即每次随机选取一定批量的样本(这里定为16个)而不是单个样本,完成梯度累计与参数更新(见前面关于批量梯度下降的公式),并实现训练,画出损失函数变化图以及最终的回归效果图,可以模仿上面的实例。注意下面代码里的todo,是需要自己完成填写上去的,不填写直接运行是不收敛的。


以下是为您修改的批量梯度下降函数的代码示例: ```python import numpy as np import matplotlib.pyplot as plt def batch_gradient_descent(X, y, learning_rate, num_epochs, batch_size=16): # 初始化参数 w = np.zeros(X.shape[1]) b = 0 num_samples = X.shape[0] losses = [] for epoch in range(num_epochs): # 打乱样本顺序 indices = np.random.permutation(num_samples) X_shuffled = X[indices] y_shuffled = y[indices] for i in range(0, num_samples, batch_size): # 取批量样本 X_batch = X_shuffled[i:i + batch_size] y_batch = y_shuffled[i:i + batch_size] # 计算梯度 gradient_w = np.dot(X_batch.T, (np.dot(X_batch, w) + b - y_batch)) / batch_size gradient_b = np.sum(np.dot(X_batch, w) + b - y_batch) / batch_size # 更新参数 w -= learning_rate * gradient_w b -= learning_rate * gradient_b # 计算损失 loss = np.mean((np.dot(X, w) + b - y) 2) losses.append(loss) # 绘制损失函数变化图 plt.plot(losses) plt.xlabel('Epoch') plt.ylabel('Loss') plt.title('Loss Function over Epochs') plt.show() # 绘制回归效果图 y_pred = np.dot(X, w) + b plt.scatter(X[:, 0], y) plt.plot(X[:, 0], y_pred, color='red') plt.xlabel('X') plt.ylabel('y') plt.title('Regression Result') plt.show() # 示例用法 X = np.array([[1, 2], [2, 3], [3, 4], [4, 5], [5, 6]]) y = np.array([3, 5, 7, 9, 11]) learning_rate = 0.01 num_epochs = 100 batch_gradient_descent(X, y, learning_rate, num_epochs) ``` 额外需要注意的逻辑点: 1. 批量大小的选择要根据数据量和计算资源进行权衡。 2. 打乱样本顺序对于梯度下降的效果有一定影响。 3. 学习率的调整可能需要多次试验以获得较好的收敛效果。 [2024-12-03 22:26:29 | AI写代码神器 | 590点数解答]
- import math class ball: """ 实现 def __init__(self, radius) 函数, 他有一个参数radius, 并为对象初始化一个变量self.radius """ """ 实现 def surface_area(self) 函数, 通过self.radius计算球的表面积, 并将这个表面积返回 """ """ 实现 def volume(self) 函数, 通过self.radius计算球的体积, 并将这个体积返回 """ """ 在评测文件中将这样调用这个类 ball = ball(eval(input())) print("球的半径:{:.2f}".format(ball.radius)) print("球的表面积:{:.2f}".format(ball.surface_area())) print("球的体积:{:(261点数解答 | 2024-11-28 21:19:39)171
- 读入数据文件 data.xlsx,实现以下功能: # 数据做字符串处理dtype=str df = pd.read_excel(r'd:\data.xlsx', dtype=str) 1、将列名'商品编码'改为'药品编码',将列名'商品名称'改为'药品名称' (rename()方法实现重新标记行索引或列名,通常使用原索引与新索引(原列名与新列名)组成的字典作为参数。 例如:df=df.rename(columns={'name':'姓名','class':'班级'})) 2、对缺失数据做删除处理(查询哪些字段和记录有空值,并显示社保卡号为空值的记录,并删除有空值的记录) 3、将'销售数量'的数据类型转换为整型'int',将'应收金额'和'实收金额'的数据类型转换为浮点型'float' 4、将'购药时间'截取前面的日期字符串,并将该字段转化为时间类型 (截取字符串可以使用代码:df['购药时间'] = df['购药时间'].map(lambda x: x.split()[0])) 5、删除‘销售数量’小于等于0的数据。(查看数据框信息,看看删除后记录的改变) 6(168点数解答 | 2025-04-17 16:51:27)146
- #include <stdio.h> #include <stdlib.h> #include <string.h> typedef struct sqlist //单链表结构体 { int data; struct sqlist *next; //指针域 }sqlist; void initlist (sqlist *l, sqlist *m, sqlist *n, sqlist *h) { //todo list yes l->next = null; m->next = null; n->next = null; h->next = null; } void emp(sqlist *l) { if (l->next==null) //todo list)yes printf("链表为空表。\n"); else printf("链表为非空表。\n"); } void length(sqlist *l) { sqlist *p; int length = 0; p=l->next; while(p!=null) { length++; p=p->next; } //todo list(345点数解答 | 2024-10-23 23:11:22)161
- c语言代码链表是软件中一种最基本的数据结构,它是用链式存储结构实现数据存储的线性表。它较顺序表(如数组)而言在插入和删除数据时不必移动其后的大批量元素。现在给你一些整数,然后会频繁地插入和删除其中的某些元素,会在其中某些时候让你查找某个元素或者输出当前链表中所有的元素。 本题要实现的功能是: 链表创建(函数:headnode *create() )。根据输入数据的顺序创建包含头结点的链表,新数据总是插入到链表首结点之前,如果原链表为空链表,则新结点作为链表首结点。 输出链表(函数:oprstatus show(headnode *head) )。将整个链表的数据依次输出。如果链表为空,则不能执行输出操作,返回枚举值“error”,否则输出链表数据,返回枚举值“ok”。 删除链表数据(函数:oprstatus delete(headnode *head, int i) )。删除链表中第i号元素,i从1开始计数。如果存在第i号元素,删除之并返回枚举值“ok”,否则无法执行删除操作,返回枚举值“error”。 插入数据(函数:oprstatus insert(headnode *h(534点数解答 | 2024-12-09 21:33:48)210
- c语言代码 链表是软件中一种最基本的数据结构,它是用链式存储结构实现数据存储的线性表。它较顺序表(如数组)而言在插入和删除数据时不必移动其后的大批量元素。现在给你一些整数,然后会频繁地插入和删除其中的某些元素,会在其中某些时候让你查找某个元素或者输出当前链表中所有的元素。 本题要实现的功能是: 链表创建(函数:headnode *create() )。根据输入数据的顺序创建包含头结点的链表,新数据总是插入到链表首结点之前,如果原链表为空链表,则新结点作为链表首结点。 输出链表(函数:oprstatus show(headnode *head) )。将整个链表的数据依次输出。如果链表为空,则不能执行输出操作,返回枚举值“error”,否则输出链表数据,返回枚举值“ok”。 删除链表数据(函数:oprstatus delete(headnode *head, int i) )。删除链表中第i号元素,i从1开始计数。如果存在第i号元素,删除之并返回枚举值“ok”,否则无法执行删除操作,返回枚举值“error”。 插入数据(函数:oprstatus insert(headnode *(609点数解答 | 2024-12-18 12:18:21)233
- 题目描述 炼石熊很喜欢玩射击游戏。他刚考完了数据结构期末考试,感觉不错,于是又来到了射击***放松一下。 和上次一样,先从老板那租了一把步枪和装有n发子弹的弹夹。这里,再把规则说一遍。 在射击的过程中,炼石熊每次都有两种选择:从弹夹中取出一颗子弹上膛,或者打一发子弹出去。注意:所有的子弹都从枪口上膛。炼石熊感觉这有点像《数据结构》课程中的“栈”的特点。因此在打完了这n发子弹之后,他想验证一下这些子弹打出来的顺序是不是真的满足“栈”的特性。 假设n颗子弹的编号为1,2,…,n。子弹从弹夹中取出的顺序也是从1到n,这里n = 10。给定一个子弹被打出的顺序,你可以帮炼石熊验证它满不满足“栈”的打出顺序吗? 输入格式 可能有多个测试输入,第一行给出总共的测试输入的个数。 每个测试输入只有一行:用空格隔开的十个数,表示子弹打出的编号顺序。 输出格式 对每个测试输入,输出只有一行: “yes”,如果打出顺序满足“栈”的特点; “no”,如果打出顺序不满足“栈”的特点。(300点数解答 | 2024-11-29 19:33:47)138
- #include <stdio.h> #include <stdlib.h> #include <string.h> typedef struct sqlist //单链表结构体 { int data; struct sqlist *next; //指针域 }sqlist; void initlist (sqlist *l, sqlist *m, sqlist *n, sqlist *h) { //todo list yes l->next = null; m->next = null; n->next = null; h->next = null; } void emp(sqlist *l) { if (l->next==null) //todo list)yes printf("链表为空表。\n"); else printf("链表为非空表。\n"); } void length(sqlist *l) { sqlist *p; int length = 0; p=l->next; while(p!=null)(428点数解答 | 2024-10-23 23:09:51)166
- c++实现: 题目描述 “五一”放假了,爸爸总算答应小华可以在上午玩益智游戏。小华飞快地下载了一个名叫“快乐五一”的游戏,准备大显身手了。安装、运行,接着出现了一个 “请输入密码:” 的输入框,密码是什么呢? 小华看了一下说明,原来每次开始运行游戏都会在界面上显示一个小于 150 位的正整数 N , 同时显示一个密码破解钥匙 S( S 为正整数且小于 N 的位数),只要将正整数N去掉其中任意 S 个数字后使剩下的数最小,这个最小数就是密码。例如:N=2813465, S=4 时可以删去 2,8,6,5 得到最小数 134,密码就是 134 。这可难不倒小华,他号称学校信息学竞赛的“编程高手”呢。很快他就编写出了一个专门破解密码的程序。请你编写一个这样的程序,只要从键盘输入 N 和 S 就可以输出密码是什么。 输入格式 两个整数 N 和 S ,含义如题所示。 输出格式 一个 S位的整数,表示密码; 样例输入1 2813465 4 样例输出1 134 样例输入2 1032 2 样例输出2 2(473点数解答 | 2025-06-20 16:08:21)73
- 作为**工程师,回归**,是怎么理解的?(213点数解答 | 2023-11-09 18:23:11)143
- 定义具有继承关系的点类point和圆类circle和测试类mainclass, point类具有x,y两个属性,用于表示点的坐标(整数),为point类添加相应构造方法point(x,y)。(2)circle类为point类的子类,它本身包含半径radius(整数),为circle类添加相应构造方法circle(x,y ,radius),求周长(小数)getperi ()和求面积(小数)getarea0)的方法,在方法中打印相关结果(公式:周长=2*3.14*半径,面积=3.14*半径*半径)。 (3)创建测试类mainclass,在其main方法中创建circle类对象c,圆心坐标(50,30),半径为4,调用对象c的相关方法打印的圆的周长和面积。(246点数解答 | 2024-11-11 16:36:30)189
- 模仿“Bing”编写一个能在浏览器上用的“光遇”搜索引擎(1165点数解答 | 2025-05-11 17:17:11)65
- Matlab编程题 血管机器人的订购与生物学习 随着微机电系统的发展,人类已经可以加工越来越小的机器。 这些机器小到一定程度就可以放进血管开展疾病治疗,这就是血管 机器人。血管机器人可以携带药物放入血管里定点治疗与血管有关 的疾病,还可以充当血管清道夫,清除病毒,保持人体健康。因 而,血管机器人越来越受到人们的关注。 血管机器人有多种类型,其中某医院使用的是ABLVR型号的血 管机器人。这种血管机器人有两大特点:①可以组装。机器人有一 个容器艇(类似于潜艇),有动力,可在血液中游动。容器艇四周 最多安装了4个操作手,操作手类似于人,有生物大脑和机械臂, 生物大脑控制着机械臂进行工作。操作手可以从容器艇上拆卸、安 装、更换。②需要学习。这种血管机器人没有直接的信息复制功 能,新购买的操作手在工作之前需要提前进行生物学习(训练), 类似于人脑学习,需要在特定的环境中由已经学习好的操作手(熟 练工)“指导”若干个生物大脑芯片空白的操作手(新手)在仿真 血管中进行学习,直到“新手”能够达到“熟练工”的水平为止, 时间为一周。每次培训是一个熟练的操作手带3个新手在一个容器 艇上进行训练,每个(3384点数解答 | 2025-06-22 13:25:13)70