2024/10/27周报

文章目录

  • 摘要
  • Abstract
  • 深度学习
    • 预测进出水水质
      • 使用UCI机器学习库中的水处理数据集
      • 代码描述
      • 具体代码示例
      • 实验结果
    • 智能比对示例
      • 数据示例
      • 比对步骤
      • Python 代码示例
      • 结果解读
      • 应用场景
  • 总结
    • 改进建议

摘要

本周对南宁伶俐工业园区污水处理厂进行调研,了解了该污水处理厂的详细工艺。又基于UCI水处理数据集,使用深度学习方法构建了预测模型,对水处理单元的进出水水质进行预测分析。数据预处理包括数据清洗、PCA降维、滑动窗口数据增强等,以提升模型的计算效率和准确性。模型采用卷积神经网络(CNN)、长短期记忆网络(LSTM)及注意力机制结合的CLATT模型,通过多层卷积、LSTM层、多头注意力机制及残差块提取特征,并用全连接层输出水质预测值。训练过程中,使用均方误差作为损失函数,并设置学习率调度器及早停机制以优化模型性能。测试集评估表明模型预测效果良好。此外,还比对分析通过PCA和随机森林,识别出污水处理单元的关键特征差异,为不同单元的性能优化提供了科学依据,支持对低效单元进行调整,提升整体水处理效率。

Abstract

This week, I conducted research on the sewage treatment plant in Nanning Lingli Industrial Park and learned about its detailed process. Based on the UCI water treatment dataset, a prediction model was constructed using deep learning methods to predict and analyze the inlet and outlet water quality of water treatment units. Data preprocessing includes data cleaning, PCA dimensionality reduction, sliding window data augmentation, etc., to improve the computational efficiency and accuracy of the model. The model adopts a CLATT model that combines convolutional neural network (CNN), long short-term memory network (LSTM), and attention mechanism. It extracts features through multi-layer convolution, LSTM layers, multi head attention mechanism, and residual blocks, and outputs water quality prediction values through fully connected layers. During the training process, mean square error is used as the loss function, and a learning rate scheduler and early stopping mechanism are set up to optimize model performance. The evaluation of the test set shows that the model has good predictive performance. In addition, comparative analysis was conducted using PCA and random forest to identify key feature differences in sewage treatment units, providing a scientific basis for optimizing the performance of different units and supporting adjustments to inefficient units to improve overall water treatment efficiency.

深度学习

预测进出水水质

使用UCI机器学习库中的水处理数据集

以下代码主要实现了对水处理数据集的处理、模型构建、训练和评估。
数据集描述如下:

• 数据来源:UCI机器学习库中的水处理数据集。
• 数据结构:包含39个特征,记录了水处理过程中的多个测量值,如pH值、溶解氧量、悬浮物浓度等。

代码描述

  1. 导入库
    • 使用了 pandas 和 numpy 进行数据处理。
    • 使用 torch 和 torch.nn 进行深度学习模型的构建。
    • 使用 StandardScaler 标准化数据, train_test_split 划分数据集, PCA 进行降维。
    • matplotlib 用于可视化。
  2. 设置随机数种子
    为了确保实验的可重复性,使用 random.seed、np.random.seed 和 torch.manual_seed 设置随机数种子。
  3. 数据加载和预处理
    • 数据加载:从 UCI 网站下载水处理数据集。该数据集包含水处理过程中的39个变量。
    • 数据清洗:将 “?” 替换为 NaN,并用均值填补缺失值。转换数据类型为浮点数以便处理。
    • 降维:使用PCA将39维的输入特征降到15维,以减少模型的计算量。
    • 特征选择:选择进水和出水相关的特征进行预测。这里 in_features 为降维后的特征,out_features 选择了一些出水的指标(‘PH-S’、‘DBO-S’、‘DQO-S’、‘SS-S’)。
    • 标准化:对输入和输出特征使用 StandardScaler 进行标准化。
  4. 数据增强
    • 使用滑动窗口方法对数据进行增强,将时间序列特征封装成序列。create_sequences 函数生成时间步数为 time_steps=6 的序列,用于捕捉时间相关的特征。
  5. 数据集划分与转换
    • 将生成的序列划分为训练集和测试集,并转换为 PyTorch 张量格式,以供后续模型训练和评估使用。
  6. 模型构建
    创建了一个名为 CLATT 的神经网络模型,包含卷积层、LSTM、注意力机制、残差连接等模块。以下是模型结构:
    • 卷积层:两层卷积层提取输入特征的局部信息。
    • LSTM层:用于捕捉序列特征。
    • 多头注意力机制:MultiHeadAttention 层由多头注意力机制组成,每个 AttentionLayer 计算注意力权重,提取重要特征。
    • 残差块:ResidualBlock 在注意力机制后增加了残差连接,增强了模型的稳定性。
    • 全连接层:将最终特征映射到4个目标特征。
  7. 模型训练
    使用均方误差(MSE)作为损失函数。train_model 函数实现了模型训练,包括:
    • 梯度更新:使用Adam优化器更新模型参数。
    • 学习率调度器:每50个epoch减少学习率,以更好地收敛。
    • 早停机制:如果模型在若干epoch内未改进,早停以避免过拟合。
  8. 模型评估
    evaluate_model 函数在测试集上评估模型表现,并输出测试损失。
  9. 可视化预测结果
    最后部分绘制预测值与实际值对比的折线图(针对 PH-S),直观展示模型预测的效果。

具体代码示例

import pandas as pd
import numpy as np
import torch
import torch.nn as nn
import torch.optim as optim
import random
from sklearn.preprocessing import StandardScaler
from sklearn.model_selection import train_test_split
from sklearn.decomposition import PCA
import matplotlib.pyplot as plt

# 设置随机数种子
seed = 42
random.seed(seed)
np.random.seed(seed)
torch.manual_seed(seed)
torch.cuda.manual_seed_all(seed)

# 1. 下载并加载数据
url = 'https://archive.ics.uci.edu/ml/machine-learning-databases/water-treatment/water-treatment.data'
data = pd.read_csv(url, header=None, sep=',')

# 更新列名以匹配数据集中的39列
data.columns = ['Date', 'Q-E', 'ZN-E', 'PH-E', 'DBO-E', 'DQO-E', 'SS-E', 'SSV-E', 'SED-E', 'COND-E',
                'PH-P', 'DBO-P', 'SS-P', 'SSV-P', 'SED-P', 'COND-P',
                'PH-D', 'DBO-D', 'DQO-D', 'SS-D', 'SSV-D', 'SED-D', 'COND-D',
                'PH-S', 'DBO-S', 'DQO-S', 'SS-S', 'SSV-S', 'SED-S', 'COND-S',
                'RD-DBO-P', 'RD-SS-P', 'RD-SED-P', 'RD-DBO-S', 'RD-DQO-S',
                'RD-DBO-G', 'RD-DQO-G', 'RD-SS-G', 'RD-SED-G']

# 删除日期列
data = data.drop('Date', axis=1)

# 将 "?" 替换为 NaN
data = data.replace('?', np.nan)

# 将数据类型转换为浮点数
data = data.astype(float)

# 填补缺失值(使用均值填补)
data = data.fillna(data.mean())

# 特征工程:使用PCA降维
pca = PCA(n_components=15)
data_pca = pca.fit_transform(data)

# 选择进水特征和出水特征
in_features = data_pca
out_features = data[['PH-S', 'DBO-S', 'DQO-S', 'SS-S']].values

# 数据标准化
scaler_in = StandardScaler()
scaler_out = StandardScaler()

X = scaler_in.fit_transform(in_features)
y = scaler_out.fit_transform(out_features)

# 数据增强:滑动窗口方法
def create_sequences(X, y, time_steps=6, step=1):
    Xs, ys = [], []
    for i in range(0, len(X) - time_steps, step):
        Xs.append(X[i:i + time_steps])
        ys.append(y[i + time_steps])
    return np.array(Xs), np.array(ys)

time_steps = 6
X_seq, y_seq = create_sequences(X, y, time_steps, step=1)

# 拆分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X_seq, y_seq, test_size=0.2, random_state=seed)

# 转换为PyTorch张量
X_train = torch.tensor(X_train, dtype=torch.float32)
y_train = torch.tensor(y_train, dtype=torch.float32)
X_test = torch.tensor(X_test, dtype=torch.float32)
y_test = torch.tensor(y_test, dtype=torch.float32)

# 2. 模型构建
class CLATT(nn.Module):
    def __init__(self, time_steps, in_features, hidden_dim=256, out_features=4, num_heads=4, num_layers=3):
        super(CLATT, self).__init__()
        self.conv1 = nn.Conv1d(in_features, 64, kernel_size=3, padding=1)
        self.conv2 = nn.Conv1d(64, 64, kernel_size=3, padding=1)
        self.batch_norm = nn.BatchNorm1d(64)
        self.flatten = nn.Flatten()
        self.lstm = nn.LSTM(64 * time_steps, hidden_dim, num_layers=num_layers, batch_first=True, bidirectional=True)
        self.layer_norm1 = nn.LayerNorm(hidden_dim * 2)
        self.multi_head_attention = MultiHeadAttention(hidden_dim * 2, num_heads)
        self.layer_norm2 = nn.LayerNorm(hidden_dim * 2 * num_heads)
        self.residual_block = ResidualBlock(hidden_dim * 2 * num_heads, hidden_dim * 2)
        self.dropout = nn.Dropout(p=0.5)
        self.fc = nn.Linear(hidden_dim * 2 * num_heads, out_features)

    def forward(self, x):
        x = x.transpose(1, 2)
        x = torch.relu(self.conv1(x))
        x = torch.relu(self.conv2(x))
        x = self.batch_norm(x)
        x = self.flatten(x)
        x = x.unsqueeze(1)
        lstm_out, _ = self.lstm(x)
        lstm_out = self.layer_norm1(lstm_out)
        attention_out = self.multi_head_attention(lstm_out)
        attention_out = self.layer_norm2(attention_out)
        attention_out = self.residual_block(attention_out)
        attention_out = self.dropout(attention_out)
        out = self.fc(attention_out)
        return out

class MultiHeadAttention(nn.Module):
    def __init__(self, input_dim, num_heads):
        super(MultiHeadAttention, self).__init__()
        self.num_heads = num_heads
        self.attention_heads = nn.ModuleList([AttentionLayer(input_dim) for _ in range(num_heads)])

    def forward(self, inputs):
        attention_outputs = [head(inputs) for head in self.attention_heads]
        concat_attention = torch.cat(attention_outputs, dim=1)
        return concat_attention

class AttentionLayer(nn.Module):
    def __init__(self, input_dim):
        super(AttentionLayer, self).__init__()
        self.attn_weights = nn.Linear(input_dim, input_dim)

    def forward(self, inputs):
        scores = torch.tanh(self.attn_weights(inputs))
        attn_weights = torch.softmax(scores, dim=1)
        context_vector = torch.sum(attn_weights * inputs, dim=1)
        return context_vector

class ResidualBlock(nn.Module):
    def __init__(self, input_dim, hidden_dim):
        super(ResidualBlock, self).__init__()
        self.fc1 = nn.Linear(input_dim, hidden_dim)
        self.fc2 = nn.Linear(hidden_dim, input_dim)

    def forward(self, x):
        residual = x
        out = torch.relu(self.fc1(x))
        out = self.fc2(out)
        out += residual
        return torch.relu(out)

# 创建模型
model = CLATT(time_steps, in_features.shape[1], hidden_dim=256, out_features=4, num_heads=4, num_layers=3)
print(model)

# 3. 模型训练,加入学习率调度器和权重衰减
criterion = nn.MSELoss()
optimizer = optim.Adam(model.parameters(), lr=0.001, weight_decay=1e-5)
scheduler = optim.lr_scheduler.StepLR(optimizer, step_size=50, gamma=0.5)

def train_model(model, X_train, y_train, n_epochs=200, batch_size=64, patience=10):
    model.train()
    best_loss = float('inf')
    patience_counter = 0

    for epoch in range(n_epochs):
        for i in range(0, len(X_train), batch_size):
            X_batch = X_train[i:i + batch_size]
            y_batch = y_train[i:i + batch_size]
            y_pred = model(X_batch)
            loss = criterion(y_pred, y_batch)
            optimizer.zero_grad()
            loss.backward()
            optimizer.step()

        scheduler.step()  # 更新学习率
        if loss.item() < best_loss:
            best_loss = loss.item()
            patience_counter = 0
        else:
            patience_counter += 1

        if patience_counter >= patience:
            print(f"Early stopping at epoch {epoch + 1}")
            break

        if (epoch + 1) % 10 == 0:
            print(f'Epoch {epoch + 1}/{n_epochs}, Loss: {loss.item():.4f}')
            
train_model(model, X_train, y_train)

# 4. 模型评估
def evaluate_model(model, X_test, y_test):
    model.eval()
    with torch.no_grad():
        y_pred = model(X_test)
        loss = criterion(y_pred, y_test)
        print(f'Test Loss: {loss.item():.4f}')
    return y_pred


y_pred = evaluate_model(model, X_test, y_test)

# 反标准化结果
y_test_inv = scaler_out.inverse_transform(y_test.numpy())
y_pred_inv = scaler_out.inverse_transform(y_pred.numpy())

# 结果可视化
plt.figure(figsize=(10, 6))
plt.plot(y_test_inv[:100, 0], label='实际值 (PH-S)')
plt.plot(y_pred_inv[:100, 0], label='预测值 (PH-S)')
plt.legend()
plt.show()

实验结果

在这里插入图片描述

智能比对示例

为了更直观地理解污水处理单元的比对过程,下面提供一个完整的示例,假设我们有四个处理单元的数据集,数据指标包括化学需氧量(COD)去除效率、总氮(TN)去除效率、总磷(TP)去除效率、处理流量和pH值。我们将通过主成分分析(PCA)降维,并使用随机森林模型进行单元间的比对分析。

数据示例

假设我们有以下污水处理单元数据(单位:处理效率以百分比表示,流量以m³/h表示,pH值为无量纲):
在这里插入图片描述

比对步骤

  1. 数据预处理
    标准化:为消除不同指标间的量纲差异,先对数据进行标准化处理,将各指标缩放至相同的范围(例如0到1之间)。
  2. 主成分分析(PCA)
    降维:使用PCA将五个特征降维到两个主要成分,以减少数据复杂度并突出关键影响因素。
    解释性:通过PCA,我们可以得到各主成分对原始指标的解释度。假设我们发现降维后的两个主成分分别解释了70%和20%的数据变异,总共解释了90%,说明大部分信息被保留。
  3. 使用随机森林进行比对
    特征重要性分析:在随机森林模型中,通过分析每个特征在模型中的重要性,识别出影响不同单元效率差异的关键因素。假设结果显示,COD去除效率和TN去除效率对单元性能差异影响最大。
    比对分析:基于随机森林的分类结果,我们可以得到各单元的性能评分或分类,例如识别“高效单元”和“低效单元”。
  4. 结果解读与应用
    结果解读:通过PCA和随机森林分析,我们得出单元C的处理效率最高,而单元B和D相对较低。此结论可以引导进一步的操作,例如为单元B和D提供优化建议。

优化方案:基于比对结果,可以针对COD和TN去除效率较低的单元(如单元B和D)提出改进措施,例如增加曝气量或调整药剂投加量。

Python 代码示例

以下是一个基于上述流程的Python代码实现。

import pandas as pd
from sklearn.preprocessing import StandardScaler
from sklearn.decomposition import PCA
from sklearn.ensemble import RandomForestClassifier
import numpy as np

# 数据准备
data = {
    'Unit': ['A', 'B', 'C', 'D'],
    'COD Efficiency': [85, 80, 90, 78],
    'TN Efficiency': [70, 65, 80, 75],
    'TP Efficiency': [65, 75, 70, 68],
    'Flow Rate': [120, 150, 100, 110],
    'pH': [7.0, 6.8, 7.2, 7.1]
}

df = pd.DataFrame(data)
features = df.drop(columns=['Unit'])

# 标准化数据
scaler = StandardScaler()
scaled_features = scaler.fit_transform(features)

# PCA降维
pca = PCA(n_components=2)
principal_components = pca.fit_transform(scaled_features)
pca_df = pd.DataFrame(data=principal_components, columns=['PC1', 'PC2'])
pca_df['Unit'] = df['Unit']

# 假设高效单元标签
labels = np.array([1 if unit in ['C'] else 0 for unit in df['Unit']])

# 随机森林比对模型
rf = RandomForestClassifier()
rf.fit(scaled_features, labels)
importances = rf.feature_importances_

# 输出特征重要性
for feature, importance in zip(features.columns, importances):
    print(f"Feature: {feature}, Importance: {importance:.4f}")

# 输出PCA后的数据
print("\nPCA Result:\n", pca_df)

结果解读

在这里插入图片描述

特征重要性:代码输出会显示每个指标的特征重要性。例如,COD去除效率和TN去除效率可能会被认为对比对结果影响最大。
PCA结果:PCA降维后的结果可以在二维平面中可视化展示,显示各单元之间的相似性或差异性。

应用场景

根据比对结果,可以对比单元的相对效率并生成优化方案。例如,针对COD和TN效率较低的单元B和D,可以制定改进计划以提升这些指标。这种分析为后续的智能化优化和管理提供了数据支持。

总结

在上述污水处理水质预测和单元比对分析工作中,已有的成果为污水处理过程的优化和智能管理提供了重要基础,但还有一些方面可以进一步总结和改进,以提升模型的表现和应用价值。
数据处理全面且充分:通过数据清洗、标准化、降维等一系列预处理步骤,确保了模型的输入数据质量,并通过滑动窗口法增强时间序列特征。
模型架构融合多种技术:模型结构包括卷积层、LSTM层和多头注意力机制,通过深度特征提取有效捕捉了水质变化的时空特征,增强了模型的预测能力。
多模型联合比对分析:PCA与随机森林结合,识别了关键影响指标,为处理单元的性能优化提供了依据,有助于明确处理薄弱环节并制定针对性的改进方案。

改进建议

数据集扩展与细化:目前使用的UCI水处理数据集可能未完全覆盖实际污水处理中的复杂情况。可以引入更多现场数据(如不同季节、不同污染源的水质数据)进行模型训练,以提升模型的适用性。

1.模型参数优化与自动化调整:
通过自动化调参方法(如贝叶斯优化、网格搜索等),寻找最优的模型参数组合,从而提升模型性能。
引入自适应学习率优化器(如AdaBelief、Ranger)代替Adam优化器,提升模型的收敛速度与稳定性。

2.模型结构的改进:
在模型中加入图神经网络(GNN),模拟水质指标间的相互关系,有助于捕捉污染物的传播和扩散特征,尤其适用于流域或多水体的分析。
使用Transformer架构替代LSTM来处理时间序列特征,有望提升长时间序列数据的建模能力和性能。
引入实时数据处理:实现实时数据接入与模型预测,使系统能够在处理单元出现异常时快速响应,建议采用流处理技术(如Apache Kafka、Spark Streaming)对数据进行动态监控。

3.增加模型解释性:为了便于实际应用中的决策,可以引入SHAP值(SHapley Additive exPlanations)等解释性方法,使得每个预测结果可以追溯到关键指标的贡献程度,从而增强模型的透明性。

4.强化性能评估与验证:
增加模型评估指标,如R²、平均绝对误差(MAE)等,以提供更全面的模型评估。
通过交叉验证、留一验证等多种验证方法,确保模型的泛化性能,避免在特定数据集上的过拟合。

这些改进措施将进一步增强模型的预测准确性、稳定性及适用性,使得系统能够更好地应对实际应用中的复杂场景,为污水处理的智能化管理提供更强大的技术支持。

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

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

相关文章

H5实现PDF文件预览,使用pdf.js-dist进行加载

H5实现PDF文件预览&#xff0c;使用pdf.js-dist进行加载 一、应用场景 在H5平台上预览PDF文件是在原本已经开发完成的系统中新提出的需求&#xff0c;原来的系统业务部门是在PC端进行PDF的预览与展示&#xff0c;但是现在设备进行了切换&#xff0c;改成了安卓一体机进行文件…

记一次真实项目的性能问题诊断、优化(阿里云redis分片带宽限制问题)过程

前段时间&#xff0c;接到某项目的压测需求。项目所有服务及中间件&#xff08;redis、kafka&#xff09;、pg库全部使用的阿里云。 压测工具&#xff1a;jmeter(分布式部署)&#xff0c;3组负载机&#xff08;每组1台主控、10台linux 负载机&#xff09; 问题现象&#xff1…

基于SSM的网上购物系统的设计与实现

技术介绍 本系统运用了JSP技术、SSM框架、B/S架构和myspl数据库 MySQL 介绍 MySQL是一种关系型的数据库管理系统&#xff0c;属于Oracle旗下的产品。MySQL的语言是非结构化的&#xff0c;使用的用户可以在数据上进行工作。这个数据库管理系统一经问世就受到了社会的广泛关注…

神仙公司名单(成都)

神仙公司&#xff08;成都&#xff09; 神仙公司&#xff0c;继续。 最近对古城很感兴趣&#xff0c;加上前两周吃的串串还记忆犹新&#xff0c;这期写一下四川省省会&#xff1a;成都。 在互联网人眼中&#xff0c;成都似乎是一个存在感很低的城市&#xff0c;但实际上成都一直…

【电机控制】相电流重构——单电阻采样方案

【电机控制】相电流重构——单电阻采样方案 文章目录 [TOC](文章目录) 前言一、基于单电阻采样电流重构技术原理分析1.1 单电阻采样原理图1.2 基本电压矢量与电流采样关系 二、非观测区2.1 扇区过渡区2.2 低压调制区 三、非观测区补偿——移相法四、参考文献总结 前言 使用工具…

C语言实现栈和队列

代码已经上传我的资源&#xff0c;需要可自取 1.栈 1.1栈的概念及结构 栈&#xff1a;一种特殊的线性表&#xff0c;其只允许在固定的一端进行插入和删除元素操作。 进行数据插入和删除操作的一端 称为栈顶&#xff0c;另一端称为栈底。栈中的数据元素遵守后进先出LIFO&…

Python实现贝叶斯优化器(Bayes_opt)优化简单循环神经网络分类模型(SimpleRNN分类算法)项目实战

说明&#xff1a;这是一个机器学习实战项目&#xff08;附带数据代码文档视频讲解&#xff09;&#xff0c;如需数据代码文档视频讲解可以直接到文章最后关注获取。 1.项目背景 贝叶斯优化器 (BayesianOptimization) 是一种黑盒子优化器&#xff0c;用来寻找最优参数。 贝叶斯…

Linux资源与网络请求

参数说明&#xff1a; d : 改变显示的更新速度&#xff0c;或是在交谈式指令列( interactive command)按 sq : 没有任何延迟的显示速度&#xff0c;如果使用者是有 superuser 的权限&#xff0c;则 top 将会以最高的优先序执行c : 切换显示模式&#xff0c;共有两种模式&#…

软件测试岗位,职业前景到底怎样?

最近经常被问到软件测试这个行业的前景&#xff0c;网上也有大量唱衰测试这个行业的声音&#xff0c;很多选择职业方向的同学对是否要进入这个职业也非常迷茫。 所以开一贴来聊一聊秋草对软件测试这个岗位的要求以及对其前景的看法。 软件测试到底是个什么样的岗位&#xff1…

如何学习cuda编程?

第一本cuda教材: CUDA By Example​ developer.nvidia.com/cuda-example 配套网课&#xff1a; Udacity CS344: Intro to Parallel Programming​ developer.nvidia.com/udacity-cs344-intro-parallel-programming 记得做网课作业。 然后就靠项目上手了。 我当时实习时候的项…

ProTable样式缺失

在使用Ant Design Pro开发页面时&#xff0c;想要引用ProComponents组件中的ProTable表格&#xff0c;引入官方文档的案例发现缺少样式 官方文档地址ProTable - 高级表格 - ProComponents (ant.design) 引入的是第一个Demos 样式预览&#xff1a; 代码 import { EllipsisO…

今天不分享技术,分享秋天的故事

引言 这个爱情故事好像是个悲剧&#xff0c;你说的是婚姻。爱情没有悲剧&#xff0c;对爱者而言&#xff0c;爱情怎么会是悲剧呢。对春天而言&#xff0c;秋天是它的悲剧吗。结尾是什么&#xff0c;等待&#xff0c;之后呢&#xff0c;没有之后。或者说&#xff0c;等待的结果…

Spring Cloud微服务

Spring Cloud 是一个专注于微服务架构的一站式解决方案&#xff0c;它通过整合多个优秀的开源框架和工具&#xff0c;为开发者提供了构建、管理和维护微服务系统所需的全方位支持。以下是关于 Spring Cloud 微服务的详细介绍&#xff1a; 基本概念 微服务架构&#xff1a;微服务…

图像处理算法的形式

一 基本功能形式 按图像处理的输出形式&#xff0c;图像处理的基本功能可分为三种形式。 1&#xff09;单幅图像 -------->单幅图像 2&#xff09;多幅图像-------->单幅图像 3&#xff09;单(或多)幅图像------->数字或符号符 二 几种具体算法形式 1.局部处理 …

搭建 mongodb 副本集,很详细

搭建 mongodb 副本集&#xff0c;很详细 一、前言二、创建用户1、创建 root 用户2、创建测试用户3、修改用户密码 三、修改配置文件&#xff08;主节点&#xff09;1、开启登录认证2、加上副本集3、最终配置文件 四、副本节点1、创建副本节点目录2、编辑配置文件3、启动副本节点…

力扣283-- 移动零

开始做梦的地方 力扣283 &#xff1a; 给定一个数组 nums&#xff0c;编写一个函数将所有 0 移动到数组的末尾&#xff0c;同时保持非零元素的相对顺序。请注意 &#xff0c;必须在不复制数组的情况下原地对数组进行操作。 何解&#xff1f; 1&#xff0c;暴力枚举&#xff1a…

JS面试八股文(一)

&#x1f60a;JS面试八股文&#xff08;一&#xff09; 1.JS由哪三部分组成&#xff1f;2.JS有哪些内置对象&#xff1f;3.操作数组的方法有哪些&#xff1f;4.JS对数据类型的检测方式有哪些&#xff1f;5.说一下闭包&#xff0c;闭包有什么特点&#xff1f;6.前端的内存泄漏怎…

adb常见指令以及问题解决

1.屏幕截图 问题&#xff1a; /system/bin/sh: pull: not found 最后是一个美元符号$&#xff0c;则表示不是以root身份运行&#xff1b; 最后是一个井号#&#xff0c;则表示是以root身份运行。 解决方案&#xff1a; 直接退出&#xff0c;在PC端使用adb pull&#xff0c;而…

Spring Boot实现的动态化酒店住宿管理系统

1系统概述 1.1 研究背景 随着计算机技术的发展以及计算机网络的逐渐普及&#xff0c;互联网成为人们查找信息的重要场所&#xff0c;二十一世纪是信息的时代&#xff0c;所以信息的管理显得特别重要。因此&#xff0c;使用计算机来管理酒店客房管理系统的相关信息成为必然。开发…

软件设计师考试大纲整理

为了防止出题者不按常理出牌&#xff0c;此文档为根据上午题大纲自行整理的扩展知识&#xff0c;并非考试常考题 此文档为根据上午题大纲自行整理的扩展知识&#xff0c;并非考试常考题 此文档为根据上午题大纲自行整理的扩展知识&#xff0c;并非考试常考题 闲暇时间了解知…