PyTorch PINN实战:用深度学习求解微分方程
在人工智能与计算数学的交汇点,物理信息神经网络(Physics-Informed Neural Networks,PINN)正引领着一场求解微分方程的革命。传统上,微分方程是描述自然现象和工程问题中各种关系的重要工具,但其求解往往依赖于复杂的数值方法或耗时的实验验证。然而,随着深度学习技术的飞速发展,PINN为我们提供了一种全新的、高效的求解途径。本文将深入探讨PyTorch PINN的实战应用,展示如何用深度学习求解微分方程,让读者在收获知识的同时,感受到科技创新的魅力。
#### 一、引言:传统方法的局限与PINN的崛起
微分方程,无论是常微分方程(ODE)还是偏微分方程(PDE),都是描述自然界中连续变化过程的基本工具。然而,传统求解微分方程的方法,如有限差分法、有限元法等,往往面临计算复杂度高、对高维问题处理困难等挑战。此外,这些方法通常需要大量的计算资源和时间,且对于某些复杂问题,可能无法得到精确的解析解。
随着深度学习的兴起,神经网络以其强大的非线性拟合能力和数据驱动的学习机制,为解决微分方程提供了新的思路。然而,传统的神经网络模型在求解微分方程时,往往依赖于大规模的标记数据集,这在许多实际应用中是不切实际的。因此,PINN应运而生,它将物理定律(即微分方程)直接整合到神经网络的训练过程中,从而显著提高了数据利用效率,为求解微分方程开辟了一条新的道路。
#### 二、PINN的基本原理与优势
PINN的核心思想是将微分方程的约束条件嵌入到神经网络的损失函数中,使网络在训练过程中不仅能够拟合给定的数据点,还能够满足微分方程的定义。具体来说,PINN的损失函数通常由两部分组成:一部分是数据损失,用于衡量网络输出与真实数据之间的差异;另一部分是物理损失,用于衡量网络输出对微分方程约束的满足程度。
PINN相比传统方法具有显著的优势。首先,它不需要大量的标记数据集,而是通过物理定律的约束从相对小规模的数据集中有效学习。其次,PINN能够处理传统数值求解器难以应对的高维复杂偏微分方程。此外,训练完成后,PINN模型具有良好的泛化能力,可预测不同初始条件或边界条件下的解。在处理逆问题时,PINN对噪声和稀疏数据也表现出较强的鲁棒性。
#### 三、PyTorch PINN实战:求解常微分方程
为了更具体地展示PINN的实战应用,我们将以求解一个简单的常微分方程为例,介绍如何使用PyTorch实现PINN。
**(一)问题定义**
考虑以下一阶线性常微分方程:
$y'(x) = 2x + 5$
初始条件为:
$y(0) = 3$
**(二)数据准备**
在PINN中,我们不需要大量的标记数据集,但为了训练和评估模型,我们仍然需要一些数据点。这里,我们可以使用解析解来生成一些训练数据和测试数据。
**(三)模型搭建**
接下来,我们使用PyTorch定义一个简单的全连接神经网络作为PINN模型。模型的结构可以根据问题的复杂程度进行调整,但通常包括一个输入层、若干个隐藏层和一个输出层。在隐藏层中,我们可以使用ReLU、Tanh等激活函数来增加网络的非线性拟合能力。
```python
import torch
import torch.nn as nn
import torch.optim as optim
import numpy as np
import matplotlib.pyplot as plt
class PINN(nn.Module):
def __init__(self):
super(PINN, self).__init__()
self.net = nn.Sequential(
nn.Linear(1, 20), nn.Tanh(),
nn.Linear(20, 20), nn.Tanh(),
nn.Linear(20, 1)
)
def forward(self, x):
return self.net(x)
```
**(四)损失函数定义**
PINN的损失函数由数据损失和物理损失两部分组成。数据损失用于衡量网络输出与真实数据之间的差异,而物理损失则用于衡量网络输出对微分方程约束的满足程度。
```python
def pinn_loss(model, x):
x.requires_grad = True
y = model(x)
dy_dx = torch.autograd.grad(y, x, torch.ones_like(y), create_graph=True)[0]
ode_loss = torch.mean((dy_dx - (2 * x + 5)) ** 2)
x0 = torch.tensor([[0.0]])
y0_pred = model(x0)
initial_loss = (y0_pred - 3) ** 2
total_loss = ode_loss + initial_loss
return total_loss, ode_loss, initial_loss
```
**(五)模型训练**
在模型训练过程中,我们使用优化器(如Adam)来迭代更新网络的权重参数,以最小化损失函数。同时,我们可以使用训练过程中的损失变化来评估模型的收敛情况。
```python
model = PINN()
optimizer = optim.Adam(model.parameters(), lr=1e-3)
epochs = 5000
loss_history = []
ode_loss_history = []
initial_loss_history = []
x_train = torch.linspace(-2, 2, 100).view(-1, 1)
for epoch in range(epochs):
optimizer.zero_grad()
total_loss, ode_loss, initial_loss = pinn_loss(model, x_train)
total_loss.backward()
optimizer.step()
loss_history.append(total_loss.item())
ode_loss_history.append(ode_loss.item())
initial_loss_history.append(initial_loss.item())
if epoch % 1000 == 0:
print(f"Epoch {epoch}, Loss: {total_loss.item():.6f}")
```
**(六)结果展示**
训练完成后,我们可以使用测试数据来评估模型的性能。同时,我们还可以绘制训练过程中的损失变化曲线,以观察模型的收敛情况。
```python
x_test = torch.linspace(-2, 2, 100).view(-1, 1)
y_true = x_test ** 2 + 5 * x_test + 3 # 真实解
y_pred = model(x_test)
plt.figure(figsize=(8, 5))
plt.plot(x_test.numpy(), y_true.numpy(), linestyle="dashed", linewidth=2, label="True Solution")
plt.plot(x_test.numpy(), y_pred.detach().numpy(), linewidth=2, label="PINN Prediction")
plt.xlabel("x")
plt.ylabel("y(x)")
plt.legend()
plt.title("PINN Solution of ODE")
plt.grid()
plt.show()
plt.figure(figsize=(8, 5))
epochs_list = np.arange(1, epochs + 1)
plt.semilogy(epochs_list, loss_history, 'k--', linewidth=3, label=r'Total Loss $(L_D + L_B)$')
plt.xlabel('Epoch')
plt.ylabel('Loss')
plt.legend()
plt.title('Training Loss Over Epochs')
plt.grid()
plt.show()
```
#### 四、PyTorch PINN实战:求解偏微分方程
PINN不仅可以用于求解常微分方程,还可以扩展到求解偏微分方程。以二维热传导方程为例,我们将展示如何使用PyTorch PINN来求解这类问题。
**(一)问题定义**
考虑以下二维热传导方程:
$\frac{\partial u}{\partial t} = \alpha \left( \frac{\partial^2 u}{\partial x^2} + \frac{\partial^2 u}{\partial y^2} \right)$
其中,$u(x, y, t)$是温度分布函数,$\alpha$是热扩散系数。
**(二)数据准备与模型搭建**
与常微分方程类似,我们需要准备一些训练数据和测试数据来训练和评估模型。同时,我们还需要根据问题的复杂程度搭建一个合适的神经网络模型。
**(三)损失函数定义与模型训练**
对于偏微分方程,我们需要定义更加复杂的损失函数来同时考虑时间导数、空间导数和初始/边界条件。在模型训练过程中,我们仍然使用优化器来迭代更新网络的权重参数,以最小化损失函数。
**(四)结果展示与分析**
训练完成后,我们可以使用测试数据来评估模型的性能,并绘制温度分布图来直观展示结果。同时,我们还可以分析不同参数对模型性能的影响,以进一步优化模型。
#### 五、创新性探讨与未来展望
PINN作为一种新兴的求解微分方程的方法,具有许多创新性和潜力。首先,它将物理定律直接整合到神经网络的训练过程中,实现了数据驱动与物理约束的有机结合。其次,PINN能够处理传统数值求解器难以应对的高维复杂问题,为科学计算和工程应用提供了新的解决方案。
然而,PINN仍然面临一些挑战和限制。例如,训练过程计算密集且耗时较长,尤其对于高维偏微分方程;模型对超参数选择较为敏感,需要精细调整以平衡不同损失项。
相关文章:
PyTorch PINN实战:用深度学习求解微分方程
在人工智能与计算数学的交汇点,物理信息神经网络(Physics-Informed Neural Networks,PINN)正引领着一场求解微分方程的革命。传统上,微分方程是描述自然现象和工程问题中各种关系的重要工具,但其求解往往依…...
LRU(最近最少使用)算法实现
核心思想与基本思路 LRU(Least Recently Used)算法是一种缓存淘汰策略,其核心思想是淘汰最近最少使用的数据。 最近使用原则:最近被访问的数据在未来被访问的概率更高,因此应保留在缓存中。淘汰机制:当缓…...
【大模型实战】利用ms-swift微调框架对QwQ-32B推理模型进行微调
1. 背景介绍 之前我们在《大模型训练/微调的一些经验分享》、《利用DeepSeek-R1数据微调蒸馏ChatGLM32B让大模型具备思考能力》中做了相关模型微调的介绍。目前在基座大模型能力还没有达到足够牛的情况下,大模型微调在商业化、垂直领域应用依然是不可或缺࿰…...
蓝桥杯省赛真题C++B组-小球反弹
一、题目 有一长方形,长为 343720 单位长度,宽为 233333 单位长度。在其内部左上角顶点有一小球(无视其体积),其初速度如图所示且保持运动速率不变,分解到长宽两个方向上的速率之比为 dx:dy 15:17。小球碰到长方形的边框时会发生…...
Web3到底解决了什么问题?
文章目录 Web3到底解决了什么问题?1. 数据所有权与控制权的转移2. 打破中心化平台的垄断3. 信任与透明度的重构4. 价值分配机制的革新5. 互操作性与开放生态6.Web3 的局限性(附加说明) Web3到底解决了什么问题? 1. 数据所有权与控制权的转移 问题&am…...
基于CSV构建轻量级数据库:SQL与Excel操作的双模实践
基于CSV构建轻量级数据库:SQL与Excel操作的双模实践 引言:当CSV遇到SQL和Excel CSV(逗号分隔值)作为最通用的数据存储格式之一,凭借其纯文本可读性和跨平台兼容性,被广泛应用于数据交换和简单存储场景。但…...
【深度学习】多源物料融合算法(一):量纲对齐常见方法
目录 一、引言 二、量纲对齐常见方法 2.1 Z-score标准化Sigmoid归一化 2.2 Min-Max 归一化 2.3 Rank Transformation 2.4 Log Transformation 2.5 Robust Scaling 3、总结 一、引言 类似抖音、快手、小红书等产品的信息流推荐业务,主要通过信息流广告、信…...
STM32-SPI通信外设
目录 一:SPI外设简介 SPI框图编辑 SPI逻辑 编辑 主模式全双工连续传输 编辑 非连续传输 二:硬件SPI读写W25Q64 1.接线: 2. 代码 SPI外设的初始化 生成时序 一:SPI外设简介 STM32内部集成了硬件SPI收发电路&#…...
告别XML模板的繁琐!Word文档导出,easy!
word模板导出 最近项目中有个功能,导出月报,发现同事使用了docx格式模板,感觉比之前转成xml的简单多了,这边记录下使用方法。 xml方式导出word,模板太复杂了 资料 poi-tl 一个基于Apache POI的Word模板引擎,也是一个免费开源的Jav…...
LeetCode 3280 将日期转换为二进制表示
【算法实战】日期转二进制:两种解法的思路与优化(附代码解析) 一、问题描述 给定一个yyyy-mm-dd格式的日期字符串,要求将年、月、日分别转为无前导零的二进制,并保持year-month-day格式。 示例:输入2025-…...
基于SpringBoot的“考研互助平台”的设计与实现(源码+数据库+文档+PPT)
基于SpringBoot的“考研互助平台”的设计与实现(源码数据库文档PPT) 开发语言:Java 数据库:MySQL 技术:SpringBoot 工具:IDEA/Ecilpse、Navicat、Maven 系统展示 系统整体功能图 局部E-R图 系统首页界面 系统注册…...
在线Doc/Docx转换为PDF格式 超快速转换的一款办公软件 文档快速转换 在线转换免费转换办公软件
小白工具https://www.xiaobaitool.net/files/word-pdf/提供了一项非常实用的在线服务——将Doc或Docx格式的文档快速转换为PDF格式。这项服务不仅操作简单,而且转换效率高,非常适合需要频繁处理文档转换的用户。 服务特点: 批量转换&#x…...
3.14-进程间通信
进程间通信 IPC 进程间通信的原理,借助进程之间使用同一个内核,借助内核,传递数据。 进程间通信的方法 管道:最简单。信号:开销小。mmap映射:速度最快,非血缘关系之间。socket(本…...
大模型AI多智能体系统(Multi-Agent Systems, MAS)技术介绍
一、多智能体系统的定义与核心概念 多智能体系统(MAS)是由多个具备自主决策能力的智能体(Agent)组成的分布式系统。每个智能体能够感知环境、执行动作,并通过协作或竞争实现个体或集体目标。其核心特征包括: 自主性:智能体无需外部指令即可独立决策(如MetaGPT中的角色…...
web3区块链
Web3 是指下一代互联网,也被称为“去中心化互联网”或“区块链互联网”。它是基于区块链技术构建的,旨在创建一个更加开放、透明和用户主导的网络生态系统。以下是关于 Web3 的一些关键点: ### 1. **核心概念** - **去中心化**࿱…...
Alembic 实战指南:快速入门到FastAPI 集成
一、快速开始 1.1 简介 Alembic 是一个基于 SQLAlchemy 的数据库迁移工具,主要用于管理数据库模式(Schema)的变更,例如新增表、修改字段、删除索引等,确保数据库结构与应用程序的 ORM 模型保持一致。 Alembic 通过版…...
【视频】V4L2、ffmpeg、OpenCV中对YUV的定义
1、常见的YUV格式 1.1 YUV420 每像素16位 IMC1:YYYYYYYY VV-- UU– IMC3:YYYYYYYY UU-- VV– 每像素12位 I420: YYYYYYYY UU VV =>YUV420P YV12: YYYYYYYY VV UU =>YUV420P NV12: YYYYYYYY UV UV =>YUV420SP(最受欢迎格式) NV21: YYYYYYYY VU VU =>YUV420SP…...
ubuntu20.04装nv驱动的一些坑
**1.一定要去bios里面关闭secure boot,否则驱动程序需要签名,安装了的驱动无法被识别加载 2.假如没有关闭secure boot然后装了驱动,然后再去关闭secure boot,可能会导致进入不了ubuntu的情况 此时,先恢复secure boot&…...
【SpringMVC】常用注解:@SessionAttributes
1.作用 用于多次执行控制器方法间的参数共享 2.属性 value:用于指定存入的属性名称 type:用于指定存入的数据类型 3.示例 先写JSP代码 <a href"demo1/putMethod">存入 SessionAttribute</a><br><a href"demo…...
阿里云企业邮箱出现故障怎么处理?
阿里云企业邮箱出现故障怎么处理? 以下是处理阿里云企业邮箱故障的详细分步指南,帮助您快速定位问题并恢复邮箱正常使用: 一、初步排查:确认故障范围与现象 确定影响范围 全体用户无法使用 → 可能为阿里云服务端故障或网络中断。…...
C# Enumerable类 之 集合操作
总目录 前言 在 C# 中,System.Linq.Enumerable 类是 LINQ(Language Integrated Query)的核心组成部分,它提供了一系列静态方法,用于操作实现了 IEnumerable 接口的集合。通过这些方法,我们可以轻松地对集合…...
LVGL移植到6818开发板
一、移植步骤 1.lv_config.h 配置文件启动 framebuffer 2、lv_config.h 配置文件关闭SDL 2.修改main.c 去掉SDL输入设备 3.修改Makefile 文件启动交叉编译 去掉警告参数 去掉SDL库 4.交叉编译代码 make clean #清空 ⭐ 必须要清空一次再编译! 因为修改了 lv_con…...
深入理解 `ParameterizedTypeReference`:解决 Java 泛型擦除问题
在 Java 中,由于类型擦除的存在,我们在使用 RestTemplate 获取带有泛型的 HTTP 响应时,可能会遇到 泛型信息丢失 的问题。而 ParameterizedTypeReference<T> 正是用来解决这个问题的。 本文将深入解析 ParameterizedTypeReference 的作…...
如何使用Python的matplotlib.pyplot绘制热图和损失图
在Python的数据可视化中,matplotlib是一个非常重要的库。而matplotlib.pyplot作为其中一个模块,提供了许多绘制各种图形的函数。今天,我们就来聊聊如何利用这个库来绘制热图和损失图,通过这两个图形展示数据,让我们一起…...
【数据分享】2000—2024年我国省市县三级逐月归一化植被指数(NDVI)数据(Shp/Excel格式)
之前我们分享过2000—2024年逐月归一化植被指数(NDVI)栅格数据(可查看之前的文章获悉详情),该数据来源于NASA定期发布的MOD13A3数据集!很多小伙伴拿到数据后反馈栅格数据不太方便使用,问我们能不…...
数据结构---堆栈和列
一、堆栈 1.栈堆:具有一定操作约束的线性表;(只在一端做插入删除) 2.栈的顺序存储结构: 由一个一维数组和一个记录栈顶元素位置的变量组成。定义方式如下: 3.入栈操作: 注意:&…...
威胁驱动的网络安全方法论
摘要 目前的网络安全风险管理实践很大程度上是由合规性要求驱动的,这使得公司/组织不得不在安全控制和漏洞上投入人力/物力。(风险管理涉及多个方面,包括资产、威胁、漏洞和控制,并根据事故发生的可能性及造成的影响进行评估。威胁…...
搭建Spring Boot Admin监控系统
什么是Spring Boot Admin Spring Boot Admin 是一个用于管理和监控 Spring Boot 应用程序的开源工具。它提供了一个用户友好的 Web 界面,用于集中管理和监控多个 Spring Boot 应用程序的运行状态、健康状况、日志、配置等信息。 Spring Boot Admin 的核心功能 应用…...
P2730 魔板 (写了巨久..有一些数字,字符,字符串之间的转换规则)
ac代码: #include<iostream> #include<map> #include<queue> using namespace std; map<string,int>mp1,mp2; map<string,string>mp3; queue<string>q; string str,res"12345678"; void pri(string str){if(resstr)…...
MinIo前后端实现
这几天想玩玩Minio,整体来说简单使用起来不复杂(当然也有可能是我配置的太少了) Minio下载 我是通过Dokcer在虚拟机上下载的(Docker真好用啊) 拉取Minio镜像 docker pull minio/minio启动Minio容器 docker run -d …...
mesh开发解析
开源的Mesh网络协议栈及相关项目: 1.B.A.T.M.A.N.(Better Approach to Mobile Ad-hoc Networking)• 简介:B.A.T.M.A.N.是一种用于多跳自组织网络的路由协议,适用于无线Mesh网络。它通过优化数据传输路径,确保网络的高可靠性和动…...
使用netlify部署github的vue/react项目或本地的dist,国内也可以正常访问
提供简洁的部署流程和丰富功能,如自定义域名、自动构建和服务器端功能。通过连接到 Git 仓库实现持续部署,每次推送代码都会自动构建和发布,支持无服务器函数,允许在前端项目中实现后端逻辑,提供直观的用户界面来管理和…...
LinuX---Shell正则表达式
正则表达式 正则表达式使用单个字符串来描述、匹配一系列符合某个语法规则的字符串。在很多文本编辑器里,正则表达式通常被用来检索、替换那些符合某个模式的文本。在Linux中,grep,sed,awk等命令都支持通过正则表达式进行模式匹配…...
[Hello-CTF]RCE-Labs超详细WP-Level10(无字母命令执行_二进制整数替换)
温馨提示 这关涉及的知识点较多, 写的很长, 中间留了很多错误引导(本人在实验时遇到的问题, 或许你们也会遇到), 在后文才逐步解释源码分析 跟前几关一样, 更改了 WAF 的过滤字段这个关卡, 只有0, 1, (单引号), $, <, \ , ( , )可以用解题分析(实验这些命令, 可以先在自己本…...
基于PySide6与CATIA Automation的批量截图处理系统开发实践
引言 本文完整实现了基于PySide6 GUI框架与CATIA Automation技术的批量截图处理系统。系统支持对CATIA文件(.CATPart/.CATProduct)的自动化截图、图像优化及批量导出,通过模块化架构设计实现了超过200%的效率提升。本文将从技术架构、核心算…...
AI开发软件:开启智能时代的钥匙
在当今数字化时代,人工智能(AI)已不再是一个遥远的概念,而是深入到我们生活和工作的方方面面,成为推动各行业变革与发展的核心力量。AI 开发软件作为实现人工智能技术落地的关键工具,正引领着一场前所未有的…...
73.HarmonyOS NEXT PicturePreviewImage组件深度剖析:高级功能扩展与性能优化策略(三)
温馨提示:本篇博客的详细代码已发布到 git : https://gitcode.com/nutpi/HarmonyosNext 可以下载运行哦! HarmonyOS NEXT PicturePreviewImage组件深度剖析:高级功能扩展与性能优化策略(三) 文章目录 HarmonyOS NEXT PicturePreviewImage组件…...
【模拟算法】
目录 替换所有的问号 提莫攻击 Z 字形变换 外观数列 数青蛙(较难) 模拟算法:比葫芦画瓢。思路较简单,考察代码能力。 1. 模拟算法流程,一定要在演草纸上过一遍流程 2. 把流程转化为代码 替换所有的问号 1576. 替…...
Spring Cloud 中的服务注册与发现: Eureka详解
1. 背景 1.1 问题描述 我们如果通过 RestTamplate 进行远程调用时,URL 是写死的,例如: String url "http://127.0.0.1:9090/product/" orderInfo.getProductId(); 当机器更换或者新增机器时,这个 URL 就需要相应地变…...
WireShark自动抓包
背景 异常流量检测是当前保护网络空间安全的重要检测方法。 对流量的研究,首先需要在系统中进行抓包,并对包进行分析。 这里对WireShark自动抓包进行简要介绍。 操作步骤 1、选择“捕获”>“选项”。 2、在Input下,选择要抓包的网络接…...
Redis 的应用场景
缓存: 作为缓存层,加速数据访问,减轻数据库压力,常用于网页、数据库查询结果的缓存。 会话存储: 存储用户会话信息,支持分布式系统中的会话共享。 消息队列: 利用列表和发布/订阅功能…...
React使用路由表
目录 前言 实现步骤 1. 安装依赖 2. 创建路由配置文件 高级配置 嵌套路由配置 对比两种配置方式 传统 JSX 方式 路由表方式优势 完整功能示例 带路由守卫的配置 注意事项 总结 前言 React Router 从 v6 版本开始支持类似 Vue 的集中式路由表配置方式,通…...
嵌入式C语言中堆栈管理与数据存储的精髓
在嵌入式开发中,理解C语言的内存管理和数据存储机制是至关重要的。本文将从堆栈管理和数据存储两个方面,深入探讨C语言在嵌入式Linux开发中的应用。 一、堆栈管理 1.1 栈的初始化与作用 栈是C语言运行的基础,主要用于存储函数参数、局部变量、函数返回值和编译器生成的临时…...
Linux系统之less命令的基本使用
Linux系统之less命令的基本使用 一、less命令介绍二、less命令的使用帮助2.1 less命令的帮助信息2.2 less命令主要选项解释 三、less命令的基本使用3.1 查看文件内容3.2 结合管道使用 四、注意事项 一、less命令介绍 在Linux和Unix类操作系统中,文件浏览是一项常见的…...
【免费】1949-2020年各省人均GDP数据
1949-2020年各省人均GDP数据 1、时间:1952-2020年 2、来源:国家统计局、统计年鉴 3、指标:各省人均GDP 4、范围:31省 5、指标解释:人均GDP(Gross Domestic Product per capita)是指一个国家…...
三分钟掌握视频剪辑 | 在 Rust 中优雅地集成 FFmpeg
前言 在当今的短视频时代,高效的视频剪辑已成为内容创作者和开发者的迫切需求。无论是裁剪视频开头结尾、提取高光时刻,还是制作 GIF、去除广告,剪辑都是必不可少的一环。 然而,批量处理大量视频并非易事,常见的挑战…...
angular中下载接口返回文件
目录 一、URL.createObjectURL() 一、URL.createObjectURL() createObjectURL属于js的原生方法,位于window.URL上,用于将Blob或者File文件转换为可以临时的URL地址进行显示 **注意**:Angular 的 HttpClient 默认将响应解析为 JSON 对象16。…...
自定义tiptap插件
本文为开发开源项目的真实开发经历,感兴趣的可以来给我的项目点个star,谢谢啦~ 具体博文介绍: 开源|Documind协同文档(接入deepseek-r1、支持实时聊天)Documind 🚀 一个支持实时聊天和接入 - 掘…...
爬虫基础之爬取豆瓣同城信息(保存为csv excel 数据库)
网站:长沙最近一周戏剧活动_豆瓣 温馨提示: 本案例仅供学习交流使用 本案例所使用的模块 requests(发送HTTP请求)pandas(数据保存模块)lxml(用于解析数据模块)csv(用于保存为csv文件)pymysql(用于操作数据库)parsel(解析数据的模块) 确定爬取的信息内容: 戏剧的名称…...
MongoDB Vs Elasticsearch
文章目录 前言一、核心区别二、优缺点MongoDBElasticsearch 三、如何选择四、结合使用总结 前言 MongoDB 和 Elasticsearch 在存储、查询方式、使用场景等方面有较大区别,以下是它们的核心区别、各自优缺点以及实际使用中的选择建议。 一、核心区别 对比项MongoDB…...