2025.3.23机器学习笔记:文献阅读
2025.3.23周报
- 题目信息
- 摘要
- Abstract
- 创新点
- 网络架构
- 实验
- 不足以及展望
题目信息
- 题目: Enhancement of Hydrological Time Series Prediction with Real-World Time Series Generative Adversarial Network-Based Synthetic Data and Deep Learning Models
- 期刊: Scientific Reports
- 作者: Ana Dodiga, Vladimir Stankovic, Lina Stankovic, Milan Stojkovic
- 发表时间: 2023
- 文章链接:https://papers.ssrn.com/sol3/papers.cfm?abstract_id=5022039
摘要
河流水质直接影响人类健康、生态系统、生物多样性以及社会和工业需求。准确预测溶解氧(DO)和水温(WT)等关键水质参数,能为决策者提供预警。但是高质量的连续时间序列水质数据稀缺且获取的成本高,这导致了数据存在不确定性和缺失值,限制了机器学习的预测技术的实施。传统时间序列数据生成模型难以捕捉数据复杂依赖关系,利用生成对抗网络(GAN)进行年度水时间序列数据生成并提高预测模型准确性的研究较少。本论文旨在探究利用水流量数据辅助生成水质和水量数据,并分析生成数据对深度学习预测模型的影响,以提高河流水质时间序列预测的准确性和可靠性。
Abstract
River water quality directly impacts human health, ecosystems, biodiversity, and social and industrial needs. Accurate prediction of key water quality parameters such as dissolved oxygen (DO) and water temperature (WT) can provide early warnings for decision-makers. However, high-quality, high-resolution continuous time-series water quality data are scarce and costly to obtain, leading to uncertainties and missing values in the data, which limit the implementation of machine learning prediction techniques. Traditional time-series data generation models struggle to capture the complex dependencies in the data, and there is limited research on using Generative Adversarial Networks (GANs) for generating annual water time-series data and improving the accuracy of prediction models. This thesis aims to explore the use of water flow data to assist in generating water quality and quantity data, and to analyze the impact of the generated data on deep learning prediction models, with the goal of enhancing the accuracy and reliability of river water quality time-series forecasting.
创新点
以往研究多基于现有水质数据预测,未考虑易获取的水量数据,且少有使用GAN进行年度水时间序列数据生成以提高预测模型准确性的研究。本研究利用RTSGAN生成水质和水量的合成数据,并结合水质和水量数据进行预测。
网络架构
在数据输入前,作者对数据进行了预处理,预处理的方式分别为KNN与Bootstrap
KNN:
Bootstrap:
放回抽样,比如上述例子中,有可能第一次抽到 ①,第二次也抽到 ①,第三次还是抽到 ①,对三个样本 X = 1 , 2 , 3 ,放回抽样 1000 次,用这 1000 次抽样的结果分别计算出各自的均值 x ˉ \bar{x} xˉ , 然后再利用这 1000 个值,计算其整体的均值,方差等统计量,这就是 Bootstrap 方法
比如,有放回随机抽样,生成B个子样本(B为采样次数,如B=100)。每次抽样保持样本量不变,但数据点可能重复或缺失。
模型结构如下图所示:
-
TRAINING DATA为训练数据,包含三个站点的2013-2020共8年每日的水文数据(水流量、含氧量、水温),其用于RTSGAN的输入,用于学习时间序列的分布和模式。
-
RTSGAN是一个生成对抗网络,用于生成合成时间序列数据。其包括编码器和解码器
编码器将输入时间序列数据如,水流量、含氧量、水温编码为固定维度的潜在向量,并捕捉时序和全局特征;解码器则是从潜在向量自回归生成时间序列。生成器是MLP,生成潜在向量;判别器是三层全连接网络,激活函数为LeakyReLU,区分真实和生成数据。
优化目标为:
min G max D E r ∼ encoder ( X , y ) [ D ( r ) ] − E z ∼ p ( z ) [ D ( G ( z ) ) ] \min _{G} \max _{D} \mathbb{E}_{r \sim \operatorname{encoder}(X, y)}[D(r)]-\mathbb{E}_{z \sim p(z)}[D(G(z))] GminDmaxEr∼encoder(X,y)[D(r)]−Ez∼p(z)[D(G(z))]
关于Wasserstein与RTSGAN可以看我之前的博客解释:https://blog.csdn.net/Zcymatics/article/details/145981612?spm=1001.2014.3001.5501 -
SLIDING WINDOW用于分割数据,用于将时间序列数据分割为输入-输出对。
在数据生成之前,使用滑动窗口方法将水质和数量时间序列数据通过归一化和分割预处理成三维(3D)数据集。分割过程如下:
(1)选择一个窗口大小为w的窗口,并沿着长度为n的时间序列数据滑动。
(2)在每一步中,生成一个大小为[n, w]的二维矩阵(其中n表示特征数乘以节点数,因为模型一次为所有三个站点生成数据。给定N作为时间序列的总长度(在我们的例子中,8年的数据为2920天),N = 9(3个特征和3个节点),窗口大小w =365和滑动步长i= 1。
(3)这就产生了大小为[n, w] =[9,365]的重叠子序列。生成的序列总数为[(N -w)/i + 1] = 2556。
这些序列作为RTSGAN的输入,用于合成复制原始数据中时间模式的附加序列。 -
经过数据增强后的数据用于两个模型中,其中,LSTM为每个站训练一个模型,输入10天数据,预测3天DO和WT;GNN训练一个模型,利用空间依赖性,同时处理三个站的数据,其中节点为三个站点,边权重为站间距离。
-
最后在测试数据(2年)上评估模型,计算RMSE和NSE。
NSE = 1 − ∑ i = 1 n ( y t − y t ′ ) 2 ∑ t = 1 n ( y t − y ˉ ) 2 \text{NSE} = 1 - \frac{\sum_{i = 1}^{n}(y_t - y_t')^2}{\sum_{t = 1}^{n}(y_t - \bar{y})^2} NSE=1−∑t=1n(yt−yˉ)2∑i=1n(yt−yt′)2,其中yt为时间步长t的观测数据,yt’为预测数据,y为观测数据的均值,n为观测总数。
实验
论文围绕利用RTSGAN生成合成数据结合深度学习模型(LSTM和GNN)进行水质时间序列预测展开实验,具体结果如下:
- 合成数据生成性能
通过PCA和t - SNE对合成数据和原始数据进行对比,结果显示合成数据在不同降维视角下与原始数据保持相似性,整体模式复制良好,表明数据生成过程有效。
PCA:捕捉数据的线性结构和主要方差,验证合成数据是否保留了原始数据的全局特性。t-SNE:关注数据的局部结构和非线性关系,检查合成数据在细节上与原始数据的相似性。
PCA和t - SNE分析如下图所示:
对溶解氧(DO)、水温(WT)和流量三个关键水质和水量参数的分布进行可视化对比,包括密度图、直方图以及均值、中位数和峰度等统计指标。流量数据方面,合成数据集与原始数据总体吻合,仅存在细微差异;水温数据分布在三个站点均与原始数据高度一致;DO数据分布在三个站点也与原始数据极为相似,合成数据的均值、中位数与原始数据对齐,峰度值接近,说明合成数据能有效用于后续分析和建模。
2. 预测模型性能
在三个水文站对不同LSTM模型。如下图所示:
其中,LSTMsynX,X表示添加到训练集的合成序列年数,syn表示是合成数据进行评估。结果表明,纳入合成数据的模型在各站点均显著优于仅使用原始数据的模型。
在诺维萨德站,LSTMsyn12的DO预测RMSE从LSTMsyn0的0.0601降至0.0575,改善4.32%;
LSTMsyn8的水温预测RMSE从0.0285降至0.0264,改善7.37%。在森塔站,LSTMsyn20的DO和水温预测RMSE分别降至0.0276和0.0133,改善率分别为9.51%和14.74%。
在泽蒙站,LSTMsyn16的水温预测RMSE从0.0195降至0.0174,改善10.77%。
总体而言,合成数据显著提高了LSTM模型在各站点对DO和WT的预测准确性,使用较多合成数据的模型表现更优,改善幅度约为4% - 15%。
对不同GNN模型在三个站点的水质参数预测性能如下图所示:
在诺维萨德站,GNNsyn8在第1天的DO预测中表现最佳,RMSE为0.0495,改善1.20%;
GNNsyn12和GNNsyn16在水温预测上有显著改善,第1天RMSE降至0.0175,改善19.35%。
在森塔站,GNNsyn20在第1天和第2天的DO预测中表现最佳,RMSE分别为0.0269和0.0330,分别提升了17.23%和9.84%;
GNNsyn16在水温预测上改良比较大,第1天RMSE降至0.0120,提升了43.40%。
在泽蒙站,基线模型GNNsyn0在DO和水温预测上表现最佳,合成数据未提升预测准确性。
综合来看,合成数据在某些站点和参数上显著提高了GNN模型的预测准确性,但效果因位置和参数而异。
代码如下:
import numpy as np
import pandas as pd
from sklearn.neighbors import KNeighborsRegressor
from sklearn.preprocessing import StandardScaler
from sklearn.metrics import mean_squared_error
import torch
import torch.nn as nn
import torch.nn.functional as F
import torch.optim as optim
from torch_geometric.nn import GATConv
from torch_geometric.data import Data
import tensorflow as tf
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import LSTM, Dense# 设置随机种子以确保可重复性
np.random.seed(42)
torch.manual_seed(42)
tf.random.set_seed(42)# 1. 数据预处理:生成模拟数据并填补缺失值
# 模拟数据:Novi Sad完整,Senta和Zemun缺失DO
dates = pd.date_range("2013-01-01", "2022-12-31", freq="D") # 3650天
n_days = len(dates)# 模拟Novi Sad数据
n_flow = np.random.normal(3000, 500, n_days) # 流量
n_wt = np.random.normal(15, 5, n_days) # 水温
n_do = np.random.normal(10, 1, n_days) # DO# 模拟Senta数据
s_flow = np.random.normal(600, 100, n_days)
s_wt = np.random.normal(15, 5, n_days)
s_do = np.full(n_days, np.nan) # DO初始化为NaN
s_do[::30] = np.random.normal(10, 1, n_days//30) # 每月1次# 模拟Zemun数据
z_flow = np.random.normal(3500, 600, n_days)
z_wt = np.random.normal(15, 5, n_days)
z_do = np.full(n_days, np.nan)
z_do[::30] = np.random.normal(10, 1, n_days//30)# 合并数据
data = pd.DataFrame({"N_Flow": n_flow, "N_WT": n_wt, "N_DO": n_do,"S_Flow": s_flow, "S_WT": s_wt, "S_DO": s_do,"Z_Flow": z_flow, "Z_WT": z_wt, "Z_DO": z_do
}, index=dates)# KNN+Bootstrap填补缺失值
def knn_bootstrap_impute(data, target_col, feature_cols, n_bootstrap=100, k=5):train_data = data[data[target_col].notna()][feature_cols + [target_col]]test_data = data[data[target_col].isna()][feature_cols]scaler = StandardScaler()X_train = scaler.fit_transform(train_data[feature_cols])y_train = train_data[target_col].valuesX_test = scaler.transform(test_data)predictions = []n_samples = len(X_train)for _ in range(n_bootstrap):indices = np.random.choice(n_samples, n_samples, replace=True)X_boot = X_train[indices]y_boot = y_train[indices]knn = KNeighborsRegressor(n_neighbors=k, weights="distance")knn.fit(X_boot, y_boot)pred = knn.predict(X_test)predictions.append(pred)final_pred = np.mean(predictions, axis=0)data.loc[data[target_col].isna(), target_col] = final_predreturn data# 填补Senta和Zemun的DO
data = knn_bootstrap_impute(data, target_col="S_DO", feature_cols=["N_Flow", "N_WT", "N_DO", "S_Flow", "S_WT", "Z_Flow", "Z_WT"],n_bootstrap=100, k=5
)
data = knn_bootstrap_impute(data, target_col="Z_DO", feature_cols=["N_Flow", "N_WT", "N_DO", "S_Flow", "S_WT", "Z_Flow", "Z_WT"],n_bootstrap=100, k=5
)# 标准化数据
scaler = StandardScaler()
data_scaled = scaler.fit_transform(data)
data_scaled = pd.DataFrame(data_scaled, columns=data.columns, index=data.index)# 2. RTSGAN生成合成数据
class Generator(nn.Module):def __init__(self, input_dim, hidden_dim, output_dim):super(Generator, self).__init__()self.net = nn.Sequential(nn.Linear(input_dim, hidden_dim),nn.LeakyReLU(0.2),nn.LayerNorm(hidden_dim),nn.Linear(hidden_dim, output_dim))def forward(self, z):return self.net(z)class Discriminator(nn.Module):def __init__(self, input_dim, hidden_dim):super(Discriminator, self).__init__()self.net = nn.Sequential(nn.Linear(input_dim, hidden_dim),nn.LeakyReLU(0.2),nn.Linear(hidden_dim, 1))def forward(self, x):return self.net(x)def train_rtsgan(data, window_size=365, n_synthetic=2556, epochs=100):device = torch.device("cuda" if torch.cuda.is_available() else "cpu")data_tensor = torch.FloatTensor(data.values).to(device)# 第一次滑动窗口inputs = []for i in range(len(data) - window_size):inputs.append(data_tensor[i:i+window_size])inputs = torch.stack(inputs)# 参数input_dim = window_size * data.shape[1] # 365 * 9hidden_dim = 128output_dim = input_dimbatch_size = 64# 模型G = Generator(input_dim, hidden_dim, output_dim).to(device)D = Discriminator(input_dim, hidden_dim).to(device)optimizer_G = optim.Adam(G.parameters(), lr=0.0002, betas=(0.5, 0.999))optimizer_D = optim.Adam(D.parameters(), lr=0.0002, betas=(0.5, 0.999))# 训练for epoch in range(epochs):for i in range(0, len(inputs), batch_size):real_data = inputs[i:i+batch_size].view(-1, input_dim)batch_size_actual = real_data.size(0)# 训练判别器z = torch.randn(batch_size_actual, input_dim).to(device)fake_data = G(z)real_score = D(real_data)fake_score = D(fake_data.detach())d_loss = -torch.mean(real_score) + torch.mean(fake_score)optimizer_D.zero_grad()d_loss.backward()optimizer_D.step()# 训练生成器fake_score = D(fake_data)g_loss = -torch.mean(fake_score)optimizer_G.zero_grad()g_loss.backward()optimizer_G.step()if epoch % 10 == 0:print(f"Epoch {epoch}, D Loss: {d_loss.item():.4f}, G Loss: {g_loss.item():.4f}")# 生成合成数据synthetic_data = []for _ in range(n_synthetic):z = torch.randn(1, input_dim).to(device)fake = G(z).view(window_size, data.shape[1])synthetic_data.append(fake.cpu().detach().numpy())return np.concatenate(synthetic_data, axis=0)# 生成合成数据(2556个序列,约8年)
synthetic_data = train_rtsgan(data_scaled, window_size=365, n_synthetic=2556, epochs=100)
synthetic_data = pd.DataFrame(synthetic_data, columns=data.columns)# 3. 合并数据并进行第二次滑动窗口
combined_data = pd.concat([data_scaled, synthetic_data], axis=0, ignore_index=True)def create_sliding_window(data, input_window=10, output_window=3):X, y = [], []target_cols = ["N_DO", "N_WT", "S_DO", "S_WT", "Z_DO", "Z_WT"]for i in range(len(data) - input_window - output_window + 1):X.append(data.iloc[i:i+input_window].values) # 10天输入y.append(data.iloc[i+input_window:i+input_window+output_window][target_cols].values) # 3天输出return np.array(X), np.array(y)X, y = create_sliding_window(combined_data, input_window=10, output_window=3)# 划分训练和测试集
train_size = int(0.8 * len(X))
X_train, y_train = X[:train_size], y[:train_size]
X_test, y_test = X[train_size:], y[train_size:]# 4. LSTM模型(以Novi Sad站为例)
def build_lstm(input_shape, output_shape):model = Sequential([LSTM(64, input_shape=input_shape, return_sequences=True),LSTM(32),Dense(output_shape[0] * output_shape[1], activation="linear")])model.compile(optimizer="adam", loss="mse")return model# 准备Novi Sad数据
X_train_n = X_train[:, :, [0, 1, 2]] # Novi Sad: 流量, WT, DO
y_train_n = y_train[:, :, [0, 1]] # Novi Sad: DO, WT
X_test_n = X_test[:, :, [0, 1, 2]]
y_test_n = y_test[:, :, [0, 1]]# 训练LSTM
lstm_model = build_lstm(input_shape=(10, 3), output_shape=(3, 2))
lstm_model.fit(X_train_n, y_train_n.reshape(-1, 3*2), epochs=50, batch_size=32, verbose=1)# 预测
y_pred_n = lstm_model.predict(X_test_n).reshape(-1, 3, 2)# 5. GNN模型
# 构建图结构:Novi Sad->Senta, Novi Sad->Zemun
edge_index = torch.tensor([[0, 1, 0, 2], [1, 0, 2, 0]], dtype=torch.long)
edge_weight = torch.tensor([1.0, 1.0, 1.0, 1.0], dtype=torch.float)class GNNModel(nn.Module):def __init__(self, input_dim, hidden_dim, output_dim):super(GNNModel, self).__init__()self.gat1 = GATConv(input_dim, hidden_dim, heads=2, dropout=0.2)self.gat2 = GATConv(hidden_dim*2, hidden_dim, heads=1, dropout=0.2)self.fc = nn.Linear(hidden_dim*10, output_dim)def forward(self, x, edge_index, edge_weight):# x: [n_nodes, time_steps, features]x = x.view(-1, x.size(-1)) # [n_nodes*time_steps, features]x = F.relu(self.gat1(x, edge_index, edge_weight))x = self.gat2(x, edge_index, edge_weight)x = x.view(-1, 10*32) # [batch, time_steps*hidden]x = self.fc(x)return x.view(-1, 3, 6) # [batch, time_steps, targets]def prepare_gnn_data(X, y):data_list = []for i in range(len(X)):# 3站×10天×3特征x = torch.FloatTensor(X[i].reshape(3, 10, 3))y_i = torch.FloatTensor(y[i]) # 3天×6目标data = Data(x=x, edge_index=edge_index, edge_weight=edge_weight, y=y_i)data_list.append(data)return data_list# 准备GNN数据
train_data = prepare_gnn_data(X_train, y_train)
test_data = prepare_gnn_data(X_test, y_test)# 训练GNN
device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
gnn_model = GNNModel(input_dim=3, hidden_dim=32, output_dim=3*6).to(device)
optimizer = optim.Adam(gnn_model.parameters(), lr=0.001)for epoch in range(50):gnn_model.train()total_loss = 0for data in train_data:data = data.to(device)optimizer.zero_grad()out = gnn_model(data.x, data.edge_index, data.edge_weight)loss = F.mse_loss(out, data.y)loss.backward()optimizer.step()total_loss += loss.item()if epoch % 10 == 0:print(f"Epoch {epoch}, GNN Loss: {total_loss/len(train_data):.4f}")# 预测
gnn_model.eval()
y_pred_gnn = []
with torch.no_grad():for data in test_data:data = data.to(device)pred = gnn_model(data.x, data.edge_index, data.edge_weight)y_pred_gnn.append(pred.cpu().numpy())
y_pred_gnn = np.array(y_pred_gnn)# 6. 评估
def calculate_rmse(y_true, y_pred):rmse = np.sqrt(mean_squared_error(y_true.reshape(-1), y_pred.reshape(-1)))return rmse# 计算NSE
def calculate_nse(y_true, y_pred):y_true_flat = y_true.reshape(-1)y_pred_flat = y_pred.reshape(-1)y_mean = np.mean(y_true_flat)numerator = np.sum((y_true_flat - y_pred_flat) ** 2)denominator = np.sum((y_true_flat - y_mean) ** 2)return 1 - numerator / denominator# LSTM评估
rmse_lstm = calculate_rmse(y_test_n, y_pred_n)
nse_lstm = calculate_nse(y_test_n, y_pred_n)
print(f"LSTM RMSE: {rmse_lstm:.4f}, NSE: {nse_lstm:.4f}")# GNN评估
rmse_gnn = calculate_rmse(y_test, y_pred_gnn)
nse_gnn = calculate_nse(y_test, y_pred_gnn)
print(f"GNN RMSE: {rmse_gnn:.4f}, NSE: {nse_gnn:.4f}")
不足以及展望
研究局限于三个水文站,增加站点时,LSTM方法资源消耗大、可扩展性差;Senta和Zemun站的溶解氧数据仅约每月一次,影响RTSGAN性能评估;合成数据并非在所有情况下都能提升预测效果,生成方法有待优化;训练GAN和深度学习模型需大量计算资源,不利于大规模实时应用。后续可将该工作流程应用于更多水文站,纳入气候数据等环境因素,以丰富训练数据集,提高模型泛化能力。
相关文章:
2025.3.23机器学习笔记:文献阅读
2025.3.23周报 题目信息摘要Abstract创新点网络架构实验不足以及展望 题目信息 题目: Enhancement of Hydrological Time Series Prediction with Real-World Time Series Generative Adversarial Network-Based Synthetic Data and Deep Learning Models期刊&…...
Day20-前端Web案例——部门管理
目录 部门管理1. 前后端分离开发2. 准备工作2.1 创建Vue项目2.2 安装依赖2.3 精简项目 3. 页面布局3.1 介绍3.2 整体布局3.3 左侧菜单 4. Vue Router4.1 介绍4.2 入门4.3 案例4.4 首页制作 5. 部门管理5.1部门列表5.1.1. 基本布局5.1.2 加载数据5.1.3 程序优化 5.2 新增部门5.3…...
实验3 以太坊交易周期的需求分析
区块链技术 实验报告 实验名称 实验3 以太坊交易周期的需求分析 一、实验目的 1、学习并掌握以太坊交易的内容; 2、学习并掌握以太坊交易周期的四个阶段; 3、学习并掌握结构化需求分析方法; 4、学习并掌握面向对象的需求分析方法&…...
Linux 通过压缩包安装 MySQL 并设置远程连接教程
一、引言 在 Linux 系统中,有时候我们需要通过压缩包的方式手动安装 MySQL 数据库,并且为了方便在其他设备上对数据库进行管理和操作,还需要设置允许远程连接。本文将详细介绍在 Linux(以 CentOS 为例)系统中通过压缩包安装 MySQL 8 并设置远程连接的步骤。 二、安装前准…...
【商城实战(56)】商城数据生命线:恢复流程与演练全解析
【商城实战】专栏重磅来袭!这是一份专为开发者与电商从业者打造的超详细指南。从项目基础搭建,运用 uniapp、Element Plus、SpringBoot 搭建商城框架,到用户、商品、订单等核心模块开发,再到性能优化、安全加固、多端适配…...
Java学习笔记-XXH3哈希算法
XXH3是由Yann Collet设计的非加密哈希算法,属于XXHash系列的最新变种,专注于极速性能与低碰撞率,适用于对计算效率要求极高的场景。 极速性能 在RAM速度限制下运行,小数据(如 1-128 字节)处理可达纳秒级&…...
同旺科技USB to SPI 适配器 ---- 指令循环发送功能
所需设备: 内附链接 1、同旺科技USB to SPI 适配器 1、周期性的指令一次输入,即可以使用 “单次发送” 功能,也可以使用 “循环发送” 功能,大大减轻发送指令的编辑效率; 2、 “单次发送” 功能,“发送数据…...
在Mac M1/M2芯片上完美安装DeepCTR库:避坑指南与实战验证
让推荐算法在Apple Silicon上全速运行 概述 作为推荐系统领域的最经常用的明星库,DeepCTR集成了CTR预估、多任务学习等前沿模型实现。但在Apple Silicon架构的Mac设备上,安装过程常因ARM架构适配、依赖库版本冲突等问题受阻。本文通过20次环境搭建实测…...
【CXX-Qt】2.5 继承
某些 Qt API 要求你从抽象基类中重写某些方法,例如 QAbstractItemModel。 为了支持直接从 Rust 中创建这样的子类,CXX-Qt 提供了多种辅助工具。 某些基类可能需要特殊的构造参数。这可以通过使用自定义构造函数来实现。 访问基类方法 要在 Rust 中访…...
Linux系统之美:环境变量的概念以及基本操作
本节重点 理解环境变量的基本概念学会在指令和代码操作上查询更改环境变量环境变量表的基本概念父子进程间环境变量的继承与隔离 一、引入 1.1 自定义命令(我们的exe) 我们以往的Linux编程经验告诉我们,我们在对一段代码编译形成可执行文件后…...
【nnUnetv2】推理+评估+测试
在 Windows 系统下设置环境变量 之前训练和推理的时候开着AutoDL的服务器,是在 Linux 系统下设置的环境变量。 但是现在开始研究具体代码了,就在本地跑(一直开着服务器有点费钱),所以就在Windows 系统下设置环境变量。 ①右键点击 “此电脑”,选择 “属性”。 ②在左侧…...
损失函数理解(一)——极大似然估计
本博客内容来自B站up主【王木头学科学】的视频内容 习惯看视频的小伙伴可移至视频链接[待补充]:~~~ 首先通俗地解释一下极大似然估计(Maximum Likelihood Estimation,MLE)的思想:通过结果寻找使该结果发生的最可能的原…...
ios端使用TCplayer直播播放三秒直接卡顿bug
1. 查看配置项没问题 setTcPlayer() {let that this;player new TcPlayer("videoPlayer", {live: this.activatPlayType "livePlay" ? true : false,x5_type: "h5",x5_fullscreen: true,systemFullscreen: true,x5_orientation: 1,x5_player…...
大模型-提示词工程与架构
什么是提示工程 提示工程(Prompt Engineering)是一门新兴的技术领域,专注于研究如何设计、构建和优化提示词,以充分发挥大模型的潜力 。它涉及到对语言结构、任务需求、模型特性等多方面因素的综合考量。提示工程的目标是通过精心…...
高斯数据库-WDR Snapshot生成性能报告
docker 安装高斯数据库: docker pull opengauss/opengauss:latestdocker run --name opengauss --privilegedtrue -d -e GS_PASSWORDopenGauss123 -p 8090:5432 -v /opengauss:/var/lib/opengauss/data opengauss/opengauss:latest 进入容器设置用户权限ÿ…...
损失函数理解(二)——交叉熵损失
损失函数的目的是为了定量描述不同模型(例如神经网络模型和人脑模型)的差异。 交叉熵,顾名思义,与熵有关,先把模型换成熵这么一个数值,然后用这个数值比较不同模型之间的差异。 为什么要做这一步转换&…...
CSS学习笔记
【1】CSS样式规则 【2】CSS样式表引入方式 1、行内式 <!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEedge"/><meta name"vi…...
AI比人脑更强,因为被植入思维模型【15】马斯洛需求层次理论
马斯洛需求层次模型思维模型 定义 马斯洛需求层次模型是由美国心理学家亚伯拉罕马斯洛(Abraham Maslow)于1943年提出的一种心理学理论,用于描述人类动机的层次结构。该模型将人类的需求从低到高分为五个层次,分别是生理需求、安…...
cartographer中地图转换
文章目录 地图种类栅格地图 坐标系种类ros坐标系像素坐标系物理坐标系(世界坐标系) 地图种类 栅格地图 地图的初始化 在Cartographer中,栅格地图通过概率值来表示每个栅格的状态。每个栅格的初始概率值通常设置为0.5,表示未知状态。这种初始化方式允许…...
关于MTU的使用(TCP/IP网络下载慢可能与此有关)
参考链接:告诉你mtu值怎么设置才能网速最好! -Win7系统之家 出现网络速度被限制,可能与MTU值相关,先查看下本机的MTU winR,然后输入:netsh interface ipv4 show subinterfaces ,查看自己网络中的MTU&…...
【AI解题】Cache直接映射地址划分解析
一、问题背景 某32位总线处理器的Cache采用直接映射方式,已知 Cache总容量为16KB,每个Cache块大小为16字节。需要确定内存地址中 Offset(块内偏移)、Index(块索引)、Tag(标签) 三部…...
android音频概念解析
音频硬件接口(我们可以理解为ASOC的声卡) 官方代码里叫audio hardware interface 也称为module,定义在services/audiopolicy/config/audio_policy_configuration.xml: 分别有primary,a2dp,usb࿰…...
项目生命周期 和 项目管理生命周期的差异
在项目管理中,明确区分 项目生命周期 和 项目管理生命周期 是理解项目运作的关键。以下从定义、阶段划分到实际应用进行系统性分析: 一、项目生命周期(Project Life Cycle) 定义 项目生命周期是项目从 启动到结束 的自然演进过程,描述项目交付成果的 技术性阶段,通常与…...
UDP 协议
文章目录 UDP 协议简介数据包格式UDP 通信流程抓包分析参考 本文为笔者学习以太网对网上资料归纳整理所做的笔记,文末均附有参考链接,如侵权,请联系删除。 UDP 协议 UDP 是一种面向无连接的传输层协议,属于 TCP/IP 协议簇的一种。…...
[已解决]jupyter notebook报错 500 : Internal Server Error及notebook闪退
jupyter notebook出现如上图的报错,可以在黑色窗口中检查是为什么报错。 我检查发现是nbconvert导致的问题,卸载重装nbconvert。 但是这时候出现,jupyter notebook闪退问题。jupyter的黑色窗口出现一秒钟就没了。 在Anaconda Prompt中检查ju…...
APM 仿真遥控指南
地面站开发了一段时间了,由于没有硬件,所以一直在 APM 模拟器中验证。我们已经实现了 MAVLink 消息接收和解析,显示无人机状态,给无人机发送消息,实现一键起飞,飞往指定地点,降落,返…...
使用 ncurses 库创建文本用户界面:基础函数详解
简介 ncurses 是一个功能强大的库,用于在 Unix-like 系统中创建文本用户界面。它提供了丰富的函数来控制屏幕上的文本显示、处理键盘输入、绘制图形元素等。本文将详细介绍 ncurses 库中的一些基础函数,包括 printw、wrefresh、获取用户信息、键盘输入、…...
dify创建第一个Agent
1、首先LLM模型必须支持 Function Calling 由于deepseek-R1本地化部署时还不支持,所以使用 qwq模型。 2、创建空白 Agent 3、为Agent添加工具 4、测试 当未添加时间工具时 询问 时间 如下 5、开启时间工具 询问如下...
nebula graph传统使用Docker进行项目发版
nebula graph传统使用Docker进行项目发版 1. nebula graph服务2. 搭建ES集群3. 注意事项3.1 图数据库的启动顺序3.2 模糊查询失效 1. nebula graph服务 1.在测试服务器中执行如下命令 docker commit 85b6e2b8xxx xxx_nebula_es:1.0.0.2执行docker images之后能看到新的镜像 x…...
OpenCV vs MediaPipe:哪种方案更适合实时手势识别?
引言 手势识别是计算机视觉的重要应用,在人机交互(HCI)、增强现实(AR)、虚拟现实(VR)、智能家居控制、游戏等领域有广泛的应用。实现实时手势识别的技术方案主要有基于传统计算机视觉的方法&am…...
PRODIGY: “不折腾人”的蛋白-蛋白/蛋白-小分子结合能计算工具
PRODIGY(全称为 PROtein binDIng enerGY prediction)是一种蛋白质结合能预测工具,可利用蛋白质-蛋白质复合物的三维结构来预测其结合亲和力。PRODIGY 利用一种高效的基于接触的方法,在估计结合自由能和解离常数的同时,…...
IDEA修改默认作者名称
User: IDEA提示注释缺少author信息,但自动设置后,名称不是我想要的默认名称,应该如何修改IDEA里默认的作者名称? Kimi: 以下是几种修改IntelliJ IDEA中默认作者名称的方法: ### 方法一:修改File and Code …...
【嵌入式学习2】C语言 - VScode环境搭建
目录 ## 语言分类 ## c语言编译器 ## VScode相关配置 ## 语言分类 编译型语言:C,C解释型语言:python,JS ## c语言编译器 分类GCC 系列MinGWCygwinMSVC系列一套编程语言编译器将GCC编译器和GNU Binutils移植到Win32平台下的产物…...
【TI MSPM0】Timer学习
一、计数器 加法计数器:每进入一个脉冲,就加一减法计算器:每进入一个脉冲,就减一 当计数器减到0,触发中断 1.最短计时时间 当时钟周期为1khz时,最短计时时间为1ms,最长计时时间为65535ms 当时…...
SQL Server数据库慢SQL调优
SQL Server中慢SQL会显著降低系统性能并引发级联效应。首先,用户直接体验响应时间延长,核心业务操作(如交易处理、报表生成)效率下降,导致客户满意度降低甚至业务中断。其次,资源利用率失衡,CPU…...
大数据平台上的数据建模与分析:从数据到决策的跃迁
大数据平台上的数据建模与分析:从数据到决策的跃迁 随着数字化转型的深入,大数据平台成为了企业实现智能决策和创新的核心技术基础。大量结构化、半结构化和非结构化数据的生成和存储,促使企业需要更高效的方式来管理、分析、以及从中提取有价值的信息。在这一过程中,数据…...
C++ --- 多态
1 多态的概念 多态(polymorphism)的概念:通俗来说,就是多种形态。多态分为编译时多态(静态多态)和运⾏时多 态(动态多态),这⾥我们重点讲运⾏时多态,编译时多态(静态多态)和运⾏时多态(动态多态)。编译时 多态(静态多态)主要就是我…...
细说卫星导航:测距定位原理
测距定位原理 1. 伪距测量技术 核心原理:卫星发射信号,用户接收并记录传播时间,乘以光速得到距离(伪距)。 技术细节: 信号传播路径分析 信号结构: 卫星信号包含三部分: 载波&…...
【AI News | 20250322】每日AI进展
AI Repos 1、DeTikZify 可以把草图或图形转换成TikZ代码的模型,可用来绘制复杂的科学图表,输入草图或文字描述即可转换成TikZ代码。DeTikZify强大的地方在于它能理解图表的语义信息, 能识别图表中的不同组成部分及其含义,比如坐标…...
【js逆向入门】图灵爬虫练习平台 第九题
地址:aHR0cHM6Ly9zdHUudHVsaW5ncHl0b24uY24vcHJvYmxlbS1kZXRhaWwvOS8 f12进入了debugger,右击选择一律不在此处暂停, 点击继续执行 查看请求信息 查看载荷,2个加密参数,m和tt 查看启动器,打上断点 进来 往…...
重新复活的(手机端)一站式应用管理与下载平台
应用乐园(安卓) 应用乐园作者去年3月表示,由于精力问题,要停止维护奇妙搜索、应用乐园、奇妙影视这些软件了。 然而最近,令人意外的是,应用乐园竟然“复活”了!更准确地说,它进行了…...
AI密码学
嗯,用户给了一个需要破译的密码文档:“Uif qjh jt po uif usff.”,提示是用字母往前推移1的凯撒密码。首先,我得确认自己是否正确理解提示。凯撒密码通常是将字母按照一定位移来替换,这里的提示是往前推1位,…...
Python设计模式 - 适配器模式
定义 适配器模式(Adapter Pattern)是一种结构型设计模式,它用于将一个类的接口转换为客户端所期待的另一个接口。 注:在适配器模式定义中所提及的接口是指广义的接口,它可以表示一个方法或者一组方法的集合。 结构 …...
S32K324 MCAL SPI波特率配置不对问题排查
文章目录 前言MCAL配置检查SPI时钟源问题处理总结 前言 项目开发过程中,MCAL SPI配置时发现实际配置的波特率和用逻辑分析仪采集的时钟频率对不上,实际的频率只有配置的一半,本文记录该问题的排查过程。 MCAL配置检查 MCAL SPI配置波特率在…...
STM32八股【2】-----ARM架构
1、架构包含哪几部分内容 寄存器处理模式流水线MMU指令集中断FPU总线架构 2、以STM32为例进行介绍 2.1 寄存器 寄存器名称作用R0-R3通用寄存器用于数据传递、计算及函数参数传递;R0 也用于存储函数返回值。R4-R12通用寄存器用于存储局部变量,减少频繁…...
Java 记忆链表,LinkedList 的升级版
文章目录 记忆链表 MemoryLinkedList实战源代码 众所周知,ArrayList 和 LinkedList 是 Java 集合中两个基本的数据结构,对应数据结构理论中的数组和链表。但在这两个数据结构,开发者们通常使用 ArrayList,而不使用 LinkedList。JD…...
浔川社团官方联合会维权成功
在2025.3.2日,我社团检测文章侵权中,检测出3篇文章疑似遭侵权,随后,总社团联合会立即联系CSDN版权,经过17天的维权,至今日晚,我社团维权成功!侵权文章全部被设置为转载。 在此&…...
asp.net core mvc模块化开发
razor类库 新建PluginController using Microsoft.AspNetCore.Mvc;namespace RazorClassLibrary1.Controllers {public class PluginController : Controller{public IActionResult Index(){return View();}} }Views下Plugin下新建Index.cshtml {ViewBag.Title "插件页…...
Linux——线程
Linux——线程 目录 一、线程 1.1 创建一个线程 1.2 主函数等待线程结束pthread_join 为什么输出是乱序的 一、线程 线程:进程内部的一条执行路径 进程:一个正在运行的程序 进程相当于工厂车间,线程就是车间里的许多工人 1.1 创建一个…...
dubbo异步调用
Dubbo 异步调用分为 Provider 端异步调用和 Consumer 端异步两种模式。 Consumer 端异步是指发起 RPC 调用后立即返回,调用线程继续处理其他业务逻辑,当响应结果返回后通过回调函数通知消费端结果。Provider 端异步执行将阻塞的业务从 Dubbo 内部线程池…...