第三十四周:文献阅读+LSTM学习

目录

摘要

Abstract

文献阅读:综合EMD-LSTM模型在城市排水管网水质预测中的应用

现有问题

提出方法

EMD-LSTM综合模型

研究框架

结论

Long Short-term Memory(长短期记忆)

1. LSTM的结构

2. Multiple-layer LSTM

3.3 LSTM Example

3. GRU

LSTM实现PM2.5预测

总结


摘要

在本周阅读的文献中,提出了以EMD为中心的数据预处理模块和LSTM预测模块相结合的城市排水管网水质HCI综合预测模型。在EMD-LSTM模型中,EMD允许保留异常值并利用非对齐时刻的数据,这有助于捕获数据模式,而LSTM神经网络强大的非线性映射和学习能力可以对水质进行时间序列预测,综合预测模型实现对城市排水网络水质的准确预测。LSTM是一种特殊的RNN,比普通的RNN多了三个“门”,可以让信息有选择性的通过。LSTM能够在更长的序列中有更好的表现,解决了RNN训练时的梯度无效问题。

Abstract

The literature read this week proposes a comprehensive prediction model for urban drainage network water quality HCI, which combines an EMD centered data preprocessing module and an LSTM prediction module. In the EMD-LSTM model, EMD allows for retaining outliers and utilizing data from non aligned moments, which helps capture data patterns. The powerful nonlinear mapping and learning capabilities of LSTM neural networks enable time series prediction of water quality, and the comprehensive prediction model achieves accurate prediction of water quality in urban drainage networks. LSTM is a special type of RNN that has three more gates than regular RNN, allowing information to selectively pass through. LSTM can perform better in longer sequences, solving the problem of ineffective gradients during RNN training.

文献阅读:综合EMD-LSTM模型在城市排水管网水质预测中的应用

链接:Accurate prediction of water quality in urban drainage network with integrated EMD-LSTM model

现有问题

快速准确地掌握排水管网中的水质,对于城市水环境的管理和预警至关重要。而基于建模的检测方法能够基于廉价的多源数据进行快速且无需试剂的水质检测,这比传统的基于化学反应的检测方法更清洁、更可持续。这些方法只需要很少的参数,并且可以进行更清洁和可持续的水质检测。但其准确性不尽如人意,因此这也限制了在实际上的应用。这一问题可归因于其处理非线性、非平稳水质时间序列的能力较差。

提出方法

在深度学习算法中,LSTM神经网络又因其独特的门结构而特别擅长处理时间序列,使其能够捕获时间序列中的长期依赖关系。使用LSTM神经网络作为建模算法是提高基于建模的水质检测精度的有效途径。该文提出一种融合EMD-LSTM模型,该模型将以经验模态分解(EMD)为中心的数据预处理模块与长短期记忆(LSTM)神经网络预测模块相结合,以提高基于建模的检测方法的精度。由于时间序列相邻值之间的密切关系,非对齐数据是优化对齐时刻数据(即对齐数据)的良好基础。设计一个预处理程序,有效地利用准确的异常值和非对齐数据是必要的。时频变换技术可以将时间序列转换成不同频率的分量。过滤掉代表噪声或对原始数据贡献不大的成分可以减少噪声。这意味着时频变换算法允许保留异常值并通过非对齐数据优化对齐数据。值得一提的是,一些时频变换技术,如短时傅立叶变换(STFT)和小波变换(WT),不适合分析非平稳时间序列。原因是它们的基函数在变换过程中不能改变,而经验模态分解(EMD)有效地克服了这一困难。

EMD-LSTM综合模型

通过多源混频数据集作为测试数据,根据获取数据所需的时间和经济成本,将15个指标分为两部分,LCIs(L1,L2,…,L10)作为模型输入,HCIs(H1,H2,…,H5)作为模型输出。对所有指标进行基本预处理,包括清洗、填充和归一化。但这仅清理了由于仪器故障导致的连续缺失值和异常值。用插值法填充单个缺失值。Min-max归一化方法将所有指标归一化,消除数值差异,如式(1)所示,对每个LCI进行EMD。对于在此分解中获得的分量,代表噪声或具有低贡献的部分被去除。将剩余成分相加,形成优化后的LCIs(L1',L2',…,L10')。在预处理程序结束时,高频指标根据低频指标的频率进行对齐。在移除高频指标之前,将频率对准放置在EMD之后,以确保高频指标中频率不匹配的部分有助于EMD。

(1)

x_{t}表示时间序列中时间t所对应的值,x_{t}{}'表示x_{t}归一化后的值,x_{max}表示时间序列中的最大值,x_{min}表示时间序列中的最小值。

将优化后频率一致的LCI作为“多对一”结构LSTM神经网络的输入。在检验EMD-LSTM模型的性能时,构建了5个结构相同的EMD-LSTM模型,分别预测5个HCI

EMD原理

EMD自适应地将非线性非平稳时间序列分解为几个固有模态函数(IMF)和一个趋势项(即分量)。IMF的数量取决于时间序列本身。该方法的优点是基于时间序列本身的尺度特征实现分解,不需要设置任何基函数。IMF和趋势项是在一个连续的迭代过程中产生的。具体流程可归纳为如下六个步骤:

  1. 找到时间序列x(t)中所有的局部最大值和局部最小值。
  2. 基于三次样条插值理论(cubic spline interpolation theory),将所有的局部最大值和最小值分别连接起来,形成上下包络线(u(t)v(t))。
  3. 通过公式m(t)=[u(t)+v(t)]/2产生平均包络线m(t)
  4. 通过公式h(t)=x(t)-m(t)产生差异h(t)
  5. 检查h(t)是否满足IMF条件(a)和(b)。(a)极值点的个数和过零点的个数必须等于或最多相差一个;(b)在任何时刻t,由局部最大值组成的上包络和由局部最小值组成的下包络的平均值均为零。
  6. 如果不满足IMF的条件,h(t)被视为时间序列x(t),并重复步骤1至步骤5,直到h(t)更新到满足两个条件。满足两个条件意味着这个h(t)将是第一个IMF(c_{1}(t)),然后根据公式r_{1}(t)=x(t)-c_{1}(t)产生第一个残差r_{1}(t)来替换掉时间序列x(t),接着重复步骤1至步骤5,迭代生成剩余的n个IMF。

连续迭代,直到r_{n}(t)满足标准差小于0.25,则r_{n}(t)趋势项。如公x(t)=\sum_{i=1}^{n}c_{i}(t)+r_{n}(t)所示,时间序列x(t)最后通过EMD分解为n个IMF和一个趋势项的和。

研究框架

将数据集分为训练集(2019-10-26 ~ 2019-11-20,25 d)和测试集(2019-11-21 ~ 2019-11-26,6 d),分割比例为4:1。结合传统的预处理模块和预测模块构建了其他集成模型,与EMD-LSTM集成模型进行对比。设计了一系列的对照实验来测试所提出的EMD-LSTM的性能并分析其产生的原因,主要分为五个部分:

  1. 比较不同数据预处理程序对预测精度的影响
  2. 比较不同预测算法对预测精度的影响
  3. 分析不同数据预处理程序对数据集的优化效果
  4. 验证保留异常值对预测精度的影响
  5. 验证利用非对齐数据对预测精度的影响

集成模型的性能评价

1、预处理模块比较

构建EMD-LSTM、to - lstm、STFT-LSTM,比较不同预处理模块对预测精度的影响。采用SMAPE、判定R2、RMSE评价EMD-LSTM模型的预测性能。SMAPE该统计度量可以反映预测结果与实测值之间的相对偏差程度。RMSE表示实测值与预测结果的绝对差值,R2可以反映实测值的波动可以被模型预测值解释的程度。结果表明,STFT和EMD在时间序列预处理过程中确实可以提高预测结果的精度。

 2、预测模块比较

测试了EMD预处理模块与传统数据驱动预测模块相结合的效果。在综合EMDLSTM模型中,使用PLSR、GBR、DNN作为预测模块替代LSTM,4种预测模块的性能表现为LSTM > DNN > GBR > PLSR。即RNN架构和门结构带来的记忆能力使LSTM更适合处理时间序列问题

结论

与传统数据预处理程序(即TO、STFT)和数据驱动预测算法(即PLSR、GBR、DNN)形成的集成模型相比,EMD-LSTM集成模型在预测hci方面表现最佳。在数据预处理过程中应用时频变换算法提高了预测精度,EMD算法的预测效果优于STFT算法。保留的异常值有助于保持原始时间序列的完整性,这使得LSTM神经网络能够更好地捕获数据模式(R2高0.87-1.73%)。在高频指标中,非对齐数据正有助于优化对齐数据,提高后续LSTM神经网络的准确率(R2提高0.27 ~ 0.54%)。良好的精度(R2≥0.94)使得集成EMD-LSTM模型适合实际应用中的水质检测。

Long Short-term Memory(长短期记忆)

1. LSTM的结构

LSTM是一种特殊的RNN,比普通的RNN多了三个“门”,可以让信息有选择性的通过。当一条序列很长的时候,RNN很难将从一开始的信息传送到后面的时间点,而LSTM能够学习长期依赖的信息,记住早时间点的信息,更好的联系上下文。

099fcba55e8e4db2b21655eed84ce7db.png

Input Gate:控制input数据输入

Forget Gate:控制是否保存中间结果

Output Gate:控制output数据输出

eq?x%5E%7Bt%7D乘上一个matrix变成向量eq?zeq?x%5E%7Bt%7D再分别乘以一个transform得到eq?z_%7Bi%7Deq?z_%7Bo%7Deq?z_%7Bf%7D,它们的维数跟LSTM的数量一样,eq?z的每一维的数值分别代表每个LSTM的input,eq?z_%7Bi%7Deq?z_%7Bo%7Deq?z_%7Bf%7D的每一维操纵一个LSTM的Input Gate、Output Gate、Forget Gate。

26243fa67ef74991bb52be6b418be65f.png

输入:eq?z

输出门控制信号:eq?z_%7Bo%7D

输入门控制信号:eq?z_%7Bi%7D

遗忘门控制信号:eq?z_%7Bf%7D

激活函数基本都是sigmoid函数,值域在0和1之间,函数值决定所控制门的开关程度,值越大,门打开程度越大。如果eq?z_%7Bf%7D为0,这说明存在memory中的数值不能被读取出来。Input Gate与Output Gate的开与关是由network进行学习后自行决定的,对memory里的哪些值进行forget也是由network自行学习的。

51adc116b817415eb4e770f4e523c39b.png

 将LSTM当做一个特殊的神经元,但是从图中可以看出LSTM比普通的神经元多了三个门,每个门都需要相应的参数,因此LSTM需要的参数量相当于普通神经元的4倍。

05d5ab371484405da3a419708bf126ef.png

其实就是原来简单的neuron换成LSTM。

47362115f8454d098ebdb61a468ac4cb.png

2. Multiple-layer LSTM

真正的 LSTM在输入的时候还会把 hidden layer 的输出eq?h%5E%7Bt-1%7D 接上,还会加上上一个时间点 memory cell 的值 eq?c%5E%7Bt-1%7D ,再在经过不同的 transform 得到四个不同的 z vector 去控制 LSTM,LSTM 也不止一层,可以叠多层。
622aed486e674649a9bd21b4bc587d96.png

3.3 LSTM Example

当​eq?x_%7B2%7D%3D1​的时候,将eq?x_%7B1%7D的的值添加到memory;

eq?x_%7B2%7D%3D-1的时候,将memory中的值移除;

eq?x_%7B3%7D%3D1的时候,输出memory里的值。

58bf495787b244d7b4769e3bab648b69.png

 以第一个序列为例,设置输入门eq?x_%7B2%7D的权重为100,偏差值为1权重为-10,也就是当eq?x_%7B2%7D的值小于0.1即小于0,那么通过sigmoid函数之后输入门的值就接近0,代表门被关闭,否则可以将eq?x_%7B1%7D的值存入memory,同理可知输出门和遗忘门的权重设置,但遗忘门的偏差为10,通常是被打开的,只有当eq?x_%7B2%7D的值为一个很大的负数的时候才会被关闭。序列1输入,memory存的值不变,并且输出门值为0不输出,序列2输入将eq?x_%7B1%7D的值3保存到memory,但输出门为0,memory的值不输出,序列3输入,将将eq?x_%7B1%7D的值4保存到memory,此时memory的值为3+4=7,输出门不为0,输出memory中的值7。

94c4943783a740ca8d681ef8bc4513d6.png

3. GRU

LSTM是RNN的升级版,加了门控装置,解决了长时记忆依赖的问题。但由于参数量复杂,带来了计算量增加,所以引进了简化版的LSTM,即GRU。

GRU在LSTM的基础上减少了一个门,即用更新门代替了遗忘门和输出门,其参数更少,训练相对简单一点。而从效果上说,二者并没有优劣之分,取决于具体的任务和数据集而定。实际上来讲,二者的表现差距往往不大,远远没有调参效果明显。

LSTM实现PM2.5预测

数据集:Beijing PM2.5 Data

import torch
import torch.nn as nn
import seaborn as sns
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from sklearn.preprocessing import MinMaxScaler
 
# # 打印出Seaborn库中内置的所有数据集列表
# datasets_name = sns.get_dataset_names()
# print("ALL DATASET:", datasets_name)
#
# # 加载航班数据集
# flight_data = sns.load_dataset("flights")
# flight_data.head()
 
data = pd.read_excel('../DataSet/PRSA_data_2010.1.1-2014.12.31(Updated_data).xlsx')
# print(data, type(data))
 
# 将 PM2.5 列的数据改为浮点型存入 all_data 中
all_data = data['PM2.5'].values.astype(float)
 
# 将列 TIME-HOUR 转换为日期格式
data['TIME-HOUR'] = pd.to_datetime(data['TIME-HOUR'])
 
# data 的列类型是对象
# print(data.head(), data.shape, data.columns)
# data 是一个 numpy 二维数组
# print(data)
 
# 划分33824个训练集和10000测试集
test_data_size = 10000
train_data = all_data[:-test_data_size]
test_data = all_data[-test_data_size:]
# print(len(train_data))
# print(len(test_data))
 
# 归一化,注意 fit_transform 方法的输入必须是一个二维的数组
# 训练集和测试集不要一起归一化,就是说不要先归一化再划分数据集,先将数据集划分后再分别进行归一化
scaler = MinMaxScaler(feature_range=(-1, 1))
train_data_normalized = scaler.fit_transform(train_data.reshape(-1, 1))
test_data_normalized = scaler.fit_transform(test_data.reshape(-1, 1))
# 印出归一化训练数据的前5条和后5条记录
# print(train_data_normalized[:5])
# print(train_data_normalized[-5:])
 
# 将数据集转换为张量
train_data_normalized = torch.FloatTensor(train_data_normalized).view(-1)
test_data_normalized = torch.FloatTensor(test_data_normalized).view(-1)
# print(train_data_normalized)
 
# 将训练数据转换为序列和相应的标签
# 可以使用任何序列长度,取决于领域知识,比如说数据是按月份收集的就将序列长度设为12(一年12个月),如果数据是按天数收集的就将序列长度设为365(一年365天)
# 本数据集是按小时收集的,所以设定序列长度为 30 * 24 (按月来设定窗口)
train_window = 30 * 24
 
# 定义一个名为create_inout_sequences的函数
# 该函数将接受原始输入数据,并返回一个元组列表
# 在每个元组中,第一个元素将包含 30 * 24 个项目的列表,对应于前1个月内每个小时的 PM2.5 的排放量,第二个元素将包含一个项目的列表即第2个月的第一个小时的 PM2.5 的排放量
def create_inout_sequences(input_data, tw):
    inout_seq = []
    L = len(input_data)
    for i in range(L-tw):
        train_seq = input_data[i:i+tw]
        train_label = input_data[i+tw:i+tw+1]
        inout_seq.append((train_seq, train_label))
    return inout_seq
# 创建训练序列
train_input_seq = create_inout_sequences(train_data_normalized, train_window)
# print(train_inout_seq[:5])
 
class LSTM(nn.Module):
    # input_size:对应于输入中特征的数量,数据集中只有 PM2.5 这一个特征
    # hidden_layer_size:指定隐藏层的数量以及每层神经元的数量
    # output_size:输出中项目的数量,本项目中只预测未来一个小时内的 PM2.5 的量,因此输出大小将为1
    def __init__(self, input_size=1, hidden_layer_size=100, output_size=1):
        super().__init__()
        self.hidden_layer_size = hidden_layer_size
        self.lstm = nn.LSTM(input_size, hidden_layer_size)
        self.linear = nn.Linear(hidden_layer_size, output_size)
 
    # self.hidden_cell:这是 LSTM 层的隐藏状态
    # LSTM 层是一种循环神经网络(RNN),它在处理序列数据时会维护一个隐藏状态,用于捕获序列中的时间相关性
    # input_seq:这是输入到 LSTM 层的数据序列
    # 在这里,input_seq 被视为一个三维张量,其形状为 (sequence_length, batch_size, input_size)
    # 其中 sequence_length 表示序列的长度,batch_size 表示批次大小,input_size 表示输入特征的数量
    # view(len(input_seq), 1, -1):这是一个 PyTorch 的操作,用于重新排列输入张量的维度
    # 具体来说,它将输入张量的维度从 (sequence_length, input_size) 重新排列为 (sequence_length, 1, input_size)
    # 这是因为 LSTM 层期望输入数据具有这种形状,其中第二个维度通常用于批次大小,这里 1 表示批次大小为 1
    # lstm_out 的形状为 (sequence_length, batch_size, hidden_size)
    # 预测出来的 PM2.5 的量存储在 predictions 列表中最后一个项目中,并返回给调用函数
    def forward(self, input_seq):
        lstm_out, self.hidden_cell = self.lstm(input_seq.view(len(input_seq), 1, -1), self.hidden_cell)
        # print(lstm_out.shape)
        predictions = self.linear(lstm_out.view(len(input_seq), -1))
        return predictions[-1]
 
# 创建 LSTM() 类对象、定义损失函数和优化器
# 损失函数:交叉熵损失
# 优化器:Adam
model = LSTM()
loss_function = nn.MSELoss()
optimizer = torch.optim.Adam(model.parameters(), lr=0.001)
# print(model)
 
# 模型训练
epochs = 1
 
for i in range(epochs):
    for seq, labels in train_input_seq:
        optimizer.zero_grad()
        # 初始化LSTM模型的隐藏状态和细胞状态
        model.hidden_cell = (torch.zeros(1, 1, model.hidden_layer_size),
                             torch.zeros(1, 1, model.hidden_layer_size))
 
        y_pred = model(seq)
 
        single_loss = loss_function(y_pred, labels)
        single_loss.backward()
        optimizer.step()
 
    # {i:3} 是一个占位符,它表示要在这个位置插入一个整数 i,并且将其格式化为占据3个字符的宽度
    # 这意味着无论 i 是多少,都会占据3个字符的位置,不足的部分用空格填充
    # {single_loss.item():10.8f} 是另一个占位符,它表示要在这个位置插入一个浮点数 single_loss.item(),并将其格式化为占据10个字符的宽度
    # 其中包括小数点和8位小数,这会以固定的宽度显示损失值
    print(f'epoch: {i:3} loss: {single_loss.item():10.10f}')
 
# 模型泛化
test_input_seq = create_inout_sequences(test_data_normalized, train_window)
predictions = []
for seq, labels in test_input_seq:
    with torch.no_grad():
        model.hidden = (torch.zeros(1, 1, model.hidden_layer_size),
                        torch.zeros(1, 1, model.hidden_layer_size))
        prediction = model(seq)
        predictions.append(scaler.inverse_transform(np.array(prediction).reshape(-1, 1)))
 
print(len(predictions), type(predictions))
print(len(test_data[train_window:]), type(test_data[train_window:]))
print("------------------------------------------------------")
 
# 创建x轴的值(可以是范围或自定义值)
x_values = np.arange(len(predictions))
 
# 匹配 prediction 与 test_data[train_window:] 的维度
predictions = np.array(predictions)
print(predictions.shape)
print(test_data[train_window:].shape)
print("------------------------------------------------------")
print(predictions.reshape(-1))
print(test_data[train_window:])
 
# 绘制预测值的图形
plt.plot(x_values, predictions.reshape(-1), label='Forecast values', linestyle='-', color='red', marker='')
 
# 绘制真实值的图形
plt.plot(x_values, test_data[train_window:], label='True Values', linestyle='-', color='blue', marker='')
 
# 添加图例
plt.legend()
 
# 设置图形标题和轴标签
plt.title('True vs. predicted values')
plt.xlabel('Time')
plt.ylabel('PM2.5')
 
# 显示图形
plt.show()

原始数据图像:

测试集预测数据图像:(受限于设备性能,epoch次数很少,导致测试结果很差)

总结

这周学习了RNN以及LSTM,不同于以往CNN等结构,RNN在全连接网络上加上了记忆功能,基础的神经网络只是在层与层之间建立了权值连接,而RNN在层之间的神经元之间也建立了权值连接,它能够处理序列变化的数据。而LSTM又在RNN的基础上加上了记忆定义的概念,在RNN中只会针对比较短的序列进行操作,而比较长的序列一般使用LSTM,LSTM适合处理序列中间间隔和延迟相对较长的问题,解决在长序列训练过程中梯度消失的问题,例如聊天机器人、语音识别等。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/240093.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【K8S 系列】认识k8s、k8s架构

一、什么是k8s? Kubernetes 简称 k8s,是支持云原生部署的一个平台,k8s 本质上就是用来简化微服务的开发和部署的,用于自动化部署、扩展和管理容器化应用的开源容器编排技术。对于传统的docker其实也提供了容器编排的技术docker-compose&…

Rust语言GUI库之gtk安装

文章目录 工具链安装管理软件vcpkgvcpkg介绍安装vcpkg 安装gtk遇到的问题Rust其他依赖package-confg 工具链安装管理软件vcpkg vcpkg介绍 在使用C/C编写项目时, 引用第三方库是很麻烦的事, 需要手动下载源码然后编译最后再添加到项目里,配置头文件、lib、dll&…

PyTorch: 基于【MobileNet V2】处理MNIST数据集的图像分类任务【准确率99%+】

目录 引言1. 安装PyTorch2. 下载并加载MNIST数据集3. 搭建基于MobileNet V2的图像分类模型运行结果(重点看网络开头和结束位置即可) 4. 设置超参数、损失函数、优化器5. 训练模型6. 测试模型运行结果 完整代码结束语 引言 在深度学习和计算机视觉的世界…

Windows使用selenium操作浏览器爬虫

以前的大部分程序都是操作Chrome,很少有操作Edge,现在以Edge为例。 Selenium本身是无法直接控制浏览器的,不同的浏览器需要不同的驱动程序,Google Chrome需要安装ChromeDriver、Edge需要安装Microsoft Edge WebDriver&#xff0c…

【PostgreSQL】从零开始:(一)初识PostgreSQL

从零开始:(一)初识PostgreSQL PostgreSQL数据库介绍为什么使用 PostgreSQL?那么多最终用户,云厂商为什么要贡献核心代码?基于PostgreSQL底层开发的好处:为什么要学习PostgreSQL?截止本文发布之日&#xff0…

Web安全之XXE漏洞原理及实践学习

一、原理: XXE漏洞全称即XML外部实体注入漏洞。 攻击者强制XML解析器去访问攻击者指定的资源内容(可能是系统上本地文件亦或是远程系统上的文件),导致可加载恶意外部文件,利用file协议造成文件读取、命令执行、内网端口扫描、攻击内网网站等…

【图论-匈牙利算法】Hungary Algorithm完整代码(一) 之 matlab实现

学习参考链接 博客 分配问题与匈牙利算法 带你入门多目标跟踪(三)匈牙利算法&KM算法 视频 运筹学 | 例题详解指派问题 前言 图论-匈牙利算法原理参见上述参考连接中的博客与BiliBili博主的学习视屏,讲的很好很透彻。强烈建议看完&#…

自定义日志打印功能--C++

一、介绍 日志是计算机程序中用于记录运行时事件和状态的重要工具。通过记录关键信息和错误情况,日志可以帮助程序开发人员和维护人员追踪程序的执行过程,排查问题和改进性能。 在软件开发中,日志通常记录如下类型的信息: 事件信…

关于碰撞试验

主要参数: 冲击与碰撞试验的主要参数及调整方法 - 百度文库 碰撞试验的技术指标包括:峰值加速度、脉冲持续时间、速度变化量(半正弦波)、每方向碰撞次数。 加速度:冲击的强度,单位为g;一般为3…

Zygote 进程启动过程

首语 在Android系统中,DVM(Dalvik虚拟机)和ART、应用程序进程以及运行系统的关键服务的SystemServer进程都是由Zygote进程创建的,也可以将其称之为孵化器,它通过fork(复制进程)的形式来创建应用程序进程和SystemServer进程。 Zygote进程是在…

记录一次chatGPT人机协同实战辅助科研——根据词库自动进行情感分析

有一个Excel中的一列,读取文本判断文本包含积极情感词.txt和消极情感词.txt的个数,分别生成两列统计数据 请将 ‘your_file.xlsx’ 替换为你的Excel文件名,Your Text Column’替换为包含文本的列名。 这个程序首先读取了积极和消极情感词&…

(第68天)DBCA 克隆 PDB

介绍 在前面课程我们讲过使用 DBCA 创建数据库以及搭建 DataGuard 等功能,在多租户这章节,要讲下如何使用 DBCA 克隆 PDB。 18C 开始支持使用 DBCA 在本地 CDB 中克隆 PDB19C 升级支持使用 DBCA 克隆 PDB 到远端 CDB 中19C 升级支持使用 DBCA 重定向迁移 PDB 到远端 CDB 中本…

2023/12/12作业

思维导图 作业: 成果图 代码 #include "widget.h" #include "ui_widget.h" Widget::Widget(QWidget *parent) : QWidget(parent) , ui(new Ui::Widget) { speechernew QTextToSpeech(this); ui->setupUi(this); //一直获取当前时间 idst…

海思越影系列3516DV500/3519DV500/3519AV200/SD3403平台的AI一体化工业相机设计思路

随着工业自动化的发展,生产线对机器视觉的数量要求越来越多,由于数量的增加,视觉系统占的空间也越来越大,给生产线的布局带来困扰。 另一方面随着视觉SOC的发展,越来越多的视觉SOC都逐渐带有一定的算力,一体…

AI全栈大模型工程师(二十八)如何做好算法备案

互联网信息服务算法 什么情况下要备案? 对于B2B业务,不需要备案。 但在B2C领域,一切要视具体情况而定。 如果我们自主训练大型模型,这是必要的。 但如果是基于第三方模型提供的服务,建议选择那些已获得备案并且具有较大…

DevOps - Spug 自动化运维平台

关于Spug 官网:https://spug.cc/ Spug:麻雀,麻雀虽小,五脏俱全。 Spug是面向中小型企业设计的轻量级无Agent的自动化运维平台,整合了主机管理、主机批量执行、主机在线终端、文件在线上传下载、应用发布部署、在线任…

[Angular] 笔记1:开发设置 , 双向绑定

1 设置开发环境 1.1 安装 node 下载 node,因为要使用 npm 工具,教程中使用 Angualr 14, 最新版 node 20 用不了,安装 node 16 就可以。 1.2 安装 Angular CLI Angular CLI 是用于创建 Angular 工程的工具集,使用如下命令&…

redis的深度理解

上篇博客我们说到了redis的基本概念和基本操作,本篇我们就更深入去了解一些redis的操作和概念,我们就从red的主从同步、redis哨兵模式和redis集群三个方面来了解redis数据库 一、主从同步 像MySQL一样,redis是支持主从同步的,而…

面试 JVM 八股文五问五答第二期

面试 JVM 八股文五问五答第二期 作者:程序员小白条,个人博客 相信看了本文后,对你的面试是有一定帮助的! ⭐点赞⭐收藏⭐不迷路!⭐ 1.JVM运行时数据区有几部分?(JVM内存布局)虚拟机栈和本地方…

nodejs微信小程序+python+PHP社区居民信息管理及数据分析系统-计算机毕业设计推荐django

目 录 摘 要 I ABSTRACT II 目 录 II 第1章 绪论 1 1.1背景及意义 1 1.2 国内外研究概况 1 1.3 研究的内容 1 第2章 相关技术 3 2.1 nodejs简介 4 2.2 express框架介绍 6 2.4 MySQL数据库 4 第3章 系统分析 5 3.1 需求分析 5 3.2 系统可行性分析 5 3.2.1技术可行性:…