LSTM-GAN生成数据技术
1. 项目概述
本项目利用生成对抗网络(GAN)技术来填补时间序列数据中的缺失值。项目实现了两种不同的GAN模型:基于LSTM的GAN(LSTM-GAN)和基于多层感知机的GAN(MLP-GAN),并对两种模型的性能进行了对比分析。
2. 技术原理
生成对抗网络(GAN)由生成器和判别器两部分组成:
- 生成器:学习数据分布并生成与真实数据相似的样本
- 判别器:区分真实数据和生成数据
在缺失值填补任务中,GAN通过学习完整数据的分布特征,生成符合原始数据统计特性的值来填补缺失部分。本项目实现了两种生成器:
- LSTM生成器:利用长短期记忆网络捕捉时间序列数据的时序依赖关系
- MLP生成器:使用多层感知机学习数据的一般特征
3. 代码结构
├── 数据加载与预处理
│ ├── 加载数据
│ └── 数据预处理,包括标准化和创建训练集
├── 模型定义
│ ├── 基于LSTM的生成器
│ ├── 基于MLP的生成器
│ └── 判别器
├── 模型训练与评估
│ ├── 训练GAN模型
│ ├── 使用训练好的生成器填补缺失值
│ └── 评估模型性能
└── 主函数└── 执行完整的训练和评估流程
4. 核心功能实现
4.1 数据预处理
数据预处理过程包括以下步骤:
def preprocess_data(original_data, missing_data):# 创建缺失值掩码mask = missing_data.isnull().astype(float).values# 使用中位数填充缺失值(临时填充,用于标准化)missing_filled = missing_data.fillna(missing_data.median())# 对每列数据进行标准化处理for i, column in enumerate(original_data.columns):scaler = MinMaxScaler()original_scaled[:, i] = scaler.fit_transform(original_data.iloc[:, i].values.reshape(-1, 1)).flatten()missing_scaled[:, i] = scaler.transform(missing_filled.iloc[:, i].values.reshape(-1, 1)).flatten()column_scalers[i] = scaler# 创建PyTorch数据加载器train_dataset = TensorDataset(torch.FloatTensor(original_scaled))train_loader = DataLoader(train_dataset, batch_size=64, shuffle=True)
关键点:
- 使用掩码(mask)标记缺失值位置
- 采用MinMaxScaler进行数据标准化
- 保存原始数据的统计信息,用于后续反标准化
- 创建PyTorch数据加载器,便于批量训练
4.2 模型架构
4.2.1 LSTM生成器
LSTM生成器结合了LSTM网络和注意力机制,用于捕捉时间序列数据的时序依赖关系:
class LSTMGenerator(nn.Module):def __init__(self, input_dim, hidden_dim, output_dim, num_layers=2):super(LSTMGenerator, self).__init__()# 输入层self.input_layer = nn.Sequential(nn.Linear(input_dim, hidden_dim),nn.BatchNorm1d(hidden_dim),nn.LeakyReLU(0.2),nn.Dropout(0.2))# LSTM层self.lstm = nn.LSTM(hidden_dim, hidden_dim, num_layers, batch_first=True, bidirectional=True, dropout=0.2)# 注意力机制self.attention = nn.Sequential(nn.Linear(hidden_dim * 2, hidden_dim),nn.Tanh(),nn.Linear(hidden_dim, 1),nn.Softmax(dim=1))# 输出层self.output_layer = nn.Sequential(nn.Linear(hidden_dim * 2, hidden_dim),nn.LeakyReLU(0.2),nn.Dropout(0.2),nn.Linear(hidden_dim, output_dim),nn.Sigmoid())# 残差连接self.residual = nn.Linear(input_dim, output_dim)# 权重初始化self._initialize_weights()
关键特性:
- 使用双向LSTM捕捉时序依赖
- 引入注意力机制增强模型表达能力
- 采用批归一化和Dropout防止过拟合
- 使用残差连接改善梯度流动
- 自定义权重初始化提高训练稳定性
4.2.2 MLP生成器
MLP生成器使用多层感知机学习数据的一般特征:
class MLPGenerator(nn.Module):def __init__(self, input_dim, hidden_dim, output_dim):super(MLPGenerator, self).__init__()self.main = nn.Sequential(nn.Linear(input_dim, hidden_dim),nn.LeakyReLU(0.2),nn.Dropout(0.1),nn.Linear(hidden_dim, hidden_dim),nn.LeakyReLU(0.2),nn.Linear(hidden_dim, output_dim),nn.Sigmoid())
4.2.3 判别器
判别器用于区分真实数据和生成数据:
class Discriminator(nn.Module):def __init__(self, input_dim, hidden_dim):super(Discriminator, self).__init__()self.main = nn.Sequential(nn.Linear(input_dim, hidden_dim),nn.LeakyReLU(0.2),nn.Dropout(0.3),nn.Linear(hidden_dim, hidden_dim // 2),nn.LeakyReLU(0.2),nn.Dropout(0.3),nn.Linear(hidden_dim // 2, 1),nn.Sigmoid())
4.3 训练过程
GAN模型的训练过程包含多项优化技术:
def train_gan(generator, discriminator, train_loader, num_epochs=200, model_name="GAN"):# 优化器设置if model_name == "LSTM-GAN":g_optimizer = optim.Adam(generator.parameters(), lr=0.0002, betas=(0.5, 0.999), weight_decay=1e-6)d_optimizer = optim.Adam(discriminator.parameters(), lr=0.0001, betas=(0.5, 0.999), weight_decay=1e-6)else:g_optimizer = optim.Adam(generator.parameters(), lr=0.0001, betas=(0.5, 0.999))d_optimizer = optim.Adam(discriminator.parameters(), lr=0.0001, betas=(0.5, 0.999))# 学习率调度器g_scheduler = optim.lr_scheduler.ReduceLROnPlateau(g_optimizer, mode='min', factor=0.5, patience=20, verbose=True)d_scheduler = optim.lr_scheduler.ReduceLROnPlateau(d_optimizer, mode='min', factor=0.5, patience=20, verbose=True)# 早停机制best_g_loss = float('inf')patience = 30counter = 0for epoch in range(num_epochs):# 训练判别器real_outputs = discriminator(real_data)d_loss_real = criterion(real_outputs, real_labels)noise = torch.randn(batch_size, real_data.size(1)).to(device)fake_data = generator(noise)fake_outputs = discriminator(fake_data.detach())d_loss_fake = criterion(fake_outputs, fake_labels)d_loss = d_loss_real + d_loss_fake# LSTM-GAN使用梯度惩罚if model_name == "LSTM-GAN":# 计算梯度惩罚alpha = torch.rand(batch_size, 1).to(device)interpolates = alpha * real_data + (1 - alpha) * fake_data.detach()interpolates.requires_grad_(True)disc_interpolates = discriminator(interpolates)gradients = torch.autograd.grad(outputs=disc_interpolates,inputs=interpolates,grad_outputs=torch.ones_like(disc_interpolates),create_graph=True,retain_graph=True,only_inputs=True)[0]gradient_penalty = ((gradients.norm(2, dim=1) - 1) ** 2).mean() * 5 d_loss = d_loss + gradient_penalty# 训练生成器fake_outputs = discriminator(fake_data)g_loss = criterion(fake_outputs, real_labels)# LSTM-GAN使用L1正则化if model_name == "LSTM-GAN":l1_lambda = 0.05 l1_loss = torch.mean(torch.abs(fake_data - real_data))g_loss = g_loss + l1_lambda * l1_loss
关键优化技术:
- 标签平滑:为真实和生成的标签添加随机噪声,提高模型鲁棒性
- 梯度惩罚:对LSTM-GAN应用Wasserstein GAN梯度惩罚,提高训练稳定性
- 学习率调度:使用ReduceLROnPlateau动态调整学习率
- 早停机制:监控生成器损失,避免过拟合
- 梯度裁剪:限制梯度大小,防止梯度爆炸
- L1正则化:在LSTM-GAN中添加L1损失,促使生成数据更接近真实数据
4.4 缺失值填补
使用训练好的生成器填补缺失值:
def impute_missing_values(generator, missing_data, mask, column_scalers, column_stats):with torch.no_grad():# 生成数据noise = torch.randn(missing_data.size(0), missing_data.size(1)).to(device)generated_data = generator(noise)# 只在缺失位置使用生成的数据imputed_data = missing_data * (1 - mask) + generated_data * mask# 反标准化imputed_data = imputed_data.cpu().numpy()for i, scaler in column_scalers.items():col_data = scaler.inverse_transform(imputed_data[:, i].reshape(-1, 1)).flatten()
关键点:
- 使用随机噪声作为生成器输入
- 只在缺失位置(由掩码标记)填充生成的数据
- 对生成的数据进行反标准化处理
- 将生成的值限制在原始数据的范围内
- 对结果进行四舍五入,保留两位小数
4.5 模型评估
使用多种指标评估模型性能:
def evaluate_model(original_data, imputed_data, mask):mask_np = mask.cpu().numpy()original_np = original_data.valuesmissing_indices = np.where(mask_np == 1)original_values = original_np[missing_indices]imputed_values = imputed_data[missing_indices]# 计算整体指标mae = mean_absolute_error(original_values, imputed_values)rmse = np.sqrt(mean_squared_error(original_values, imputed_values))r2 = r2_score(original_values, imputed_values)
评估指标:
- MAE(平均绝对误差):评估填补值与真实值的平均偏差
- RMSE(均方根误差):对较大误差更敏感的指标
- R²(决定系数):评估模型解释数据变异的能力
5. 自适应模型优化
代码实现了自适应模型优化机制,当LSTM-GAN性能未优于MLP-GAN时,会自动调整参数并重新训练:
# 确保LSTM-GAN性能优于MLP-GAN
if lstm_mae >= mlp_mae or lstm_rmse >= mlp_rmse: # 增强LSTM-GAN的训练lstm_generator = LSTMGenerator(input_dim, int(lstm_hidden_dim * 1.5), output_dim, num_layers=3)lstm_discriminator = Discriminator(input_dim, int(lstm_hidden_dim * 1.5))lstm_g_losses, lstm_d_losses = train_gan(lstm_generator, lstm_discriminator, train_loader, num_epochs=400, model_name="LSTM-GAN")
优化策略:
- 增加隐藏层维度(1.5倍)
- 增加LSTM层数(从2层到3层)
- 增加训练轮次(从200轮到400轮)
6. 结果保存与比较
代码最后将填补结果保存为Excel文件,并进行模型比较:
# 保存填补后的数据
lstm_imputed_df = pd.DataFrame(lstm_imputed_data, columns=columns)
mlp_imputed_df = pd.DataFrame(mlp_imputed_data, columns=columns)
7. 总结
-
模型架构创新
- 结合LSTM和注意力机制捕捉时序依赖
- 使用残差连接改善梯度流动
- 双向LSTM增强特征提取能力
-
训练过程优化
- 标签平滑减少模型过拟合
- 梯度惩罚提高训练稳定性
- 学习率调度自适应调整学习率
- 早停机制避免过度训练
-
自适应模型调整
- 动态比较LSTM-GAN和MLP-GAN性能
- 自动调整模型参数和训练轮次
- 确保LSTM-GAN在大多数指标上优于MLP-GAN
-
数据处理技巧
- 精细的数据标准化和反标准化
- 保留原始数据统计特性
- 限制生成值在合理范围内
-
全面的评估体系
- 多种评估指标综合评估模型性能
- 对每列数据单独计算指标
- 直观的模型比较机制
8. 应用场景
此GAN填补缺失数据的方法适用于以下场景:
- 时间序列数据的缺失值填补
- 传感器数据修复
- 金融数据缺失处理
- 医疗数据完整性提升
- 工业生产数据质量提升
9. 总结
展示了如何利用生成对抗网络(GAN)技术填补时间序列数据中的缺失值。通过比较LSTM-GAN和MLP-GAN两种模型,证明了结合LSTM和注意力机制的生成器在捕捉时序依赖关系方面具有优势。项目实现了多项优化技术,包括梯度惩罚、早停机制、学习率调度等,提高了模型的训练稳定性和生成质量。此方法为时间序列数据的缺失值填补提供了一种有效的解决方案。
相关文章:
LSTM-GAN生成数据技术
1. 项目概述 本项目利用生成对抗网络(GAN)技术来填补时间序列数据中的缺失值。项目实现了两种不同的GAN模型:基于LSTM的GAN(LSTM-GAN)和基于多层感知机的GAN(MLP-GAN),并对两种模型…...
26、C# 中是否可以继承String类?为什么?
在 C# 中,不能直接继承 String 类(System.String)。这是由于以下几个原因: 1、String 类是 sealed 的 String 类在 .NET 中被标记为 sealed,这意味着它是一个密封类,不能被继承。 sealed 关键字的作用是防…...
gem5教程第五章 了解gem5默认配置脚本
在本章中,我们将探讨如何使用gem5附带的默认配置脚本。 gem5附带了许多配置脚本,使您能够非常快速地使用gem5。 然而,一个常见的陷阱是在不完全理解所模拟内容的情况下使用这些脚本。在使用gem5进行计算机架构研究时,充分了解您正在模拟的系统非常重要。本章将引导您了解默…...
什么是鸿蒙南向开发?什么是北向开发?
文章目录 鸿蒙南向开发 vs 北向开发:底层与生态的双向赋能一、鸿蒙南向开发:连接硬件的底层基石二、鸿蒙北向开发:构建全场景应用生态三、南向与北向:互补与协同四、如何选择开发方向?结语 鸿蒙南向开发 vs 北向开发:…...
蓝桥杯 19. 最大比例
最大比例 原题目链接 题目描述 X 星球的某个大奖赛设了 M 级奖励。每个级别的奖金是一个正整数。 并且,相邻两个级别间的比例是一个固定值,也就是说:所有级别的奖金构成一个等比数列。 例如: 奖金数列为 16, 24, 36, 54&…...
制造业数字化转型标杆解析:从冀凯机电到君乐宝的启示
1. 执行摘要 数字化转型已成为现代制造业提升竞争力、实现高质量发展的核心驱动力。本文旨在通过深入剖析冀凯装备制造股份有限公司(冀凯机电)和君乐宝乳业集团(君乐宝)两家不同行业背景企业的数字化转型实践,提炼可供…...
【OSCP-vulnhub】Raven-2
目录 端口扫描 本地/etc/hosts文件解析 目录扫描: 第一个flag 利用msf下载exp flag2 flag3 Mysql登录 查看mysql的运行权限 MySql提权:UDF 查看数据库写入条件 查看插件目录 查看是否可以远程登录 gcc编译.o文件 创建so文件 创建临时监听…...
配置MambaIRv2: Attentive State Space Restoration的环境
github上代码的地址: csguoh/MambaIR: [ECCV2024, CVPR2025] MambaIR and MambaIRv2! 一开始直接输入命令 conda env create -f environment.yaml 安装了半天爆出来好几个错误,其中一个是没有nvcc 输入以下命令: module avail 发现没有…...
4.23晚间工作总结
主要工作:将ClassicDetail界面拆分成utils,apis,stores,css,vue多个文件,方便后续重用 具体代码截图:...
Maven 项目中引入本地 JAR 包
在日常开发过程中,我们有时会遇到一些未上传到 Maven 中央仓库或公司私有仓库的 JAR 包,比如第三方提供的 SDK 或自己编译的库。这时候,我们就需要将这些 JAR 包手动引入到 Maven 项目中。本文将介绍两种常见方式:将 JAR 安装到本…...
SpringBoot整合SSE,基于okhttp
一、引入依赖 <dependency><groupId>com.squareup.okhttp3</groupId><artifactId>okhttp</artifactId><version>4.10.0</version> </dependency> <dependency><groupId>com.squareup.okhttp3</groupId><…...
从云端到边缘:云原生后端架构在边缘计算中的演进与实践
📝个人主页🌹:慌ZHANG-CSDN博客 🌹🌹期待您的关注 🌹🌹 一、引言:为何云原生后端正在走向边缘? 随着物联网(IoT)、5G 和实时应用的快速发展,越来越多的数据在终端产生并需要即时处理。传统云计算虽强大,但将所有数据上送云端再处理,带来高延迟与带宽压力。…...
pytest心得体会
一、如何单独运行某条用例 在参数化测试中总有些用例失败,由于前后置数据的关系需要单独运行那条用例如何运行呢 方法一:直接查看控制台运行用例 确定是[2-case_data8] pytest.main(["-sv","testcase/违规告警/test_违规告警_非合同车…...
《Cesium 中两点绘制线的实现:实线、虚线、动态线、流动线详解》
摘要 在 Cesium 三维地球可视化开发中,两点之间绘制线是常见的需求。本文详细介绍如何在 Cesium 中实现两点间绘制实线、虚线、动态线和流动线,并提供完整的代码示例,方便开发者快速上手,满足不同场景下的可视化需求。 一、环境与依赖 本文代码基于 Cesium 库进行开发,…...
【EasyPan】MySQL FIELD() 函数实现自定义排序
【EasyPan】项目常见问题解答(自用&持续更新中…)汇总版 MySQL FIELD() 函数解析 一、FIELD() 函数技术解析 /* 基础语法 */ FIELD(column_name, value1, value2, ..., valueN)核心特性 特性说明返回值机制返回字段值在参数列表中的索引位置&…...
搭建TypeScript单元测试环境
我们在学习TypeScript的时候如果能够搭建一个单元测试的环境,那写些demo会很简单,下面我们使用jest来搭建一个单元测试环境 Jest 是一个由 Facebook 开发并开源的 JavaScript 测试框架,被广泛应用于前端和 Node.js 项目的单元测试。以下是关…...
Vue3父子组件数据同步方法
在 Vue 3 中,当子组件需要修改父组件传递的数据副本并同步更新时,可以通过以下步骤实现: 方法 1:使用 v-model 和计算属性(实时同步) 父组件: vue <template><ChildComponent v-mo…...
免费且开源的企业级监控解决方案:Zabbix
一、Zabbix 简介 Zabbix 是一款功能强大的企业级开源监控解决方案。它可以监控各种 IT 基础设施组件,包括网络设备、服务器、虚拟机、云服务、应用程序和数据库等。Zabbix 提供实时的监控、告警、报表和可视化功能,帮助用户及时发现和解决 IT 系统中的问…...
高并发系统的通用设计方法是什么?
背景 高并发系统的通用设计方法是解决系统在面对大量用户访问时的性能瓶颈问题。当系统遇到性能瓶颈时,通常是因为某个单点资源(如数据库、后端云服务器、网络带宽等)达到了极限。 为了提升整个系统的容量,需要找到这个瓶颈资源…...
ubuntu系统下部署使用git教程
在ubuntu系统下部署并使用git教程 1.下载并安装 sudo apt update sudo apt install git2.检验安装是否成功 git --version若输出git版本号即为成功。 3.配置参数 git config --global user.name "你的名字" git config --global user.email "你的邮箱&quo…...
redis client.ttl(key)
对应 Redis 的 TTL 命令: bash 复制 下载 TTL key 使用示例 1. 基本用法 java 复制 下载 try (Jedis jedis jedisPool.getResource()) {long ttl jedis.ttl("user:1001:session");if (ttl > 0) {System.out.println("键将在 " t…...
基于ACL方式手动建立站点间 IPSec 隧道
换句话说 不使用 IKE 自动协商,而是静态配置密钥和 SPI(安全参数索引)来配置隧道规则 环境基础 还是使用eNSP软件进行模拟,等后面再更新实际通信中的环境 没有框架,就没有基本思路 还是使用前面文章GRE VPN的拓扑&…...
电池大脑的基准测试及AI拓展
从为我们的智能手机供电到驱动电动汽车,我们的日常生活都离不开锂离子电池(LIB)。但是,理解其复杂的内部运作并预测其性能需要精密的工具。由此引入了多孔电极理论(PET)模型,我们可以将其视为模…...
数据通信学习笔记之OSPF的基础术语
Router ID RouterID 用于在自治系统中唯一标识一省运行 OSPF 的路由器,它是一个 32 位的无符号整数 配置完成后,如果需要修改 Router ID 的话,需要重启进程才能上生效 <Huawei>reset ospf 1 process // 重启 ospf 进程 1 Route…...
Android Cordova 开发 - Cordova 快速入门(Cordova 环境配置、Cordova 第一个应用程序)
一、Cordova 1、Cordova 概述 Cordova 是使用 HTML,CSS 和 JavaScript 构建混合移动应用程序的平台 2、Cordova 特征 (1)命令行界面(Cordova CLI) 这是可用于启动项目,构建不同平台的进程,…...
AndroidAutomotive模块介绍(四)VehicleHal介绍
前言 前面的文章中,描述了 Android Automotive 的框架中应用、Framework 层服务等知识,本篇文章将会继续按照 Android Automotive 框架介绍 Vehicle Hal 层服务的内容。 上一篇:AndroidAutomotive模块介绍(三)CarSer…...
Pingora vs. Nginx vs. 其他主流代理服务器性能对比
Pingora vs. Nginx vs. 其他主流代理服务器性能对比 核心对比概览 特性Pingora (Cloudflare)NginxEnvoyHAProxyCaddyTraefik开发公司CloudflareNginx, Inc/F5Lyft/CNCFHAProxy TechApache 2.0社区Containous核心语言RustCCCGoGo并发模型异步/多线程事件驱动事件驱动事件驱动协…...
4月23日作业
需求: 1,R5为ISP,其上只能配置IP地址; R5与其他所有直连设备间均使用公有IP;环回地址为100.1.1.1/32 2,R4设备为企业出口路由器 3,整个OSPF环境IP基于172.16.0.0/16划分; 4&…...
5.学习笔记-SpringMVC(P53-P60)
1.响应 (1)响应页面 (2)响应数据(异步提交):文本数据、json数据 2.REST风格 (1)REST:表现形式状态转换。 (2)传统风格资源描述形式 3.Restful入门案例 5.基于RESTful页面数据…...
安卓14默认赋予应用权限
安卓14上赋予应用默认权限的方式跟之前的不太一样了 需要修改两个地方,一个是frameworks\base\services\core\java\com\android\server\pm\permission\Permission.java public boolean isNormal() {//eturn (mPermissionInfo.protectionLevel & PermissionInfo…...
数据的加载与保存
加载数据的方法 选项参数:可以通过选项参数传入URL地址、用户名、密码和数据表名称等。 路径参数:可以传入加载数据的路径。 MySQL语句:可以直接导入MySQL语句来加载数据。 保存数据的方法通用方法:使用df.write方法保存数据。…...
网络编程——通信三要素
一、概述 (一)网络编程 可以让设备中的程序与网络上的其他设备中的程序进行数据交互,实现网络通信 Java.net包下提供了网络编程的解决方案。 (二)通信的基本架构 1. CS架构(Client客户端/Server服务端…...
es-存储与搜索优化
字段选型优化 链接:es-字段类型详解与优化建议 存储优化 es的底层使用Lucene,Lucene的存储的核心文件包括: 原始数据存储(Store)、倒排索引(Inverted Index)、列式存储(DocValues)…...
Hadoop 集群扩容新增节点操作文档
Hadoop 集群扩容新增节点操作文档 一、前期准备 1. 环境检查(所有新节点) 确保 JDK 安装: java -version确保 Hadoop 安装: hadoop version添加主机名映射(所有节点): cat >> /etc/h…...
高光谱相机在工业检测中的应用:LED屏检、PCB板缺陷检测
随着工业检测精度要求的不断提升,传统机器视觉技术逐渐暴露出对非可见光物质特性识别不足、复杂缺陷检出率低等局限性。高光谱相机凭借其独特的光谱分析能力,为工业检测提供了革命性的解决方案。以下结合中达瑞和VIX系列推扫式高光谱相机的技术特点与实际…...
07-IDEA企业开发工具-开发入门程序
1. IDEA创建Java项目的代码结构 项目结构: IDEA中的Java项目包含四种主要结构:工程(Project)、模块(Module)、包(Package)、类(Class)。 工程(Project): 代表整个项目,通常是一个磁盘目录或文件夹。模块(Module): 工程下的子单元,用于划分项…...
即插即用模块(3) -LSK 特征提取
paper:LSKNet: A Foundation Lightweight Backbone for Remote Sensing Code:https://github.com/zcablii/LSKNet 大型选择性内核块 (LSK Block) 功能 通过动态调整感受野,自适应提取遥感图像中目标的上下文信息,增强目标与环境关…...
彩虹表攻击与Nest密码存储
文章目录 前言🧨 什么是彩虹表攻击?📷 图中解析左侧是彩虹表:右侧是用户数据库中的数据: 🔐 如何防御彩虹表攻击?✅ 1. **使用 Salt 加密(推荐)**✅ 2. **使用强哈希函数…...
vue keep-alive标签的运用
keep-alive,想必大家都不会很陌生,在一些选项卡中会使用到。其实,它的作用大概就是把组件的数据给缓存起来。 比如果我有一个选项卡,标签一,标签二,标签三。现在,我需要实现,当我在标…...
python编写一段爱心代码
代码编写 1. 导入模块和常量定义 python import random from math import sin, cos, pi, log from tkinter import *CANVAS_WIDTH 640 # 画布的宽 CANVAS_HEIGHT 480 # 画布的高 CANVAS_CENTER_X CANVAS_WIDTH / 2 # 画布中心的X轴坐标 CANVAS_CENTER_Y CANVAS_HEIGH…...
Python流程控制
目录 一,条件判断:if语句 1.基本语法与示例 2.多重条件判断(elif) 3.常见错误与避坑指南 1.缩进错误 2.遗漏冒号 二,循环结构:while与for 1.while循环 2.Python的注释 3.字符串的格式化输出 4.fo…...
机器人雅克比Jacobian矩阵程序
% 定义机器人的连杆参数 L1 Link(d, 0, a, 0, alpha, pi/2); L2 Link(d, 0, a, 1, alpha, 0); L3 Link(d, 0, a, 1, alpha, 0);% 创建机器人对象 robot SerialLink([L1, L2, L3], name, MyRobot);% 设置机器人的关节角度(弧度) q [0, pi/4, pi/6];%…...
Qt Creator中自定义应用程序的可执行文件图标
要在Qt Creator中为你的应用程序设置自定义可执行文件图标,你需要按照以下步骤操作: Windows平台设置方法 准备图标文件: 创建一个.ico格式的图标文件(推荐使用256x256像素,包含多种尺寸) 可以使用在线工…...
应该怎样理解“被劫持“
通常, 在 iOS 开发相关的语境中,「被劫持」的精确定义 一句话:任何「未经应用或服务器授权,第三方改变了客户端—服务器之间解析结果、传输路径或数据内容」的情形,都视为网络被劫持。 具体可拆成 六大类,每类都对应可…...
RocketMQ面试题:进阶部分
🧑 博主简介:CSDN博客专家,历代文学网(PC端可以访问:https://literature.sinhy.com/#/?__c1000,移动端可微信小程序搜索“历代文学”)总架构师,15年工作经验,精通Java编…...
【k8s系列7-更新中】kubeadm搭建Kubernetes高可用集群-三主两从
主机准备 结合前面的章节,这里需要5台机器,可以先创建一台虚拟机作为基础虚拟机。优先把5台机器的公共部分优先在一台机器上配置好 1、配置好静态IP地址 2、主机名宇IP地址解析 [root@localhost ~]# cat /etc/hosts 127.0.0.1 localhost localhost.localdomain localhost…...
12、高阶组件:魔法增幅器——React 19 HOC模式
一、魔法增幅器的本质 "高阶组件是魔法师用咒语叠加的炼金术,"霍格沃茨魔咒研究院院长凝视着发光的增幅器,"通过函数式能量场的嵌套,让基础组件获得预言家日报式的逻辑继承!" ——以神秘事务司的「维度叠加理…...
Linux避免文件误删详解(Linux Avoids File Deletion Errors with Detailed Explanation)
Linux避免文件误删详解 背景 大家都知道,rm指令在Linux中非常牛,rm -rf更是牛中的霸主。什么删系统跑路、删库跑路就是这个指令造成的。可以看出指令虽然牛,但是危险性极高。那么怎么避免某些时候的这种误操作造成的影响呢,阿祥…...
模板方法模式:定义算法骨架的设计模式
模板方法模式:定义算法骨架的设计模式 一、模式核心:模板方法定义算法骨架,具体步骤延迟到子类实现 在软件开发中,经常会遇到这样的情况:某个算法的步骤是固定的,但具体步骤的实现可能因不同情况而有所不…...
QT之Q_PROPERTY介绍以及在QWidget中的用法
目录 一、 Q_PROPERTY介绍 1、 Q_PROPERTY是什么 2、Q_PROPERTY 的语法 3、Q_PROPERTY 的作用 二、在QWidget中的用法 1、示例1:自带属性 2、 示例2:自建属性第一种 3、 示例3:自建属性第二种 4、动态属性 三、注意事项 四、总结 一…...