当前位置: 首页 > news >正文

从代码学习深度学习 - 预训练word2vec PyTorch版

文章目录

  • 前言
  • 辅助工具
    • 1. 绘图工具 (`utils_for_huitu.py`)
    • 2. 数据处理工具 (`utils_for_data.py`)
    • 3. 训练辅助工具 (`utils_for_train.py`)
  • 预训练 Word2Vec - 主流程
    • 1. 环境设置与数据加载
    • 2. 跳元模型 (Skip-gram Model)
      • 2.1. 嵌入层 (Embedding Layer)
      • 2.2. 定义前向传播
    • 3. 训练
      • 3.1. 二元交叉熵损失
      • 3.2. 初始化模型参数
      • 3.3. 定义训练阶段代码
      • 3.4. 开始训练
    • 4. 应用词嵌入
  • 总结


前言

词嵌入(Word Embeddings)是自然语言处理(NLP)领域中的基石技术之一。它们将词语从稀疏的、高维的独热编码(one-hot encoding)表示转换为稠密的、低维的向量表示。这些向量能够捕捉词语之间的语义和句法关系,使得相似的词在向量空间中距离更近。Word2Vec是其中一种非常流行且有效的词嵌入算法,由Google的Tomas Mikolov等人在2013年提出。它主要包含两种模型架构:CBOW(Continuous Bag-of-Words,连续词袋模型)和Skip-gram(跳字模型)。

本篇博客将聚焦于Skip-gram模型,并结合**负采样(Negative Sampling)**这一重要的优化技巧,通过PyTorch框架从零开始实现一个Word2Vec模型。我们将详细探讨数据预处理的每一个步骤,如何构建模型,如何进行训练,以及训练完成后如何应用得到的词向量来寻找相似词。通过深入代码细节,我们希望能帮助读者更好地理解Word2Vec的内部工作原理及其在PyTorch中的实现。

我们将依赖一系列辅助脚本来处理数据、可视化训练过程以及进行模型训练。让我们一步步揭开Word2Vec的神秘面纱。

完整代码:下载链接

辅助工具

在构建和训练Word2Vec模型之前,我们首先介绍一下项目中用到的一些辅助Python脚本。这些脚本提供了数据加载、预处理、可视化以及训练监控等常用功能。

1. 绘图工具 (utils_for_huitu.py)

这个脚本主要封装了使用matplotlib进行绘图的常用函数,特别是在Jupyter Notebook环境中,它包含了一个Animator类,可以动态地展示训练过程中的损失变化。

# 导入必要的包
import matplotlib.pyplot as plt  # 用于创建和操作 Matplotlib 图表
from matplotlib_inline import backend_inline  # 用于在Jupyter中设置Matplotlib输出格式
from IPython import display  # 用于后续动态显示(如 Animator)
import torch  # 导入PyTorch库,用于处理张量类型的图像
import numpy as np  # 导入NumPy,可能用于数据处理
import matplotlib as mpl  # 导入Matplotlib主模块,用于设置图像属性def set_figsize(figsize=(3.5, 2.5)):"""设置matplotlib图形的大小参数:figsize: tuple[float, float] - 图形大小,形状为 (宽度, 高度),单位为英寸输出:无返回值"""plt.rcParams['figure.figsize'] = figsize  # 设置图形默认大小def use_svg_display():"""使用 SVG 格式在 Jupyter 中显示绘图输入:无输出:无返回值"""backend_inline.set_matplotlib_formats('svg')  # 设置 Matplotlib 使用 SVG 格式def set_axes(axes, xlabel, ylabel, xlim, ylim, xscale, yscale, legend):"""设置 Matplotlib 的轴  输入:axes: Matplotlib 的轴对象  # 输入参数:轴对象xlabel: x 轴标签  # 输入参数:x 轴标签ylabel: y 轴标签  # 输入参数:y 轴标签xlim: x 轴范围  # 输入参数:x 轴范围ylim: y 轴范围  # 输入参数:y 轴范围xscale: x 轴刻度类型  # 输入参数:x 轴刻度类型yscale: y 轴刻度类型  # 输入参数:y 轴刻度类型legend: 图例标签列表  # 输入参数:图例标签输出:无返回值  # 函数无显式返回值"""axes.set_xlabel(xlabel)  # 设置 x 轴标签axes.set_ylabel(ylabel)  # 设置 y 轴标签axes.set_xscale(xscale)  # 设置 x 轴刻度类型axes.set_yscale(yscale)  # 设置 y 轴刻度类型axes.set_xlim(xlim)  # 设置 x 轴范围axes.set_ylim(ylim)  # 设置 y 轴范围if legend:  # 检查是否提供了图例标签axes.legend(legend)  # 如果有图例,则设置图例axes.grid()  # 为轴添加网格线class Animator:"""在动画中绘制数据,仅针对一张图的情况"""def __init__(self, xlabel=None, ylabel=None, legend=None, xlim=None,ylim=None, xscale='linear', yscale='linear',fmts=('-', 'm--', 'g-.', 'r:'), nrows=1, ncols=1,figsize=(3.5, 2.5)):"""初始化 Animator 类 输入:xlabel: x 轴标签,默认为 None  # 输入参数:x 轴标签ylabel: y 轴标签,默认为 None  # 输入参数:y 轴标签legend: 图例标签列表,默认为 None  # 输入参数:图例标签xlim: x 轴范围,默认为 None  # 输入参数:x 轴范围ylim: y 轴范围,默认为 None  # 输入参数:y 轴范围xscale: x 轴刻度类型,默认为 'linear'  # 输入参数:x 轴刻度类型yscale: y 轴刻度类型,默认为 'linear'  # 输入参数:y 轴刻度类型fmts: 绘图格式元组,默认为 ('-', 'm--', 'g-.', 'r:')  # 输入参数:线条格式nrows: 子图行数,默认为 1  # 输入参数:子图行数ncols: 子图列数,默认为 1  # 输入参数:子图列数figsize: 图像大小元组,默认为 (3.5, 2.5)  # 输入参数:图像大小输出:无返回值  # 方法无显式返回值定义位置::numref:`sec_softmax_scratch`  # 指明定义的参考位置"""if legend is None:  # 检查 legend 是否为 Nonelegend = []  # 如果为 None,则初始化为空列表use_svg_display()  # 设置绘图显示为 SVG 格式self.fig, self.axes = plt.subplots(nrows, ncols, figsize=figsize)  # 创建绘图对象和子图if nrows * ncols == 1:  # 判断是否只有一个子图self.axes = [self.axes, ]  # 如果是单个子图,将 axes 转为列表self.config_axes = lambda: set_axes(  # 定义 lambda 函数配置坐标轴self.axes[0], xlabel, ylabel, xlim, ylim, xscale, yscale, legend)  # 调用 set_axes 设置参数self.X, self.Y, self.fmts = None, None, fmts  # 初始化数据和格式属性def add(self, x, y):"""向图表中添加多个数据点  输入:x: x 轴数据点  # 输入参数:x 轴数据y: y 轴数据点  # 输入参数:y 轴数据输出:无返回值  # 方法无显式返回值"""if not hasattr(y, "__len__"):  # 检查 y 是否具有长度属性(是否可迭代)y = [y]  # 如果不可迭代,将 y 转为单元素列表n = len(y)  # 获取 y 的长度if not hasattr(x, "__len__"):  # 检查 x 是否具有长度属性x = [x] * n  # 如果不可迭代,将 x 扩展为与 y 同长度的列表if not self.X:  # 检查 self.X 是否已初始化self.X = [[] for _ in range(n)]  # 如果未初始化,为每条线创建空列表if not self.Y:  # 检查 self.Y 是否已初始化self.Y = [[] for _ in range(n)]  # 如果未初始化,为每条线创建空列表for i, (a, b) in enumerate(zip(x, y)):  # 遍历 x 和 y 的数据对if a is not None and b is not None:  # 检查数据点是否有效self.X[i].append(a)  # 将 x 数据点添加到对应列表self.Y[i].append(b)  # 将 y 数据点添加到对应列表self.axes[0].cla()  # 清除当前轴的内容for x, y, fmt in zip(self.X, self.Y, self.fmts):  # 遍历所有数据和格式self.axes[0].plot(x, y, fmt)  # 绘制每条线self.config_axes()  # 调用 lambda 函数配置坐标轴display.display(self.fig)  # 显示当前图形display.clear_output(wait=True)  # 标记当前输出为待清除,但由于 wait=True,它不会立即清除,而是等待下一次 display.display()。def show_list_len_pair_hist(legend, xlabel, ylabel, xlist, ylist):"""绘制列表长度对的直方图,用于比较两组列表中元素长度的分布参数:legend: list[str] - 图例标签,形状为 (2,),分别对应xlist和ylist的标签xlabel: str - x轴标签ylabel: str - y轴标签xlist: list[list] - 第一组列表,形状为 (样本数量, 每个样本的元素数)ylist: list[list] - 第二组列表,形状为 (样本数量, 每个样本的元素数)输出:无返回值,但会显示生成的直方图"""set_figsize()  # 设置图形大小# plt.hist返回的三个值:# n: list[array] - 每个bin中的样本数量,形状为 (2, bin数量)# bins: array - bin的边界值,形状为 (bin数量+1,)# patches: list[list[Rectangle]] - 直方图的矩形对象,形状为 (2, bin数量)_, _, patches = plt.hist([[len(l) for l in xlist], [len(l) for l in ylist]])  # 绘制两组数据长度的直方图plt.xlabel(xlabel)  # 设置x轴标签plt.ylabel(ylabel)  # 设置y轴标签# 为第二组数据(ylist)的直方图添加斜线图案,以区分两组数据for patch in patches[1].patches:  # patches[1]是ylist对应的矩形对象列表patch.set_hatch('/')  # 设置填充图案为斜线plt.legend(legend)  # 添加图例

解读

  • set_figsizeuse_svg_display 用于基础的Matplotlib绘图设置。
  • set_axes 是一个通用的函数,用于配置图表的坐标轴标签、范围、刻度类型和图例。
  • Animator 类是实现动态绘图的关键。在训练循环中,我们可以周期性地调用其add方法,传入当前的训练轮次(或迭代次数)和对应的损失值(或其他指标)。Animator会清除旧的图像并重新绘制,从而在Jupyter Notebook中形成动画效果,直观地展示训练趋势。
  • show_list_len_pair_hist 函数用于绘制两个列表集合中,各子列表长度分布的直方图,方便进行数据分析和比较。

2. 数据处理工具 (utils_for_data.py)

这个脚本是Word2Vec数据预处理的核心,包含了从读取原始文本、构建词汇表、下采样、生成中心词-上下文词对、负采样到最终打包成PyTorch DataLoader的完整流程。

from collections import Counter  # 导入 Counter 类
from collections import Counter  # 用于词频统计
import torch  # PyTorch 核心库
from torch.utils import data  # PyTorch 数据加载工具
import numpy as np  # NumPy 用于数组操作
import random  # 导入随机模块,用于下采样和负采样
import math  # 导入数学函数模块,用于概率计算
import osdef count_corpus(tokens):"""统计词元的频率参数:tokens: 词元列表,可以是:- 一维列表,例如 ['a', 'b']- 二维列表,例如 [['a', 'b'], ['c']]返回值:Counter: Counter 对象,统计每个词元的出现次数"""# 如果输入为空列表,直接返回空计数器if not tokens:  # 等价于 len(tokens) == 0return Counter()# 检查输入是否为二维列表if isinstance(tokens[0], list):# 将二维列表展平为一维列表flattened_tokens = [token for sublist in tokens for token in sublist]else:# 如果是一维列表,直接使用原列表flattened_tokens = tokens# 使用 Counter 统计词频并返回return Counter(flattened_tokens)class Vocab:"""文本词表类,用于管理词元及其索引的映射关系"""def __init__(self, tokens=None, min_freq=0, reserved_tokens=None):"""初始化词表Args:tokens: 输入的词元列表,可以是1D或2D列表,默认为空列表min_freq: 词元最小出现频率,小于此频率的词元将被忽略,默认为0reserved_tokens: 预留的特殊词元列表(如'<pad>'),默认为空列表"""# 处理默认参数self.tokens = tokens if tokens is not None else []self.reserved_tokens = reserved_tokens if reserved_tokens is not None else []# 统计词元频率并按频率降序排序counter = self._count_corpus(self.tokens)self._token_freqs = sorted(counter.items(), key=lambda x: x[1], reverse=True)# 初始化词表,'<unk>'为未知词元,索引为0self.idx_to_token = ['<unk>'] + self.reserved_tokensself.token_to_idx = {token: idx for idx, token in enumerate(self.idx_to_token)}# 添加满足最小频率要求的词元到词表for token, freq in self._token_freqs:if freq < min_freq:breakif token not in self.token_to_idx:self.idx_to_token.append(token)self.token_to_idx[token] = 

相关文章:

从代码学习深度学习 - 预训练word2vec PyTorch版

文章目录 前言辅助工具1. 绘图工具 (`utils_for_huitu.py`)2. 数据处理工具 (`utils_for_data.py`)3. 训练辅助工具 (`utils_for_train.py`)预训练 Word2Vec - 主流程1. 环境设置与数据加载2. 跳元模型 (Skip-gram Model)2.1. 嵌入层 (Embedding Layer)2.2. 定义前向传播3. 训练…...

OpenCV图像边缘检测

1.概念 图像边缘检测是计算机视觉和图像处理中的基础任务&#xff0c;用于识别图像中像素值发生剧烈变化的区域&#xff0c;这些区域通常对应物体的边界、纹理变化或噪声。 1.1原理 图像中的边缘通常表现为灰度值的突变&#xff08;如从亮到暗或从暗到亮的急剧变化&#xff09…...

AI能源危机:人工智能发展与环境可持续性的矛盾与解决之道

AI对能源的渴求正在演变成一个巨大的挑战。这不仅仅关乎电费支出&#xff0c;其环境影响也十分严重&#xff0c;包括消耗宝贵的水资源、产生大量电子垃圾&#xff0c;以及增加温室气体排放。 随着AI模型变得越来越复杂并融入我们生活的更多领域&#xff0c;一个巨大的问题悬而…...

基于flask+vue的电影可视化与智能推荐系统

基于flaskvue爬虫的电影数据的智能推荐与可视化系统&#xff0c;能展示电影评分、评论情感分析等直观的数据可视化图表&#xff0c;还能通过协同过滤算法为用户提供个性化电影推荐&#xff0c;帮助用户发现更多感兴趣的电影作品&#xff0c;具体界面如图所示。 本系统主要技术架…...

初步认识HarmonyOS NEXT端云一体化开发

视频课程学习报名入口:HarmonyOS NEXT端云一体化开发 1、课程设计理念 本课程采用"四维能力成长模型"设计理念,通过“能看懂→能听懂→能上手→能实战”的渐进式学习路径,帮助零基础开发者实现从理论认知到商业级应用开发的跨越。该模型将学习过程划分为四个维度…...

基于单片机的车辆防盗系统设计与实现

标题:基于单片机的车辆防盗系统设计与实现 内容:1.摘要 随着汽车保有量的不断增加&#xff0c;车辆被盗问题日益严峻&#xff0c;车辆防盗成为人们关注的焦点。本研究的目的是设计并实现一种基于单片机的车辆防盗系统。采用单片机作为核心控制单元&#xff0c;结合传感器技术、…...

LSM Tree算法原理

LSM Tree(Log-Structured Merge Tree)是一种针对写密集型场景优化的数据结构,广泛应用于LevelDB、RocksDB等数据库引擎中。其核心原理如下: ‌1. 写入优化:顺序写代替随机写‌ ‌内存缓冲(MemTable)‌:写入操作首先被写入内存中的数据结构(如跳表或平衡树),…...

通过 API 获取 1688 平台店铺所有商品信息的完整流程

在电商运营和数据分析中&#xff0c;获取 1688 平台店铺的商品信息是一项重要的任务。1688 作为国内领先的 B2B 电商平台&#xff0c;提供了丰富的开放平台 API 接口&#xff0c;方便开发者获取店铺商品的详细信息。本文将详细介绍如何通过 Python 调用 1688 的 API 接口&#…...

Python代码加密与发布方案详解

更多内容请见: python3案例和总结-专栏介绍和目录 文章目录 一、基础加密方案二、商业级加密方案三、高级混淆方案四、商业化发布方案五、反逆向技术六、最佳实践建议七、常见问题解决Python作为解释型语言,其源代码容易被查看和修改。本文将详细介绍多种Python代码保护方案,…...

Tractor S--二维转一维,然后最小生成树

P3073 [USACO13FEB] Tractor S - 洛谷 转成一维点图&#xff0c;然后最小生成树&#xff0c;最后的最大值就是最后一个点&#xff0c;记得记录维护连通块 同样的二维转一维---Cow Ski Area G---二维图转一维tarjan缩点-CSDN博客 #include<bits/stdc.h> using namespac…...

5月20日day31打卡

文件的规范拆分和写法 知识点回顾 规范的文件命名规范的文件夹管理机器学习项目的拆分编码格式和类型注解 作业&#xff1a;尝试针对之前的心脏病项目&#xff0c;准备拆分的项目文件&#xff0c;思考下哪些部分可以未来复用。 补充介绍&#xff1a; pyc文件的介绍 知识点回顾 …...

基于Spring Boot + Vue的教师工作量管理系统设计与实现

一、项目简介 随着高校信息化管理的发展&#xff0c;教师工作量管理成为教务系统中不可或缺的一部分。为此&#xff0c;我们设计并开发了一个基于 Spring Boot Vue 的教师工作量管理系统&#xff0c;系统结构清晰&#xff0c;功能完备&#xff0c;支持管理员和教师两个角色。…...

海康工业相机白平衡比选择器对应的值被重置后,如何恢复原成像

做项目的时候&#xff0c;有时候手抖&#xff0c;一不小心把一个成熟稳定的项目的相机配置&#xff0c;重置了&#xff0c;如何进行恢复呢&#xff0c;在不知道之前配置数据的情况下。 我在做项目的时候&#xff0c;为了让这个相机成像稳定一点&#xff0c;尤其是做颜色检测时…...

VMWare清理后,残留服务删除方案详解

VMWare清理后&#xff0c;残留服务删除方案详解 在虚拟化技术日益普及的今天&#xff0c;VMWare作为行业领先的虚拟化软件&#xff0c;广泛应用于企业和服务器的管理中。然而&#xff0c;由于其复杂的架构和深层次的系统集成&#xff0c;VMWare的卸载过程往往并不顺利。即使通…...

STM32定时器简单采集编码器脉冲

MCU&#xff1a;STM32H723ZGT6 编码器&#xff1a;&#xff08;欧姆龙&#xff09;E6B2-CWZ1X&#xff1b;1000P/R&#xff1b;8根线信号线分别为 A A- B B- Z Z- 以及5V和GND&#xff1b; A 脉冲输出 B 脉冲输出 Z 零点信号 当编码器旋转到零点时&#xff0c;Z信号会发出一个脉…...

第 4 章:网络与总线——CAN / Ethernet / USB-OTG

本章目标: 深入理解三种关键通信总线(CAN、Ethernet、USB-OTG)的协议架构、硬件接口与软件驱动 掌握 STM32(或同类 MCU)中各总线的寄存器配置、中断/DMA 驱动框架 通过实战案例,实现基于 CAN 总线的节点通信、基于 Ethernet 的 TCP/IP 通信,以及基于 USB-OTG 的虚拟串口…...

【python进阶知识】Day 31 文件的规范拆分和写法

知识点 规范的文件命名规范的文件夹管理机器学习项目的拆分编码格式和类型注解 机器学习流程 - 数据加载&#xff1a;从文件、数据库、API 等获取原始数据。 - 命名参考&#xff1a;load_data.py 、data_loader.py - 数据探索与可视化&#xff1a;了解数据特性&#xff0c;初期…...

leetcode 162. Find Peak Element

题目描述 如果nums[i-1]<nums[i]并且nums[i]>nums[i1]&#xff0c;那么nums[i]就是峰值。除此情况之外&#xff0c;nums[i-1]和nums[i1]至少有一个大于nums[i]&#xff0c;因为题目已经保证相邻的元素不相等。坚持向上坡方向走一定能达到一个峰值&#xff0c;如果往两边走…...

2025系统架构师---案例题(押题)

1. 微服务相关的概念: 微服务是一种架构风格,它将单体应用划分为一组小服务,服务之间相互协作,实现业务功能每个服务运行在独立的进程中,服务间采用轻量级的通信机制协作(通常是HTTP/JSON),每个服务围绕业务能力进行构建,并且能够通过自动化机制独立的部署。 微服务有…...

t检验详解:原理、类型与应用指南

t检验详解&#xff1a;原理、类型与应用指南 t检验&#xff08;t-test&#xff09;是一种用于比较两组数据均值是否存在显著差异的统计方法&#xff0c;适用于数据近似正态分布且满足方差齐性的场景。以下从核心原理、检验类型、实施步骤到实际应用进行系统解析。 一、t检验的…...

使用 OpenCV 实现万花筒效果

万花筒效果&#xff08;Kaleidoscope Effect&#xff09;是一种图像处理效果&#xff0c;通过对图像进行对称旋转或镜像处理&#xff0c;产生具有多重反射和对称的艺术效果。它常用于视频编辑、视觉艺术、游戏设计等领域&#xff0c;为图像添加富有创意和视觉冲击力的效果。 在…...

Rocketmq broker 是主从架构还是集群架构,可以故障自动转移吗

RocketMQ Broker的架构与故障转移机制 RocketMQ的Broker架构同时采用了主从架构和集群架构&#xff0c;并且支持故障自动转移。下面详细说明&#xff1a; 一、架构类型 1. 集群架构 RocketMQ天然支持分布式集群部署 一个RocketMQ集群包含多个Broker组(每组有主从) 不同Bro…...

MySQL中添加一个具有创建数据库权限的用户

要在MySQL中添加一个具有创建数据库权限的用户&#xff0c;可按以下步骤操作&#xff1a; 1. 登录MySQL 使用拥有足够权限&#xff08;一般是root用户 &#xff09;的账号登录到MySQL数据库。在命令行输入&#xff1a; mysql -u root -p然后输入对应的密码&#xff0c;即可进…...

Go语言使用通义灵码辅助开发 - AI编程助手提升效率

一、引言 Go 语言以其高效性能和简洁语法&#xff0c;成为构建微服务、分布式系统及高性能后端的首选。对于有其他语言编程经验的开发者和初学者&#xff0c;入门 Go 语言时&#xff0c;如何快速开发第一个程序是关键。传统方式如慢慢摸索、向老师请教或查找资料&#xff0c;效…...

演示:【WPF-WinCC3D】 3D工业组态监控平台源代码

一、目的&#xff1a;分享一个应用WPF 3D开发的3D工业组态监控平台源代码 二、功能介绍 WPF-WinCC3D是基于 WPF 3D研发的工业组态软件&#xff0c;提供将近200个预置工业模型&#xff08;机械手臂、科幻零部件、熔炼生产线、机加生产线、管道等&#xff09;&#xff0c;支持组态…...

Oracle资源管理器

14.8资源管理器 14.8.1资源管理器的功能和控制种类 传统意义上&#xff0c;系统的资源分配是由 OS 来完成的&#xff0c;但是对于数据库资源&#xff0c;OS 分配资源会带来一些问题。以 Linux 为例&#xff0c;最为突出的一个问题是&#xff1a;Linux 的资源调度是基于进程的&…...

下载Ubuntu 64 位

学习目标&#xff1a; 下载 学习内容&#xff1a; 学习时间&#xff1a; 学习时间为学习时间 学习时间筋肉人为学习时间future 内容为笔记【有时比较抽象&#xff0c;有时比较过于详细&#xff0c;请宽恕。作者可能写的是仅个人笔记&#xff0c;筋肉人future】 学习产出&…...

ubuntu14.04/16.06 安装vscode(实测可以用)

地址&#xff1a;https://code.visualstudio.com/updates/v1_38 选择deb 这个版本还支持ubuntu14.04和16.06 sudo dpkg -i code_1.38.1-1568209190_amd64.deb sudo apt-get install -f安装成功&#xff0c;正常使用...

Linux命令大全

前言&#xff1a;工作中或多或少都会用到Linux服务器&#xff0c;我为大家分享一下常用命令 一丶文件与目录操作 命令作用示例ls列出目录内容ls -l&#xff08;详细列表&#xff09;cd切换目录cd /homepwd显示当前目录路径pwdmkdir创建目录mkdir -p dir1/dir2&#xff08;递归…...

spark的缓存提升本质以及分区数量和task执行时间的先后

文章目录 示例代码缓存效果分析第1次 user.count第2次 user.count——这里解释了spark缓存提升的本质原因关于分区数量和task数量以及task的执行流程有多少个分区就有多少线程task并发执行不同分区数量对计算效率的提升 示例代码 import org.apache.spark.storage.StorageLeve…...

SQL次日留存率计算精讲:自连接与多字段去重的深度应用

一、问题拆解&#xff1a;理解次日留存率的计算逻辑 1.1 业务需求转换 题目&#xff1a;运营希望查看用户在某天刷题后第二天还会再来刷题的留存率。 关键分析点&#xff1a; 留存率 &#xff08;第一天刷题且第二天再次刷题的用户数&#xff09; / 第一天刷题的总用户数需…...

PostgreSQL初体验

目录 一&#xff1a;PostgreSQL 1.简介 3.优势 4.架构 5.应用场景 6.结论 二&#xff1a;安装PostgreSQL 1.编译安装 三&#xff1a;PostgreSQL架构 1.PG的逻辑结构 2.PG的物理结构 前言 在数据驱动的时代&#xff0c;掌握 PostgreSQL 这一全球顶尖的开源关系型数据…...

Vue 3.0 Transition 组件使用详解

Vue 3.0 的 Transition 组件提供了一种简单的方式来为元素或组件的进入/离开添加动画效果。下面是使用<script setup>语法糖的实现方式。 1. 基本用法 使用场景&#xff1a;当需要为元素的显示/隐藏添加简单的淡入淡出效果时&#xff0c;这是最基础的过渡实现方式。 &…...

深入浅出IIC协议 - 从总线原理到FPGA实战开发 -- 第三篇:Verilog实现I2C Master核

第三篇&#xff1a;Verilog实现I2C Master核 副标题 &#xff1a;从零构建工业级I2C控制器——代码逐行解析与仿真实战 1. 架构设计 1.1 模块分层设计 三层架构 &#xff1a; 层级功能描述关键信号PHY层物理信号驱动与采样sda_oe, scl_oe控制层协议状态机与数据流控制state…...

通义灵码助力JavaScript开发:快速获取API与智能编码技巧

一、引言 JavaScript 拥有丰富的 API 生态&#xff0c;从浏览器的 Web API 到 Node.js 的环境生态&#xff0c;为开发者提供了强大的工具和库。然而&#xff0c;面对如此庞大的生态系统&#xff0c;开发者常常需要花费大量时间翻阅文档来查找和学习如何使用这些 API。通义灵码…...

ubuntu kubeasz 部署高可用k8s 集群

ubuntu kubeasz 部署高可用k8s 集群 测试环境主机列表软件清单kubeasz 部署高可用 kubernetes配置源配置host文件安装 ansible 并进行 ssh 免密登录:下载 kubeasz 项⽬及组件部署集群部署各组件开始安装修改 config 配置文件增加 master 节点增加 kube_node 节点登录dashboard…...

如何看待镍钯金PCB在当代工业制造中的地位和应用?

随着电子科技的飞速发展&#xff0c;电路板作为电子设备的核心组成部分&#xff0c;其制造材料和工艺也在不断进步。镍钯金&#xff08;NiPdAu&#xff09;电路板因其独特的物理和化学性质&#xff0c;在众多领域得到了广泛应用。本文将探讨镍钯金电路板的主要应用领域&#xf…...

Datawhale PyPOTS时间序列5月第4次笔记

端到端学习&#xff1a;使用一个模型直接接受包含缺失值的数据。 brits_classification.py 完整代码如下&#xff1a; # brits_classification.pyfrom benchpots.datasets import preprocess_physionet2012 from pypots.classification import BRITS from pypots.nn.function…...

(05)数字化转型之生产制造:从通常的离散制造到柔性化生产的全景指南

当今制造业正经历着前所未有的数字化变革&#xff0c;从传统的离散制造到流程制造&#xff0c;再到新兴的项目制造和柔性制造&#xff0c;各种生产模式都在加速向智能化方向演进。本文将系统性地介绍制造业生产管理的完整体系&#xff0c;为企业数字化转型提供全面的方法论和实…...

JMeter 教程:JSON 断言的简单介绍

目录 JMeter 教程&#xff1a;JSON 断言的简单介绍【快速上手】 ✅ 什么是 JSON 断言&#xff1f; &#x1f6e0;️ 使用前提 &#x1f4c4; JSON 断言添加步骤 步骤一&#xff1a;添加 JSON Assertion &#x1f4cc; 示例说明 ✅ 常用 JSONPath 写法速查 ✅ 断言结果查…...

RedissonClient主要功能概述

以下是 RedissonClient 提供的主要功能和特性的详细用法说明&#xff0c;结合代码示例和实际应用场景&#xff1a; 1. 分布式集合与映射 Redisson 提供了多种线程安全的分布式集合和映射&#xff0c;适用于分布式环境下的数据存储和操作。 RMap&#xff08;分布式 Map&#x…...

USB学习【13】STM32+USB接收数据过程详解

目录 1.官方的描述2.HAL的流程把接收到的数据从PMA拷贝到用户自己定义的空间中 3.处理接收到的数据4.最后再次开启准备接收工作 1.官方的描述 2.HAL的流程 以上的官方说法我们暂时按下不表。 如果接收到数据&#xff0c;会激活中断进入到USB_LP_CAN1_RX0_IRQHandler&#xff0…...

更新2011-2025经济类联考 396-真题+解析 PDF

目录树&#xff1a; ├── 2011-2025经综-真题 │ ├── 2011年396经济联考综合能力真题 .pdf │ ├── 2012年396经济联考综合能力真题 .pdf │ ├── 2013年396经济联考综合能力真题 .pdf │ ├── 2014年396经济联考综合能力真题 .pdf │ ├── 2015年396经…...

string在c语言中代表什么(非常详细)

在 C 语言中&#xff0c;string 更多让人联想到的是 <string.h> 这个标准库。 <string.h> 库为我们提供了一系列用于操作字符串的函数接口&#xff0c;就像是一个功能强大的工具箱&#xff0c;让程序员能够方便地对字符串进行各种操作。 例如&#xff0c;当我们想…...

JIT即时编译器全面剖析:原理、实现与优化

引言 在现代软件开发领域&#xff0c;性能优化一直是开发者关注的核心问题之一。随着计算能力的提升和应用场景的多元化&#xff0c;如何提高程序运行效率成为技术发展的关键驱动力。即时编译器&#xff08;Just-In-Time Compiler&#xff0c;简称JIT&#xff09;作为一项革命性…...

电网中窃电分析:概念、算法与应用

一、引言 在现代电力系统中&#xff0c;窃电行为是一个严重影响电网经济运行和供电秩序的问题。窃电不仅导致供电企业的经济损失&#xff0c;破坏了电力市场的公平性&#xff0c;还可能对电网的安全稳定运行构成威胁&#xff0c;甚至引发安全事故。随着科技的不断进步&#xff…...

从零开始的嵌入式学习day24

标准IO 头文件需求&#xff1a; #include <stdio.h>1.fopen和fclose (1)fopen fopen的函数功能是打开一个文件。 首先看看fopen的函数声明&#xff1a; FILE *fopen(const char *path, const char *mode);第一个参数path是文件地址&#xff0c;传入的是不可变的字符…...

高级SQL技巧:窗口函数与复杂查询优化实战

高级SQL技巧&#xff1a;窗口函数与复杂查询优化实战 开篇&#xff1a;数据库开发中的挑战 在现代企业级应用中&#xff0c;数据库不仅是存储数据的核心组件&#xff0c;更是处理复杂业务逻辑的重要工具。然而&#xff0c;随着数据量和并发请求的不断增长&#xff0c;传统的S…...

C++修炼:map和set的使用

Hello大家好&#xff01;很高兴我们又见面啦&#xff01;给生活添点passion&#xff0c;开始今天的编程之路&#xff01; 我的博客&#xff1a;<但凡. 我的专栏&#xff1a;《编程之路》、《数据结构与算法之美》、《题海拾贝》、《C修炼之路》 欢迎点赞&#xff0c;关注&am…...

ABC 355

D. Intersecting Intervals 首先思考两个区间相交会有哪些情况&#xff1a;有两种左右端点包含&#xff0c;一种大区间包含小区间。 但是反过来思考&#xff0c;两个区间不相交只会有两种情况&#xff1a;Ri < Lj 和 Rj < Li。非常典型的逆向思考 对左右端点升序排序后&a…...