线性回归 + 基础优化算法
线性回归
线性回归是机器学习最基础的模型,也是理解后续所有深度学习的基础。
线性模型可以看做是单层神经网络。
上述有个0.5是在求导的时候可以很方便的将2消去。
实际上,这里的数据样本受限很大,比如地球上房子就那么多,肯定不会上百亿的,那么这样具体如何处理,后续会有对应的算法对这部分进行处理,此处不做深入研究,因为笔者还不会(绷)。
因为上述是一个线性模型,因此是有显式解的。
这是一个唯一有最优解的模型,后续较为复杂的模型都不会有最优解了。
下面总结一下:
基础优化算法
优化方法里面最常见的算法叫做梯度下降,即当我的模型没有显示解的时候,需要挑选一个参数的随机初始值,随便选择,记为 w 0 w_0 w0,在接下来的时刻,不断的更新 w 0 w_0 w0,使其接近我们的最优解。具体解释如下:
上述是一个很简单的二次函数的等高图,最优点在最小的圈里,假设 w 0 w_0 w0随机取在图中的位置,去梯度的反方向,和学习率相乘,然后相加,就可以得到 w 1 w_1 w1的位置,同样,在 w 1 w_1 w1处,继续计算其梯度,如此反复迭代,知道到达最优点附近。
上述的学习率是一个超参数,是需要人为指定的值,对于该值,不能太小,要是太小的话,每次走的步长很有限,到达一个点需要走很多很多步,这样需要计算很多梯度,浪费时间和资源,同时也不能太大,要是迈过了,会使得结果一直在震荡,没有真正的在下降。
从 0 开始实现
虽然现在的深度学习框架可以自动化的进行上述线性回归的实现,但是我们还是需要明白线性回归到底是回归啥,因此我们这里选择从零开始实现。
首先导入必要的环境:
%matplotlib inline
import random
import torch
from d2l import torch as d2l
上述的 %matplotlib inline 是一个魔法命令(magic command),主要用于IPython环境和Jupyter Notebook中。它的主要作用是将matplotlib生成的图表直接嵌入到Notebook页面中,而不是在一个弹出的新窗口中显示这些图表。这对于数据分析和可视化工作特别方便,因为它允许用户直接在Notebook中查看图表结果,而无需切换窗口或上下文。
下面我们将根据带有噪声的线性模型构造一个人造数据集(好处是可以知道真实的 w w w和 b b b.):
def synthetic_data(w, b, num_examples): #@save"""生成y=Xw+b+噪声"""X = torch.normal(0, 1, (num_examples, len(w)))# 生成一个均值为0,方差为1的随机数,后面的两个参数代表的是样本数量和样本长度y = torch.matmul(X, w) + b # torch.matmul()用于计算矩阵乘法。# 给y加上一些均值为0,标准差为0.01的噪声,模拟真实世界数据中的误差。# torch.normal()生成与y相同形状的噪声张量,并将其加到y上。y += torch.normal(0, 0.01, y.shape)# 最后,将y转换成列向量(即形状为(num_examples, 1)的张量)。return X, y.reshape((-1, 1))# 然后就是将真实的数据传入到对应函数的位置即可
true_w = torch.tensor([2, -3.4])
true_b = 4.2
features, labels = synthetic_data(true_w, true_b, 1000)
执行上述代码后,features
中的每一行都包含一个二维数据样本,labels
中的每一行都包含一维标签值(一个标量)。
通过生成第二个特征features[:, 1]
和labels
的散点图,可以直观观察到两者之间的线性关系。
d2l.set_figsize()
d2l.plt.scatter(features[:, (1)].detach().numpy(), labels.detach().numpy(), 1);
# detach用于从计算图中分离出来一个张量,使得该张量不会被追踪计算历史
下面,我们定义一个data_iter
函数,该函数接收批量大小、特征矩阵和标签向量作为输入,生成大小为batch_size
的小批量。每个小批量包含一组特征和标签。
def data_iter(batch_size, features, labels):num_examples = len(features)indices = list(range(num_examples))# 这些样本是随机读取的,没有特定的顺序,shuffle用于打乱数据顺序random.shuffle(indices)# 从0开始到num_examples每一次跳跃batch_size 的大小for i in range(0, num_examples, batch_size):batch_indices = torch.tensor(indices[i: min(i + batch_size, num_examples)])# 后面使用min是为了防止超出范围yield features[batch_indices], labels[batch_indices]
下面设置 batch_size
= 10 , 读取一下数据集,并展示出来:
下面初始化模型的权重与偏置:
w = torch.normal(0, 0.01, size=(2,1), requires_grad=True)
# 创建一个二维张量w,形状为2×1,并启用了自动求导的功能
b = torch.zeros(1, requires_grad=True)
下面定义模型,将模型的输入和参数同模型的输出关联起来:
def linreg(X, w, b): #@save"""线性回归模型"""return torch.matmul(X, w) + b # 触发广播机制
下面定义损失函数:
def squared_loss(y_hat, y): #@save"""均方损失"""return (y_hat - y.reshape(y_hat.shape)) ** 2 / 2
下面定义优化算法:
尽管线性回归有显式解,但是除了这个模型,其他的模型没有,因此此处选择使用小批量随机梯度下降。
def sgd(params, lr, batch_size): #@save"""小批量随机梯度下降"""with torch.no_grad():#更新的时候不需要参与梯度计算for param in params:param -= lr * param.grad / batch_sizeparam.grad.zero_()# 手动将梯度设置成0,这样下一次计算梯度的时候就不会和上一次相关了
训练
现在我们已经准备好了模型训练所有需要的要素,可以实现主要的训练过程部分了。
理解这段代码至关重要,因为从事深度学习后,相同的训练过程几乎一遍又一遍地出现。在每次迭代中,我们读取一小批量训练样本,并通过我们的模型来获得一组预测。计算完损失后,我们开始反向传播,存储每个参数的梯度。最后,我们调用优化算法 sgd
来更新模型参数。
概括一下,我们将执行以下循环:
- 初始化参数
- 重复以下训练,直到完成
- 计算梯度 g ← ∂ ( w , b ) 1 ∣ B ∣ ∑ i ∈ B l ( x ( i ) , y ( i ) , w , b ) \mathbf{g} \leftarrow \partial_{(\mathbf{w},b)} \frac{1}{|\mathcal{B}|} \sum_{i \in \mathcal{B}} l(\mathbf{x}^{(i)}, y^{(i)}, \mathbf{w}, b) g←∂(w,b)∣B∣1∑i∈Bl(x(i),y(i),w,b)
- 更新参数 ( w , b ) ← ( w , b ) − η g (\mathbf{w}, b) \leftarrow (\mathbf{w}, b) - \eta \mathbf{g} (w,b)←(w,b)−ηg
在每个 迭代周期(epoch)中,我们使用data_iter
函数遍历整个数据集,并将训练数据集中所有样本都使用一次(假设样本数能够被批量大小整除)。这里的迭代周期个数num_epochs
和学习率lr
都是超参数,分别设为3和0.03。设置超参数很棘手,需要通过反复试验进行调整。
lr = 0.03
num_epochs = 3 # 把整个数据扫三遍
net = linreg
loss = squared_loss # 均方损失for epoch in range(num_epochs):for X, y in data_iter(batch_size, features, labels):l = loss(net(X, w, b), y) # X和y的小批量损失# 因为l形状是(batch_size,1),而不是一个标量。l中的所有元素被加到一起,# 并以此计算关于[w,b]的梯度l.sum().backward()sgd([w, b], lr, batch_size) # 使用参数的梯度更新参数with torch.no_grad():train_l = loss(net(features, w, b), labels)print(f'epoch {epoch + 1}, loss {float(train_l.mean()):f}')
因为我们使用的是自己合成的数据集,所以我们知道真正的参数是什么。因此,我们可以通过比较真实参数和通过训练学到的参数来评估训练的成功程度。事实上,真实参数和通过训练学到的参数确实非常接近。
注意,我们不应该想当然地认为我们能够完美地求解参数。在机器学习中,我们通常不太关心恢复真正的参数,而更关心如何高度准确预测参数。幸运的是,即使是在复杂的优化问题上,随机梯度下降通常也能找到非常好的解。其中一个原因是,在深度网络中存在许多参数组合能够实现高度精确的预测。
简洁实现
在上述的实现中,我们只运用了:
- (1)通过张量来进行数据存储和线性代数;
- (2)通过自动微分来计算梯度。
实际上,由于数据迭代器、损失函数、优化器和神经网络层很常用,现代深度学习库也为我们实现了这些组件。
import numpy as np
import torch
from torch.utils import data
from d2l import torch as d2l
# 生成数据集
true_w = torch.tensor([2, -3.4])
true_b = 4.2
features, labels = d2l.synthetic_data(true_w, true_b, 1000)
# 读取数据集
def load_array(data_arrays, batch_size, is_train=True): #@save"""构造一个PyTorch数据迭代器"""dataset = data.TensorDataset(*data_arrays)# 将多个数据数组打包成一个TensorDataset# *data_arrays 会将列表中的元素解包,作为TensorDataset的参数传入return data.DataLoader(dataset, batch_size, shuffle=is_train)# 创建一个DataLoader实例,用于加载数据# 如果is_train为True,则在每个epoch开始时会对数据进行随机洗牌batch_size = 10
data_iter = load_array((features, labels), batch_size)next(iter(data_iter))# 定义模型
from torch import nnnet = nn.Sequential(nn.Linear(2, 1))net[0].weight.data.normal_(0, 0.01) #权重还是随机采样
net[0].bias.data.fill_(0)loss = nn.MSELoss()trainer = torch.optim.SGD(net.parameters(), lr=0.03)num_epochs = 3# 设置训练次数
for epoch in range(num_epochs):for X, y in data_iter:l = loss(net(X) ,y) # 前向传播计算损失trainer.zero_grad()# 在每次计算梯度之前,需要先将之前的梯度清零,因为默认情况下,.backward() 方法会累积梯度。l.backward()trainer.step()# 根据当前的梯度和优化器的设置来更新网络的参数。l = loss(net(features), labels) # 评估当前轮次的损失print(f'epoch {epoch + 1}, loss {l:f}')w = net[0].weight.data
print('w的估计误差:', true_w - w.reshape(true_w.shape)) # 需要改变形状
b = net[0].bias.data
print('b的估计误差:', true_b - b) # b就是一个标量,无需改变形状
思考QA
Q1 :为啥使用平方损失而不是绝对差值?
A1:实际上没有啥区别,最开始选择使用平方差值的原因是因为绝对差值在原点处不可导,导数可能处理起来有点困难,但是实际上两者都是可以的。
Q2:损失为啥需要求平均?
A2:实际上求与不求都是没有关系的,除以 N 的好处是不管我的样本有多大,求出来的梯度的值都是差不多的,方便于我调整学习率。要是没有除以 N 的话,在学习率上除也是一样的。除以 N 使得 Loss 与样本数无关。
Q3:batchsize是否会最终影响模型结果?batchsize过小是否可能导致最终累计的梯度计算不准确?
A3:实际上在同样的 epoch 下 batch_size 越小的话其实是对收敛越好的。一定的噪音使得我的神经网络不会走偏,可以减少过拟合,因为要是 batch_size 越小的话,反应出来的噪音是越大的。
Q4:随机梯度下降的“随机”是啥随机啊?
A4:指的是样本随机取,也就是代码中的 shuffle = True
Q5:为什么机器学习优化算法都采取梯度下降(一阶导算法),而不采用牛顿法(二阶导算湿),收敛速度更快,一般能算出一阶导,二阶导也应该能算。
A5:求解复杂,收敛不一定快,就算快,结果不一定好。
Q6:这样的data-iter写法,每次都把所有输入load进去,如果数据多的话,最后内存会爆掉吧?有什么好的办法吗?
A6:确实有这个问题,但是这里只是展示,实际上数据是放在硬盘上的,每次读取部分数据进去,而不是全部读入内存。
Q7:如果样本大小不是批量数的整数倍,那需要随机删除多余的样本数吗?
A7:有三种做法:
- 最常见的做法就是拿到一个小一点的样本,也就是最后剩下多少样本都拿来
- 丢弃最后不完整的样本数
- 从下一个 epoch 中补其所需要的数量使其满足批量数
Q8:如何进行收敛的判断?
A8:有以下几种方法:
- 比较两个 epoch 之间,要是目标函数变化不大的时候,就可以认为是收敛的(比如相对变化是0.01就停止迭代)
- 拿一个验证数据集,要是验证数据集上的精度没增加的话,就可以认为是收敛的。
Q9:每个batch计算的时候,为什么需要把剃度先清零呀?
A9:因为 PyTorch 不会自动清零,要是不清零的话,后续求出来的梯度会在原来已有梯度的基础上进行累加,这样会导致出现意想不到的错误。
本质上我们为什么要用SGD,是因为大部分的实际Ioss太复杂,推导不出导数为0的解?只能逐个batch去逼近。
后记
考虑到我的Pycharm上没有d2l,因此我根据上述代码编写了如下可以运行的代码,也是从0开始实现的线性回归:
import random
import torch
import matplotlib.pyplot as plt# 生成数据集(weight, bias, data_num)
def synthetic_data(w, b, num_examples):# X 的形状为 (num_examples, len(w)) w 的形状为 (len(w), 1)X = torch.normal(0, 1, (num_examples, len(w)))y = torch.matmul(X, w) + by += torch.normal(0, 0.01, y.shape) # 加噪return X, y.reshape((-1, 1)) # 将y转换为列向量# 读取数据集
def data_iter(batch_size, features, labels):num_examples = len(features) # 返回特征矩阵中样本的数量(即第一维的大小)indices = list(range(num_examples)) # 创建所有样本的索引random.shuffle(indices) # 打乱顺序for i in range(0, num_examples, batch_size):# 这里的 indices 不一定需要转化为 tensor ,直接使用列表也是可以的batch_indices = torch.tensor(indices[i:min(i + batch_size, num_examples)] # 确保不会超出样本总数)yield features[batch_indices], labels[batch_indices]# 下一次调用时,函数会从上次暂停的地方继续执行,直到所有批次都被处理完# 初始化模型参数
def initialize_params(input_dim):# w 为一个二维张量, 形状为 input_num × 1w = torch.normal(0, 0.01, size=(input_dim, 1), requires_grad=True)b = torch.zeros(1, requires_grad=True)return w, b# 定义模型
def linreg(X, w, b):return torch.matmul(X, w) + b# 定义损失函数
def squared_loss(y_hat, y):return (y_hat - y.reshape(y_hat.shape)) ** 2 / 2# 定义优化算法
# params: 一个包含所有需要优化的模型参数的列表,每个参数是一个张量,且能自动计算梯度
def sgd(params, lr, batch_size):with torch.no_grad():for param in params:param -= lr * param.grad / batch_size# 由于梯度通常是对一个小批次数据计算的,因此需要对梯度进行归一化param.grad.zero_() # 梯度清零# 绘制散点图
def plot_scatter(features, labels):# features[:,1} 提取特征列 ,s 设置散点的大小plt.scatter(features[:, 1].detach().numpy(), labels.detach().numpy(), s=1)plt.xlabel("Feature 1")plt.ylabel("Labels")plt.title("Scatter Plot of Feature 1 vs Labels")plt.show()# 训练过程
def train(features, labels, batch_size, lr, num_epochs, w, b):net = linregloss = squared_lossfor epoch in range(num_epochs):for X, y in data_iter(batch_size, features, labels):l = loss(net(X, w, b), y) # 计算小批量损失l.sum().backward() # 将所有样本的损失相加,并反向传播sgd([w, b], lr, batch_size) # 更新参数 w,bwith torch.no_grad():train_l = loss(net(features, w, b), labels) # 更新后的参数和正确参数进行比较print(f'epoch {epoch + 1}, loss {float(train_l.mean()):f}') # 打印每次迭代后的训练损失值if __name__ == '__main__':# 超参数true_w = torch.tensor([2, -3.4], dtype=torch.float32)true_b = 4.2num_examples = 1000batch_size = 10lr = 0.03num_epochs = 3# 生成数据集features, labels = synthetic_data(true_w, true_b, num_examples)# 打印第一个样本print('features:{}, labels:{}'.format(features[0], labels[0]))# 绘制散点图plot_scatter(features, labels)# 初始化参数w, b = initialize_params(len(true_w))# 训练模型train(features, labels, batch_size, lr, num_epochs, w, b)# 输出误差print(f'w的估计误差: {true_w - w.reshape(true_w.shape)}')print(f'b的估计误差: {true_b - b}')
相关文章:
线性回归 + 基础优化算法
线性回归 线性回归是机器学习最基础的模型,也是理解后续所有深度学习的基础。 线性模型可以看做是单层神经网络。 上述有个0.5是在求导的时候可以很方便的将2消去。 实际上,这里的数据样本受限很大,比如地球上房子就那么多,肯…...
MyBatis分页插件混用问题解析:IPage与PageHelper的冲突与解决
一、背景 在同时使用 MyBatis-Plus 的 IPage 分页 和 PageHelper 时,开发者可能会遇到以下两类问题: 分页结果异常:IPage 查询的 total 总条数返回 0,但实际数据正常。依赖冲突报错:启动时报错 Column.withColumnNam…...
4.Socket类、InetAddr类、Epoll类实现模块化
目录 1. InetAddr类 类定义 代码说明 类实现 2.Socket类 类定义 类实现 3. Epoll类 类定义 构造与析构函数 方法实现 类实现 4. 使用模块化设计 示例使用(main.cpp) 5. 运行程序 随着程序复杂度的增加,单一的面向过程的代码会变得难以理…...
19 python 模块
在办公室的日常工作中,我们常常会用到各种各样的工具,像计算器用于计算数据、打印机用来打印文件、订书机将纸张装订成册等。这些工具会被反复使用,而且不同的工具具有不同的功能。 一、模块的定义 在 Python 里,模块就如同一个…...
医疗智能体通信整合-大模型训练中沟通优化策略研究
一、引言:医疗模型训练的沟通困境 1.1 医疗 AI 发展背景 在数智化浪潮的推动下,医疗 AI 正以前所未有的速度融入现代医疗体系。从智能影像诊断助力医生精准识别病灶,到基于大数据分析的个性化药物研发,医疗 AI 在提升医疗效率、改善医疗质量方面展现出巨大潜力。据相关数据…...
LearnOpenGL-笔记-其六
今天我们来聊一些更深入的东西: Depth Testing 在之前的学习过程中,我们有接触过深度缓冲,彼时的深度缓冲的意义就是可以让我们体现出深度的差异从而达到立体的效果,而现在我们将在深度缓冲的基础进一步扩展,进行深度…...
【商城实战(91)】安全审计与日志管理:为电商平台筑牢安全防线
【商城实战】专栏重磅来袭!这是一份专为开发者与电商从业者打造的超详细指南。从项目基础搭建,运用 uniapp、Element Plus、SpringBoot 搭建商城框架,到用户、商品、订单等核心模块开发,再到性能优化、安全加固、多端适配…...
Windows 10更新失败解决方法
在我们使用 Windows 时的时候,很多时候遇到系统更新 重启之后却一直提示“我们无法完成更新,正在撤销更改” 这种情况非常烦人,但其实可以通过修改文件的方法解决,并且正常更新到最新版操作系统 01修改注册表 管理员身份运行注…...
【安当产品应用案例100集】042-基于安当KADP实现机密文件安全流转
一、客户需求 某集团公司客户,在系统业务流中,存在大量的内部文件流转的需求。内部业务文件有不同的安全密级,最初在文件流转时,公司内部规定点对点的文件传输,要使用加密工具加密后再发给需要的一方。这种方式虽然能…...
【网络】Socket套接字
目录 一、端口号 二、初识TCP/UDP协议 三、网络字节序 3.1 概念 3.2 常用API 四、Socket套接字 4.1 概念 4.2 常用API (1)socket (2)bind sockaddr结构 (3)listen (4)a…...
蓝桥杯[每日一题] 真题:连连看
题目描述 小蓝正在和朋友们玩一种新的连连看游戏。在一个 n m 的矩形网格中,每个格子中都有一个整数,第 i 行第 j 列上的整数为 Ai, j 。玩家需要在这个网格中寻找一对格子 (a, b) − (c, d) 使得这两个格子中的整数 Aa,b 和 Ac,d 相等,且它…...
新手SEO优化实战快速入门
内容概要 对于SEO新手而言,系统化掌握基础逻辑与实操路径是快速入门的关键。本指南以站内优化为切入点,从网站结构、URL设计到内链布局,逐层拆解搜索引擎友好的技术框架;同时聚焦关键词挖掘与内容策略,结合工具使用与…...
Android面试总结之Glide源码级理解
当你的图片列表在低端机上白屏3秒、高端机因内存浪费导致FPS腰斩时,根源往往藏在Glide的内存分配僵化、磁盘混存、网络加载无优先级三大致命缺陷中。 本文从阿里P8级缓存改造方案出发,结合Glide源码实现动态内存扩容、磁盘冷热分区、智能预加载等黑科技&…...
基于类型属性的重载
算法重载 在一个泛型算法中引入更为特化的变体,这种设计和优化方式称为算法特化。之所以需要算法特化,原因有二: 针对特定类型使用更加合理的实现,对于const char *,less的第二个实现更加合理 template <typename…...
对称加密算法和非对称加密算法
在这个互联网普及的时代,在不同终端对敏感甚至机密数据进行传输是非常常见的场景,但是如何保证数据传输过程的安全性和高效性是一个值得深入探讨的问题。 为此,伟大的人类研究出了多种加密算法,我们可以大致将其分为两类…...
工程数字建造管理系统平台有哪些?好的数字建造管理系统推荐
一、什么是工程数字建造管理系统平台? 工程数字建造管理系统平台是一种集成了先进信息技术(如云计算、大数据、物联网等)的综合性管理工具,它旨在通过数字化手段提升工程建造全过程的管理效率和决策水平。这一平台不仅覆盖了工程…...
CMake ERROR: arm-none-eabi-gcc is not able to compile a simple test program.
用 cmake 构建 STM32 工程问题【已解决】 环境信息 os: ubuntu22.04gcc: arm-none-eabi-gcc (Arm GNU Toolchain 13.2.rel1 (Build arm-13.7)) 13.2.1 20231009cmake: cmake version 3.22.1ninja: 1.10.1 问题 log [main] 正在配置项目: Olidy [driver] 删除 /home/pomegr…...
容器主机CPU使用率突增问题一则
关键词 LINUX、文件系统crontab 、mlocate根目录使用率 There are many things that can not be broken! 如果觉得本文对你有帮助,欢迎点赞、收藏、评论! 一、问题现象 业务一台容器服务器,近期经常收到cpu不定期抖动告警&#x…...
CTFshow【命令执行】web29-web40 做题笔记
web29----过滤关键字 正则匹配,过滤flag,可以使用通配符绕过 先查看目录 使用通配符?查看flag 点击查看源代码 web30---过滤函数和关键字 看到过滤了system执行系统命令和flag,php关键字 找一个与其功能差不多的执行函数passthr…...
L2正则化:优化模型的平滑之道
常见的正则化方法1. **L1正则化(Lasso)**1.1基本原理1.2特点1.3数学推导1.4参数更新1.5选择合适的正则化系数1.6优点1.7缺点1.8实际应用中的注意事项1.9示例 2. **L2正则化(Ridge)**L2正则化的定义L2正则化如何防止过拟合1. **限制…...
Golang 的 GMP 调度机制常见问题及解答
文章目录 Golang GMP 调度模型详解常见问题基础概念1. GMP 各组件的作用是什么?2. 为什么 Go 需要自己的调度器?3. GOMAXPROCS 的作用是什么? 调度流程4. Goroutine 如何被调度到 M 上执行?5. 系统调用会阻塞整个线程吗࿱…...
使用VSCODE导致CPU占用率过高的处理方法
1:cpptools 原因:原因是C/C会在全局搜索文件,可以快速进行跳转;当打开的文件过大,全局搜索文件会占用大量CPU; 处理方法: 1:每次只打开小文件夹; 2:打开大文…...
17--华为防火墙智能选路全解:网络世界的智能导航系统
华为防火墙智能选路全解:网络世界的智能导航系统 开篇故事:快递小哥的烦恼与网络世界的相似性 想象你是个快递站站长,每天要处理来自全国各地的包裹。突然某天遇到: 🚚 双11爆仓:如何把包裹最快送到客户手…...
CSS-BFC(块级格式化上下文)
一、BFC 的本质理解(快递仓库比喻) 想象一个快递分拣仓库(BFC容器),这个仓库有特殊的规则: 仓库内的包裹(内部元素)摆放不影响其他仓库包裹必须整齐堆叠,不能越界不同仓…...
Java 大视界 -- Java 大数据在智慧港口集装箱调度与物流效率提升中的应用创新(159)
💖亲爱的朋友们,热烈欢迎来到 青云交的博客!能与诸位在此相逢,我倍感荣幸。在这飞速更迭的时代,我们都渴望一方心灵净土,而 我的博客 正是这样温暖的所在。这里为你呈上趣味与实用兼具的知识,也…...
ZygoPlanner:一种基于图形的三阶段框架,用于颧骨种植体植入的最佳术前规划|文献速递-医学影像人工智能进展
Title 题目 ZygoPlanner: A three-stage graphics-based framework for optimal preoperative planning of zygomatic implant placement ZygoPlanner:一种基于图形的三阶段框架,用于颧骨种植体植入的最佳术前规划 01 文献速递介绍 1.1 研究背景 颧…...
【2.项目管理】2.4 Gannt图【甘特图】
甘特图(Gantt)深度解析与实践指南 📊 一、甘特图基础模板 项目进度表示例 工作编号工作名称持续时间(月)项目进度(周)1需求分析3▓▓▓░░░░░░░2设计建模3░▓▓▓░░░░░░3编码开发3.5░░░▓▓▓▓░░…...
python学习笔记(1)
为什么要学python 目前在研究网站的搭建,想通过python搭建一个我的世界资源买卖的平台,然后就开始研究python了,其实这不是我第一次研究python了,之前学的都不咋样,现在温故而知新,好好研究一下python。 Python的变量 在此之前先简单的介绍一下变量,给第一次接触的小…...
刚刚整理实测可用的股票数据API接口集合推荐:同花顺、雅虎API、智兔数服、聚合数据等Python量化分析各项数据全面丰富
在金融科技高速发展的今天,股票API接口已成为开发者、量化交易者和金融从业者的核心工具之一。它通过标准化的数据接口,帮助用户快速获取实时或历史市场数据,为投资决策、策略回测和金融应用开发提供支持。本文将深入解析股票API的核心功能、…...
2025 年吉林省燃气企业从业人员考试:实用备考攻略与考试提分要点
2025 年吉林省燃气企业从业人员考试报名通过吉林燃气行业管理系统。报名资料包含企业的环保达标证明(燃气行业涉及环保要求)、个人的岗位任职证明等。实用备考攻略是,关注吉林在燃气分布式能源系统建设方面的进展,结合《燃气冷热电…...
dubbo http流量接入dubbo后端服务
简介 dubbo协议是基于TCP的二进制私有协议,更适合作为后端微服务间的高效RPC通信协议,也导致dubbo协议对于前端流量接入不是很友好。在dubo框架中,有两种方式可以解决这个问题: 多协议发布【推荐】,为dubbo协议服务暴…...
自动驾驶04:点云预处理03
点云组帧 感知算法人员在完成点云的运动畸变补偿后,会发现一个问题:激光雷达发送的点云数据包中的点云数量其实非常少,完全无法用来进行后续感知和定位层面的处理工作。 此时,感知算法人员就需要对这些数据包进行点云组帧的处理…...
小程序中过滤苹果设备中的表情(即 emoji)
在小程序中过滤苹果设备中的表情(即 emoji),通常需要考虑以下几个方面:识别 emoji、处理用户输入、以及在显示或存储时进行过滤。以下是具体的实现思路和步骤: 1. 理解苹果中的表情(Emoji) 苹果…...
软件性能测试中的“假阳性”陷阱
软件性能测试中的“假阳性”陷阱主要表现为错误警报频繁、资源浪费严重、测试可信度降低。其中,错误警报频繁是最常见且最严重的问题之一,“假阳性”现象会导致开发团队在解决不存在的问题上花费大量时间。据行业调查显示,超过30%的性能优化成…...
现代优雅品牌杂志包装徽标设计衬线英文字体安装包 Relish – Aesthetic Font
CS Relish – 美学字体:优雅与现代简约的结合 永恒的现代 Serif 字体 CS Relish 是一种现代衬线字体,将极简主义美学与精致精致融为一体。凭借其时尚、干净的字体和平衡的结构,它给人一种优雅和现代的印象。这款字体专为那些欣赏微妙和优雅的…...
《Oracle服务进程精准管控指南:23c/11g双版本内存优化实战》 ——附自动化脚本开发全攻略
正在学习或者是使用 Oracle 数据库的小伙伴,是不是对于那个一直启动且及其占用内存的后台进程感到烦躁呢?而且即使是手动去开关也显得即为麻烦,所以基于我之前所学习到的方法,我在此重新整理,让大家动动手指就能完成开…...
《寒门枭雄传》章回目录与核心故事设计(36回)
《寒门枭雄传》章回目录与核心故事设计(36回) 主线:寒门崛起→权力异化→制度轮回 核心冲突:个人奋斗 vs 制度性压迫 第一卷京口草鞋摊的野望(第1-12回) 主题:寒门之困始于生存,终…...
C语言学习笔记(抱佛脚版)
毕业一年,发现记性是真的差,每次想起之前的知识总是想不全,看别人写的资料也懵懵懂懂。于是我索性自己再学一遍,并且记录一下。希望对你们也有所帮助。 正片开始! 前面的什么if for都不难理解,嵌套的话也…...
DeepSeek-V3-0324 模型发布:开源 AI 性能再攀高峰,推理与编码能力逼近顶级闭源模型
2025 年 3 月 24 日,国内 AI 公司深度求索(DeepSeek)悄然推出 V3 模型的升级版本 DeepSeek-V3-0324。尽管此次更新并非市场期待的 V4 或 R2 版本,但其在推理速度、编码能力、数学推理及开源生态上的突破,仍迅速引发全球…...
清晰易懂的Cursor实现AI编程从安装到实战TodoList开发
一、Cursor简介与安装部署 什么是Cursor? Cursor是一款基于AI的智能代码编辑器,它集成了强大的AI编程助手功能,能够通过自然语言交互帮助开发者生成、优化和调试代码。与传统的代码编辑器不同,Cursor可以理解你的编程意图&#…...
(二) 深入了解AVFoundation - 播放:AVFoundation 播放基础入门
引言 AVFoundation 是 Apple 提供的强大多媒体框架,支持音视频播放、录制、处理等功能。在 iOS 开发中,AVFoundation 是实现视频播放的核心技术之一。 本篇文章将简单介绍如何使用 AVPlayer、AVPlayerItem 和 AVPlayerLayer 进行视频播放,并…...
重磅推出稳联技术Profinet转CANopen网关智能工厂解决方案!
重磅推出稳联技术Profinet转CANopen网关智能工厂解决方案! 稳联技术Profinet转CANopen网关应运而生——它如同一座智能桥梁☺,打通两大主流工业协议,让异构网络无缝互联,助您释放设备潜力,实现真正的“万物互联”&…...
【问题解决】Linux安装conda修改~/.bashrc配置文件后,root 用户下显示 -bash-4.2#
问题描述 在Linux安装conda下的python环境时候,修改了~/.bashrc文件,修改完成后,再次进入服务器后,登录时候显示的不是正常的[rootlocalhost ~]#,而是-bash-4.2# 原因分析: 网上原因有:/root下…...
关于deepseek
DeepSeek:领先的人工智能研究与创新公司 公司简介 DeepSeek(深度求索)是一家专注于人工智能(AI)技术研发的创新公司,致力于推动大模型、自然语言处理(NLP)、机器学习(M…...
EtherCAT转ProfiNet协议转换网关构建西门子PLC与海克斯康机器人的冗余通信链路
一、案例背景 某电子制造企业的5G通信模块组装线,采用西门子S7-1200PLC(ProfiNet主站)进行产线调度,而精密组装工序由3台海克斯康工业机器人(EtherCAT从站)完成。由于协议差异,机器人动作与PLC…...
李宏毅机器学习笔记(1)—机器学习基本概念+深度学习基本概念
机器学习基本概念 1、获取模型 步骤 1.1、假定未知函数 带未知参数的函数 1.2、定义损失函数 真实值:label MAE MSE 几率分布,cross-entropy? 1.3、优化 单独考虑一个参数 让损失函数最小,找导数为零的点 单独考虑w,w…...
RAG生成中的多文档动态融合及去重加权策略探讨
目录 RAG生成中的多文档动态融合及去重加权策略探讨 一、RAG生成概述 二、多文档动态融合策略 1. 拼接与分段编码 2. 独立编码与后续融合 3. 基于查询的动态加权 三、检索结果的去重与加权策略 1. 去重策略 2. 加权策略 四、实践中的挑战与思考 五、结语 RAG生成中的…...
对匿名认证的理解
概述:在 Spring Security 中,** 匿名认证(Anonymous Authentication)** 是一种特殊的认证机制,用于处理未提供有效凭证的请求。 匿名认证的本质 目的:允许未认证用户访问特定资源。原理: 当请求…...
leetcoed0044. 通配符匹配 hard
1 题目:通配符匹配 官方难度:难 给你一个输入字符串 (s) 和一个字符模式 ( p ) ,请你实现一个支持 ‘?’ 和 ‘*’ 匹配规则的通配符匹配: ‘?’ 可以匹配任何单个字符。 ‘*’ 可以匹配任意字符序列(包括空字符序…...
航拍数据集汇总,覆盖车辆/船舶检测/物体评估/城市景观……
随着无人机的普及化和计算机视觉技术的迅猛发展,无人机航拍作为一种创新的摄影方式,正以前所未有的速度走进大众视野。它打破了传统拍摄的局限,为我们开启了「上帝视角」。航拍硬件性能逐渐逼近物理极限,算法优化的难度也日益增大…...