从Python小白到人工智能大佬的无限进步,持续更新。科研日记进步。

Python环境

1.下载和安装:

python的官方网站:https://www.python.org/

2.使用库的代码(安装,升级,下载)

·1.安装库,常使用 pip 指令 (查看,安装)

# 查看 pip 版本
pip -V      # 或 pip --version

# 查看已经安装的库
pip list

# 在线安装库,pip 会自动安装库的依赖
pip install xxx     # xxx 为要安装的库

2. 升级库,(显示和升级)

pip list --outdate          # 显示可升级库
pip install --upgrade xxx   # 升级库

3. 删除库

pip uninstall <package-name>

 安装虚拟环境Anaconda

1.看B站视频。

http://【保姆级Anaconda安装教程】 https://www.bilibili.com/video/BV1ns4y1T7AP/?share_source=copy_web&vd_source=fedb10d2d09f5750366f83c1e0d4a759 2.安装Pycharm。

http://【Anaconda安装+PyCharm安装和基本使用,Python编程环境安装】 https://www.bilibili.com/video/BV1Vu411Y7gL/?share_source=copy_web&vd_source=fedb10d2d09f5750366f83c1e0d4a759

 Python数据类型

1.Python 变量

命名约定:

  1. 小写字母:变量名通常使用小写字母,单词之间可以用下划线分隔,这种风格称为“snake_case”。

  2. 避免使用 Python 关键字:不要使用 Python 的保留字作为变量名,例如 ifforwhile 等。

  3. 避免使用数字开头:变量名不应以数字开头,例如 1variable 是不合法的。

  4. 常量:常量通常使用全大写字母,单词之间用下划线分隔,例如 MAX_OVERFLOW

  5. 函数名:函数名应该使用小写字母,单词之间用下划线分隔,例如 my_function

 2.数字

2.1. 保留有效数字

  1. 保留 4 位小数位

    # 百分号
    print('%.4' % num)
    # round
    num = round(num, 4)
    

    2. 算数运算

加减乘除,+ - * /

开方:

# math 是 python 内置库,无需安装
from math import sqrt

a = sqrt(4)  # 2.0

2.2. 随机数 random

mport random

# 生成整数随机数
random.randint(-10, 10) # 在-10 到 10 的范围内生成一个随机整数

# 生成随机浮点数
random.random() # 生成 0-1 之间的随机浮点数
random.uniform(1.1, 2.2)    # 生成 1.1-2.2 之间的随机浮点数

# 生成随机字符
random.choice('jdldjfglkjalsherhbgdnfbs')   # 字符也可以换成数组之类


 3. 字符串(string)

1.类型转换:str2 = str(str1)

2.字符串定义:可以用单引号 ''、双引号 "" 或三引号 ''' 或 """ 来定义字符串

3.字符串是不可变的:尝试改变字符串中的字符会导致错误。

4.字符串索引:字符串可以通过索引访问,索引从 0 开始。

4. 正则表达

        1.正则表达式(Regular Expressions,简称 regex)是一种文本模式描述的工具,它使用单个字符串来描述、匹配一系列符合某个句法规则的字符串。正则表达式本身不是一种编程语言,而是一种用于字符串搜索和操作的强大工具

5.列表

1.列表(List)是一种内置的数据结构,用于存储有序的元素集合。列表是可变的,这意味着你可以在列表中添加、删除或更改元素。

2.定义:列表使用方括号 [] 定义,元素之间用逗号分隔。

3.用法:

添加:

  • 使用 append() 在列表末尾添加一个元素。
  • 使用 insert() 在指定位置插入一个元素。
  • 使用 extend() 合并两个列表或在列表末尾追加一个可迭代对象的元素。

删除:

  • 使用 remove() 删除列表中第一个匹配的元素。
  • 使用 pop() 删除并返回指定位置的元素,默认是最后一个元素。
  • 使用 del 根据索引删除元素。

长度:

使用 len() 函数获取列表的长度。

元组

是一种数据结构,用于存储不同的值。

元组与列表(list)类似,但是元组是不可变的,这意味着一旦元组被创建,你就不能更改它的元素。

my_tuple = (1, 2, 3)

集合

是一种无序的、不包含重复元素的数据结构。它类似于数学中的集合概念,支持数学上的集合操作,如并集、交集、差集等。

文件处理

1.遍历文件名

import os

# 获取文件列表
sources_path = "./folder"  # 路径
file_name = os.listdir(sources_path)  # 所有文件名

逻辑:文件地址,文件名。

2.遍历多层文件夹

import os

file_list = []
for root, folder, files in os.walk('./folder'):
    for file_name in files:
        file_list.append(root + '/' + file_name)

 文件列表,for循环读取文件夹,使用os.walk()函数遍历./folder'目录及其所有子目录,

file_list.append(root + '/' + file_name):将当前文件的完整路径(由root目录路径和file_name文件名拼接而成)添加到file_list列表。

3.重命名

import os
# 重命名文件
os.rename(old_name, new_name)
os.rename

;逻辑:函数使用。

4.打开文件、文件夹

import os

path = ''
os.system("explorer.exe %s" % path)  # 打开文件夹
  1. path = '':定义一个变量path并赋值为一个空字符串。这个变量应该用来存储要打开的文件夹的路径,但在这段代码中它被设置为了一个空字符串,这意味着没有指定任何路径。

  2. os.system("explorer.exe %s" % path)os.system()函数用于执行一个指定的命令(在这个例子中是explorer.exe,Windows资源管理器的命令行调用方式)。%s是一个占位符,用于插入变量path的值。然而,由于path是一个空字符串,所以这个命令实际上会尝试打开一个空的资源管理器窗口。

pytorch框架

1.pytorch的基本步骤?

1.准备数据,2.定义网络模型,3.搭建网络模型,4.训练模型,5.可视化训练结果,6.使用继评估模型。

深度神经网络

时间序列模型

LightGBM

是一种基于树的算法,也就是说,它是用很多小的决策树来构建预测模型。

它主要有两个特点:

  • 梯度提升:每一棵新的树都是在上一次的误差基础上进行改进的。它不断地改进模型的预测结果,使得误差越来越小。

  • 直方分割:它使用了更高效的方式来构建树,使得训练过程更快,尤其在处理大规模数据时,效果特别明显。

LightGBM 会通过以下步骤来进行预测:

  1. 构建第一棵树:它会根据这些数据先构建一棵简单的树,比如根据温度、是否节日等因素分裂成几个节点。它会尝试找到哪些特征(比如“是否节日”)对销量影响最大。

  2. 计算误差:第一棵树的预测可能不准,LightGBM 会计算预测值与真实值之间的差距,这个差距叫误差

  3. 构建第二棵树:LightGBM 用上一棵树的误差作为新的目标,构建第二棵树。第二棵树的任务就是减少这些误差,也就是说,第二棵树的目标是让预测值更接近真实值。

  4. 重复这个过程:LightGBM 会反复建树,每次都在减少误差,逐步提升预测的准确性。

  5. 最终结果:所有树的结果结合起来,得到最终的预测值。这个组合方式就是加权的方式,有的树权重高,有的权重低。

  • LightGBM 是一种高效的决策树集成算法,特别适合大数据和高维数据。

  • 它通过不断构建新的树,逐步减少误差,让预测越来越准。

  • 因为用了更高效的分裂方式,所以它比传统方法更快。

LightGBM 的核心是梯度提升决策树(GBDT),它通过构建多个决策树,逐步提升模型的精度。

LightGBM 在 GBDT 的基础上进行了以下改进:

  • 直方分裂:LightGBM 先将连续特征离散化为多个直方块,这样可以加速找到最佳分裂点。

  • 基于叶子节点的增长策略:它每次选择叶子节点来进行分裂,而不是基于树的层级分裂,这样可以提高模型的精确度。

我们将使用 Kaggle 数据集 “Bike Sharing Dataset” 来训练一个 LightGBM 模型,用于预测自行车共享的使用量。

首先,导入数据并对数据进行基本处理。我们会选择少量特征进行简化操作。

在训练过程中,我们手动实现一个简化的分裂算法。我们将对每个特征进行分裂,计算不同分裂点的残差平方和来选择最佳分裂点。

通过计算残差并训练新树来改进模型。

我们可以生成以下 4 个分析图表:

  1. 特征分布图:显示主要特征(如温度、湿度)和自行车使用量的分布情况。

  2. 损失函数下降图:展示模型迭代过程中损失函数的变化趋势。

  3. 特征重要性图:分析哪些特征在模型中最重要。

  4. 预测值与实际值比较图:展示预测结果与实际值之间的差异。

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt

# 数据导入与预处理
data = pd.read_csv("bike_sharing.csv")

# 确保列名没有多余的空格
data.columns = data.columns.str.strip()

# 选择特征和目标变量
X = data[['temp', 'hum', 'windspeed']].values
y = data['cnt'].values

# 定义均方误差损失函数和残差计算函数
def mse(y_true, y_pred):
    return np.mean((y_true - y_pred) ** 2)

def gradient(y_true, y_pred):
    return y_true - y_pred

# 构建简单的决策树
class SimpleTree:
    def __init__(self, max_depth=3, min_samples_split=10):
        self.max_depth = max_depth
        self.min_samples_split = min_samples_split

    def fit(self, X, y, depth=0):
        if depth < self.max_depth and len(y) >= self.min_samples_split:
            m, n = X.shape
            best_mse, best_split, best_feature = float('inf'), None, None
            for feature in range(n):
                thresholds = np.unique(X[:, feature])
                for threshold in thresholds:
                    left = y[X[:, feature] <= threshold]
                    right = y[X[:, feature] > threshold]
                    mse_val = (len(left) * mse(left, left.mean()) + len(right) * mse(right, right.mean())) / m
                    if mse_val < best_mse:
                        best_mse = mse_val
                        best_split = threshold
                        best_feature = feature

            if best_split is not None:
                self.feature = best_feature
                self.threshold = best_split
                left_idx = X[:, self.feature] <= self.threshold
                right_idx = X[:, self.feature] > self.threshold
                self.left = SimpleTree(self.max_depth, self.min_samples_split).fit(X[left_idx], y[left_idx], depth + 1)
                self.right = SimpleTree(self.max_depth, self.min_samples_split).fit(X[right_idx], y[right_idx], depth + 1)
            else:
                self.value = y.mean()
        else:
            self.value = y.mean()
        return self

    def predict(self, X):
        if hasattr(self, 'value'):
            return np.full(X.shape[0], self.value)
        else:
            mask = X[:, self.feature] <= self.threshold
            y_pred = np.empty(X.shape[0])
            y_pred[mask] = self.left.predict(X[mask])
            y_pred[~mask] = self.right.predict(X[~mask])
            return y_pred

# 梯度提升训练
class SimpleGBM:
    def __init__(self, n_estimators=10, learning_rate=0.1, max_depth=3):
        self.n_estimators = n_estimators
        self.learning_rate = learning_rate
        self.max_depth = max_depth
        self.trees = []

    def fit(self, X, y):
        y_pred = np.zeros(len(y))
        for _ in range(self.n_estimators):
            residuals = gradient(y, y_pred)
            tree = SimpleTree(max_depth=self.max_depth).fit(X, residuals)
            y_pred += self.learning_rate * tree.predict(X)
            self.trees.append(tree)

    def predict(self, X):
        y_pred = np.zeros(X.shape[0])
        for tree in self.trees:
            y_pred += self.learning_rate * tree.predict(X)
        return y_pred

# 训练模型
model = SimpleGBM(n_estimators=10, learning_rate=0.1, max_depth=3)
model.fit(X, y)
predictions = model.predict(X)
# 可视化结果
# 图1:特征分布图
plt.figure(figsize=(10, 5))
plt.scatter(data['temp'], data['cnt'], color='blue', label='Temperature', alpha=0.5)
plt.scatter(data['hum'], data['cnt'], color='green', label='Humidity', alpha=0.5)
plt.scatter(data['windspeed'], data['cnt'], color='red', label='Windspeed', alpha=0.5)
plt.title('Feature Distribution')
plt.xlabel('Feature Values')
plt.ylabel('Bicycle Usage Count')
plt.legend()
plt.grid()
plt.show()

# 图2:损失函数下降图
loss = []
for n in range(1, model.n_estimators + 1):
    model_partial = SimpleGBM(n_estimators=n, learning_rate=0.1, max_depth=3)
    model_partial.fit(X, y)
    loss.append(mse(y, model_partial.predict(X)))

plt.figure(figsize=(10, 5))
plt.plot(range(1, model.n_estimators + 1), loss, color='purple', marker='o')
plt.title('Loss Function Decrease')
plt.xlabel('Iteration')
plt.ylabel('Loss Value')
plt.grid()
plt.show()

# 图3:特征重要性图
# 使用简单的方式显示特征重要性(这里简化为随机数据)
importance = np.random.rand(3)
plt.figure(figsize=(10, 5))
plt.bar(['Temperature', 'Humidity', 'Windspeed'], importance, color=['blue', 'green', 'red'])
plt.title('Feature Importance')
plt.xlabel('Features')
plt.ylabel('Importance')
plt.grid()
plt.show()

# 图4:预测值与实际值比较图
plt.figure(figsize=(10, 5))
plt.plot(y, label='Actual Value', color='black')
plt.plot(predictions, label='Predicted Value', color='orange')
plt.title('Predicted vs Actual Values')
plt.xlabel('Sample Points')
plt.ylabel('Bicycle Usage Count')
plt.legend()
plt.grid()
plt.show()

CNN_LSTM_SeAt 模型

在神经网络中,卷积层和挤压激励块(Squeeze-and-Excitation Block,简称SEBlock)通常协同工作以增强特征表示。下面是它们在模型中如何配合的详细解释:

  1. 卷积层

    • 卷积层是神经网络中用于提取特征的层,特别是在处理图像或序列数据时。
    • 在卷积层中,滤波器(或称为卷积核)在输入数据上滑动,计算滤波器与输入数据的局部区域的点积,生成特征图(feature maps)。
    • 这些特征图捕捉了输入数据的局部空间层次结构,例如边缘、纹理等。
  2. SEBlock

    • SEBlock是一种注意力机制,它通过加权不同的特征图来提高特征的表示能力。
    • SEBlock的核心思想是通过对特征图的每个通道进行自适应的重标定,来强调有用的特征并抑制无用的特征。
    • 它首先使用全局平均池化(Global Average Pooling,GAP)将每个通道的特征图压缩成一个单独的数值,然后通过一个全连接层(通常是两个全连接层,第一个是降维,第二个是升维)和一个激活函数(通常是Sigmoid)来生成每个通道的权重。

CNN_LSTM_SeAt 模型中,卷积层和SEBlock的协同工作如下:

  1. 输入数据首先通过卷积层,卷积层提取输入数据的特征,并生成特征图。

  2. 然后,这些特征图被传递到SEBlock。SEBlock通过全局平均池化和两个全连接层来学习每个通道的重要性权重

  3. SEBlock输出的权重被用来重标定原始特征图的每个通道,这样模型就可以更加关注于信息丰富的通道,而忽略那些不太重要的通道。

  4. 经过SEBlock处理的特征图具有更丰富的表示能力,因为它们已经通过注意力机制被优化。

  5. 这些增强的特征图随后被送入LSTM层,LSTM层可以利用这些特征的时间序列信息来做出预测。

通过这种方式,卷积层和SEBlock的结合不仅提取了空间特征,还通过注意力机制增强了这些特征,使得模型能够更有效地处理序列数据。这种结合在处理复杂的序列任务时,如时间序列预测、语音识别或视频处理等,是非常有用的。

卷积神经网络(cnn)

1.怎么处理数据?

  1. 数据预处理

    时间序列数据通常需要被转换成适合CNN输入的格式。这可能包括将数据分割成固定长度的序列(例如,使用滑动窗口技术),以及可能的归一化处理。
  2. 一维卷积层(1D Convolutional Layer)

    在时间序列预测中,一维卷积层用于提取序列的局部特征。每个卷积核在时间序列上滑动,捕捉局部模式,如趋势、季节性等。卷积操作后,通常会跟随一个激活函数,如ReLU,以引入非线性。
  3. 池化层(Pooling Layer)

    池化层,最大池化(MaxPooling),用于降低特征的空间维度,提取最显著的特征,并减少计算量。(降低维度,减少过拟合)
  4. 全连接层(Fully Connected Layer)

    在卷积和池化层之后,数据通常会被展平(Flatten)并通过一个或多个全连接层,这些层可以学习特征的组合并进行最终的预测。(整体)
  5. 模型训练

    使用时间序列数据训练CNN模型,通常涉及到最小化预测值和实际值之间的差异,这可以通过各种损失函数来实现,如均方误差(MSE)。
  6. 递归预测

    在预测未来值时,可以将模型的输出作为下一时间步的输入,进行递归预测。这种方法可以捕捉时间序列的动态变化,但也可能导致累积误差。
  7. 模型优化

    为了提高预测精度,可能需要对模型参数进行优化,如调整卷积核的大小和数量、调整网络深度和宽度等。

时间序列

1.定义:

时间序列(Time Series)是一种按时间顺序排列的数据序列,通常由一系列在连续时间间隔上观察到的数据点组成。这些数据点可以是按秒、分钟、小时、天、月、季度或年等不同时间间隔记录的。时间序列数据主要用于分析和预测未来趋势、周期性变化、季节性波动等。

时间序列的特点包括:


• 有序性:数据点按照时间顺序排列。

• 连续性:数据点在时间上是连续的,即使实际的数据收集可能不是连续的。

• 可变性:数据点会随时间变化,可能表现出趋势、季节性、周期性等特征。

• 相关性:时间序列中的一个数据点与其他数据点之间可能存在统计相关性。

时间序列分析通常涉及统计学和机器学习技术,如自回归模型(AR)、移动平均模型(MA)、自回归移动平均模型(ARMA)、自回归积分滑动平均模型(ARIMA)、季节性自回归积分滑动平均模型(SARIMA)以及更现代的方法,如长短期记忆网络(LSTM)等。这些方法可以帮助识别时间序列数据中的模式,并进行有效的预测。

 传统统计方法
自回归模型(AR, Autoregressive Model)
原理:AR模型假设当前时间点的值可以表示为前几个时间点值的线性组合,强调序列中值的自相关性。公式如下: 


适用场景:适用于平稳时间序列,且当前值受之前几个时间点的值显著影响的情况。
优点:模型结构简单,易于实现;适合处理自相关性强的序列。
缺点:只能处理平稳数据,不能处理趋势和季节性成分;对于非线性关系的序列效果较差。

移动平均模型(MA, Moving Average Model)
原理:MA模型假设当前值由前几个时间点的误差项(残差)线性组合而成。
2. 机器学习方法
ARIMA模型(自回归积分滑动平均模型)
原理:ARIMA模型是ARMA模型的扩展,它引入了差分运算来使非平稳时间序列变得平稳。ARIMA模型首先对时间序列进行差分运算,使其满足平稳性要求,然后再应用ARMA模型进行预测。
3. 深度学习方法
循环神经网络(RNN)
原理:RNN通过在网络中引入循环结构,使得网络能够处理序列数据,每个时间点的输出不仅取决于当前的输入,还取决于之前时间点的输出。
长短时记忆网络(LSTM)
原理:LSTM是RNN的一种变体,它通过引入门控机制来解决RNN在处理长序列时的梯度消失问题。
门控循环单元(GRU)
原理:GRU是另一种RNN的变体,它简化了LSTM的结构,但同样能够学习长期依赖关系。
Transformer
原理:Transformer模型使用自注意力机制来捕捉序列中的长程依赖性,适用于处理变长序列和不定长序列。
Autoformer
原理:AutoFormer是一种基于Transformer结构的时序预测模型,它采用自注意力机制和Transformer结构,能够并行计算,提高训练效率。
这些算法各有特点和适用场景,选择合适的算法需要根据具体的时间序列数据特性和预测目标来决定。

频率增强通道注意力机制(FECAM)

是一种新型的注意力机制,旨在提升时间序列预测模型的性能。

FECAM基于离散余弦变换(DCT),用于模拟通道之间的频率相互依赖性。这种方法可以改善模型提取频率特征的能力,并解决傅里叶变换(FT)中的逆变换导致的计算开销问题

FECAM是一种有效的频率特征提取方法,通过增强模型的频域建模能力,显著提升了时间序列预测任务的性能。

回归算法

能够建立特征与目标之间的关系模型,实现预测、关系分析和特征重要性评估等多方面的应用。

通过回归分析,我们能够理解变量之间的趋势、检测异常值、为决策提供支持,并在时间序列中进行趋势分析,为数据科学和实际问题提供有力的工具。

1.线性回归

线性回归是一种用于建模和分析变量之间关系的统计方法,特别是用于预测一个变量(被称为因变量)与一个或多个自变量之间的关系。

在简单线性回归中,只有一个自变量,而在多元线性回归中,有多个自变量。

简单线性回归:

简单线性回归的最小二乘法:

给定一组数据点,每个数据点包含一个或多个自变量(解释变量)和一个因变量(响应变量)。
目标是找到一个线性模型(通常是直线或平面),这个模型能够最好地拟合这些数据点

多元线性回归:

2.岭回归(Ridge Regression)是一种用于处理多重共线性问题的线性回归扩展。多重共线性指的是自变量之间存在高度相关性的情况,这会导致普通线性回归的参数估计不稳定。岭回归通过在损失函数中引入正则化项(L2范数)来解决这个问题。

3.决策树回归

是一种基于树结构的回归模型,它通过对输入空间进行递归的划分,将每个划分区域内的样本的目标值取平均值作为预测值。以下是决策树回归的详细原理和核心公式。

1.决策树的建立

决策树的建立分为以下步骤:

  • 选择最佳的划分特征:通过计算每个特征的信息增益或均方误差等指标,选择最佳的特征来进行划分。

  • 划分数据集:根据选择的特征进行数据集的划分,形成子节点。

  • 递归地建立子树:对每个子节点递归地重复上述步骤,直到满足停止条件。

2. 决策树回归预测

对于新的输入样本,通过决策树的结构,从根节点开始逐级判断样本应该属于哪个叶子节点,然后将该叶子节点内训练样本的目标值作为预测值。

4.随机森林回归

是一种基于决策树的集成学习算法,通过建立多个决策树并对其进行平均或投票来提高模型的泛化性能。以下是随机森林回归的详细原理和核心公式。

1.随机森林的建立

  • Bagging过程(自助采样): 对训练数据进行有放回的抽样,构建多个不同的训练数据集。

  • 构建决策树: 对每个数据集建立一个决策树,树的建立过程与普通决策树相似。

  • 随机特征选择: 在每个节点的分裂过程中,随机选择一部分特征进行考虑,而不是考虑所有特征。

5.支持向量回归(Support Vector Regression,SVR)

是一种使用支持向量机(SVM)来进行回归的方法。SVR通过将输入空间映射到高维特征空间,并在高维空间中寻找最优超平面来进行回归。以下是支持向量回归的详细原理和核心公式。

核心原理

1. 基本思想

  • 与分类任务中的支持向量机类似,SVR也采用了核方法来将输入空间映射到高维特征空间。

  • SVR的目标是找到一个超平面,使得训练样本在该超平面上的映射值与目标值的差异最小化,并且同时保持误差在一定范围内。

5.神经网络回归

1.是一种使用神经网络进行回归任务的方法。

神经网络由多个神经元(或称为节点)组成,这些神经元通过层次结构连接在一起,每个连接都有一个权重。以下是神经网络回归的详细原理和核心公式。

核心原理

1. 基本结构

  • 输入层: 接受输入特征的层。

  • 隐藏层: 由多个神经元组成,通过权重连接构建神经网络的核心。

  • 输出层: 输出回归问题的预测值。

优缺点和适用场景

优点:

  • 能够捕捉复杂的非线性关系。

  • 在大规模数据集上表现良好。

缺点:

  • 训练时间较长,需要大量的数据。

  • 对于过拟合敏感,需要适当的正则化。

适用场景:

  • 复杂的非线性回归问题。

  • 大规模数据集,充足的计算资源

损失函数

是一个衡量模型预测值与实际值之间差异的函数。损失函数的目的是量化模型的性能,即模型预测的准确性。损失函数的输出值称为损失值(Loss Value),它是一个非负实数,表示模型预测的误差或损失。

“损失”指的是模型预测值与真实值之间的差异程度。

损失值越小,意味着模型的预测越接近真实值,模型的性能越好。在训练模型的过程中,目标是最小化损失函数,即找到一组参数,使得损失值尽可能小,从而使模型能够更好地拟合训练数据。

目标函数=损失函数

是数学优化中的一个概念,它代表了一个需要被最大化或最小化的函数。

在优化问题中,目标函数是衡量解决方案优劣的关键指标

自适应优化算法,PCA=主成分分析

1.在神经网络中主要扮演数据降维和特征提取的角色。

作用:

  1. 数据降维:PCA通过线性变换将高维数据映射到低维空间,同时尽可能保留数据中的主要变化模式。这有助于减少神经网络模型的输入维度,降低模型的计算复杂度和训练时间。

  2. 特征提取:PCA能够从原始数据中提取出最重要的特征,即主成分。这些主成分是原始数据中方差最大的方向,代表了数据中的主要信息。通过选择前几个主成分,可以在降低数据维度的同时保留大部分的信息。

  3. 去噪:PCA还可以用于去除数据中的噪声,因为它通过最大化方差来选择主成分,这通常会导致噪声成分被忽略或减少。

  4. 提高模型性能:在神经网络中,使用PCA进行预处理可以提高模型的性能和稳定性。通过减少数据的维度,PCA有助于避免过拟合,并可能提高模型的泛化能力。

  5. 数据预处理:在构建神经网络模型之前,对数据集进行PCA处理是一个常见的步骤。这有助于从数据中提取关键信息,为神经网络的训练提供更有效的输入特征

 

结合PCA和自适应算法的流程:

  1. 使用PCA降维时序数据,减少冗余特征。

  2. 使用深度学习模型(如LSTM)结合Adam优化进行预测。

RAG增强检索生成-静态知识库

AI装了一个“实时资料库”——当用户提问时,系统会先从这个资料库中快速查找相关文档,再基于找到的信息生成回答,而不是完全依赖模型自身的记忆。

具体工作原理分三步:

  1. 检索(Retrieve) :系统将用户的问题与预设的文档数据库(如论文、网页、企业知识库等)进行匹配,通过相似度搜索(例如最近邻算法)找出最相关的信息片段。例如,问“如何治疗流感?”时,系统会从医学指南或最新研究中检索相关内容。

  2. 增强(Augment) :将检索到的信息作为额外背景输入给LLM。这一步让模型在生成答案时,既能利用自身的通用知识,又能结合最新的外部资料,避免“凭空编造”(即幻觉问题)。

  3. 生成(Generate) :LLM综合检索到的资料和自身理解,生成最终回答。如果检索结果不足,系统可能直接回复“无法回答”。

MCP = Model Context Protocol模型上下文协议-动态知识库

传统API像定制钥匙——每把锁(数据源)需要单独打造钥匙(接口);而MCP是万能钥匙,通过统一标准打开所有兼容的锁 。

数学知识

1. 傅里叶变换(FFT算法)

        我们需要明白:FFT算法实质上就是DFT算法的改良版,而DFT算法则是傅里叶变换的离散版。按傅里叶变换→DFT→FFT的思路推导,即可理解FFT。

数据库MYSQL

1.数据库定义:

数据库(Database)是按照数据结构来组织、存储和管理数据的仓库。

每个数据库都有一个或多个不同的 API 用于创建,访问,管理,搜索和复制所保存的数据。

2.MySQL库定义:

MySQL 为关系型数据库(Relational Database Management System), 这种所谓的"关系型"可以理解为"表格"的概念, 一个关系型数据库由一个或数个表格组成。  

3. 安装:

window的下载网站:https://dev.mysql.com/downloads/mysql/

微电网

一、定义与基本构成

微电网(Microgrid)是由分布式能源、储能装置、能量转换设备、负载及监控保护系统构成的独立可控供能系统,具有以下核心特征:

1. 双模式运行:支持并网(Grid-connected)与孤岛(Islanded)运行模式的平滑切换,在主电网故障时可自主维持供电。

2. 明确边界:具有清晰的电气边界,通过静态开关(PCC)与主电网连接,形成局域能源自治网络。

3. 智能控制:由中央控制器(MGCC)或分布式控制实体实现能源调度、电压频率调节等功能。

核心组件包括:

- 发电单元:风力涡轮机(WT)、光伏系统(PV)、燃气轮机(CHP)等分布式电源

- 储能系统:锂电池(BESS)、超级电容器、氢储能(H2S)等多类型储能装置

- 电力电子接口:双模式逆变器、DC/AC转换器等实现交直流混合组网

- 智能监控:基于485/ModBus等通信协议的SCADA系统,支持实时数据采集与决策

二、技术架构演进

1. 控制架构分层化:

   本地控制层:实现DER单元的电压/电流控制与防孤岛保护

   协调控制层:采用MPBC算法进行功率分配与不平衡补偿

   系统管理层:通过MGCC完成中长期调度与跨微电网交互

2. **通信网络创新**:

   - 采用ModBus TCP(IEEE 2030.9标准)实现设备即插即用

   - 区块链技术应用于跨微电网电力与碳配额交易

3. **拓扑结构多元化**:

   - 直流微电网(DC-MG):减少AC-DC转换损耗,适合数据中心、电动汽车充电站

   - 交直流混合微电网(HMG):整合光伏直流输出与交流负载需求,效率提升15%-20%

微电网作为能源互联网的核心载体,正从技术示范走向商业化运营。随着数字孪生、区块链、氢能储能等技术的深度融合,未来将形成"细胞化"能源网络,推动全球能源系统向低碳、弹性、智能方向加速转型。中国需在标准制定(如CQC微电网认证体系)、市场机制(如绿色电力证书交易)、核心技术(如宽禁带半导体器件)等领域持续突破,抢占新一轮能源革命制高点。

2025 4.5日

流继电器通过实时监测电路中的电流值,判断是否超过预设阈值(如短路、过载等),并触发保护动作。

多维度保护功能集成现代过流继电器通常集成多种保护逻辑,例如:

接地故障保护:检测中性线或接地回路的异常电流(如MK2200 ELCB的非方向性漏电元件)。

负序保护:识别三相不平衡或断相故障(如SEL-351A的59Q负序过压保护)。

断路器故障保护:在断路器失效时启动后备跳闸(如50BF功能)。

过流继电器的核心功能是检测电流异常并触发保护动作,其输入信号以电流为主(可能辅以电压、数字指令),输出则包括物理跳闸指令、通信信号及状态反馈

电路知识:

 过流继电器:电路的“智能保安”

功能:就像一个24小时值班的保安,专门盯着电路里的“电流大小”。如果电流突然变得太大(比如短路,相当于电路里突然“堵车”了),它会立刻拉闸断电,防止电线烧坏或设备爆炸。

举个例子:你家的保险丝就是最简单的“过流继电器”。当空调、电饭锅同时开,电流太大时,保险丝熔断,保护电路。

输入和输出

输入:保安要看的是“电流表”(电流信号)。

输出:如果发现异常,保安会按“紧急按钮”(输出信号),让断路器跳闸,或者亮红灯报警。

 径向网络(Radial Network):像一棵树

结构:电力或信号从中心点(树干)出发,分成树枝、树枝再分树枝,最后到叶子(用户)。

现实比喻电力系统:农村电网,一个变压器供电给整个村子,每家每户的电线都从这一条主线上分出来。Wi-Fi:家里一个路由器,所有手机、电脑都连它,信号从中心向外辐射。优点简单、便宜,装起来容易缺点:如果“树干”断了(比如主电线故障),整个树枝以下的区域都会停电例子:圣诞树上的彩灯如果是“径向”连接,一根线断了,后面所有灯都灭了。

3. 网状网络(Mesh Network):像地铁网

结构:多个电源或信号节点互相连接,形成一张网,每条路都有多个备选路径。现实比喻电力系统:大城市的电网,多个变电站互相连接,如果一个站故障,电可以从其他路线绕过来。通信网络:5G基站之间像地铁站一样互联,手机信号可以“换乘”多个基站保持畅通。优点可靠性高,一条路堵了,换条路走。缺点:成本高,布线复杂,维护需要技术。例子:快递送货,如果一条路封了,快递员可以绕其他路线送到你家(网状网络);如果只有一条路(径向网络),封路就只能等。

主继电器

是电路的“总开关”,管着电流的“生杀大权”。它不负责检测故障(那是过流继电器的活儿),但它决定了整个系统有没有资格通电。

和过流继电器的区别

过流继电器:像“消防员”,只在电流过大时紧急断电(被动保护)。

主继电器:像“保安队长”,日常负责全盘控制电源(主动管理)。

举个栗子:你家总闸(主继电器)平时一直开着,但保险丝(过流继电器)只有短路时才熔断。

后备继电器

是“备胎型保护装置”,不抢主保护的风头,但永远准备着兜底。
记住这个公式
主保护 = 第一时间解决问题
后备保护 = 主保护不行了 + 等几秒 + 我来!

协调时间间隔(CTI)误差

协调时间间隔(CTI)误差是时间同步系统中因不同时钟源协调不一致导致的时间偏差,通俗来说就像“多人对表时产生的误差”。

CTI误差的“三句口诀”
  1. 本质:多人对表对不齐,系统时间有偏差。
  2. 关键:时钟质量参差不齐,信号传递有延迟。
  3. 解法:多源互补校准,动态算法补偿。

继电器的动作时间计算方法,是基于 IEEE 标准 C37.112-1996 的逆时间曲线特性。

CTI通常设为 0.2秒或0.3秒,这是考虑到继电器的机械动作时间、断路器的开断时间,以及安全裕度。

在本研究中,CTI被设定为 0.3秒

为什么需要CTI?

避免同步跳闸:如果主继电器和备用继电器同时跳闸,可能会导致整个电路停电。

确保故障处理顺序:给主继电器一个机会先处理故障,备用继电器作为后备保护。

通俗易懂的解释

想象继电器是一个“电路保护员”,它的任务是:当电路中的电流超过某个“警戒线”(Ipickupi​​)时,它会开始计算时间。如果电流越大(Isc3θmax​​ 越大),它跳闸的时间就越短。如果电流刚好超过警戒线一点点,它会跳闸得慢一些。你还可以通过调整“调节器”(diali)来改变它的反应速度。

这个公式的核心思想是:

继电器的动作时间取决于实际电流与警戒线电流的比值。

电流越大,动作时间越短;电流越接近警戒线,动作时间越长。

你可以通过调整“调节器”(diali)来改变动作时间。

时间倍数设定值(dial):控制继电器的反应速度,不能太快也不能太慢。

整定电流(I_pickup):设置继电器的警戒线电流,不能太低也不能太高。

限制条件(公式3和4):确保这些参数在合理范围内,既保护电路,又避免误跳闸

什么是灵敏度?

灵敏度是用来衡量继电器对故障的“感知能力”。简单来说,灵敏度越高,继电器越能快速检测到故障并采取行动。

灵敏度:衡量备用继电器对故障的感知能力。

灵敏度公式:比较短路电流和启动电流设定值。

灵敏度约束:灵敏度必须大于等于1.5,确保备用继电器能及时检测到故障。

什么是差分进化算法(DE)?

差分进化算法是一种优化算法,用来在复杂的搜索空间中找到最优解。它通过不断调整参数(称为“个体”或“种群”),逐步逼近最优解。可以想象成一群蚂蚁在寻找食物,它们通过不断探索和交流,找到最佳路径。

DE的基本步骤

初始化种群:随机生成一组初始解。

变异:通过随机组合现有解生成新的候选解。

交叉:混合现有解和候选解,生成试验解。

选择:选择更优的解进入下一代种群。

增强型差分进化算法(eDE)通过以下方式提高性能:

表盘缩减策略:缩小搜索范围,加快收敛。

精英主义和中庸策略:保留优秀个体,同时引入新个体,保持多样性。

变异指数更新策略:随机调整方向,避免陷入局部最优。

种群缩减策略:减少种群数量,提高效率。

自适应交叉策略

作用:自动调整交叉参数,确保试验解与目标解和供体解之间的平衡。

通俗解释:就像在混合现有解和候选解时,自动决定混合的比例,确保新解既有创新性又不失稳定性。

多目标优化算法(MOEAs)

多目标优化算法(MOEAs)旨在同时优化多个目标函数,找到一组最优解(称为帕累托前沿)。

优势概念

定义:一个解 x1 支配另一个解 x2,如果 x1 在所有目标上都不比 x2 差,并且在至少一个目标上优于 x2

通俗解释:就像在多场比赛中,选手 x1 在所有项目中都不比 x2 差,并且在至少一个项目中表现更好。

帕累托前沿

定义:一组非支配解,这些解在目标空间中无法被其他解同时优于。

通俗解释:就像在多场比赛中,没有一个选手能在所有项目中同时击败这些选手。

遗传算法

是一种模仿生物进化过程的智能优化方法,用“适者生存”的原理在计算机里解决问题。

步骤拆解(进化版爬山):

  1. 随机撒“人”探路
    先派一群人去山的不同位置(这群人叫“种群””,每个人的位置代表一种可能的解决方案)。

  2. 谁站得高,谁有资格“生孩子”
    用“身高”评估每个人的成绩(适应度函数),比如站在海拔500米的人比300米的人得分高。高分的人更可能被选中当“父母”。

  3. 父母“交换基因”生孩子
    比如父母A在坐标(x1,y1),父母B在(x2,y2),他们的孩子可能继承x1和y2,形成新坐标(x1,y2)——这叫交叉,组合出新的解决方案。

  4. 偶尔给孩子“突变”
    生孩子时,随机把某个坐标微调(比如x1+0.5),这叫变异,防止所有人挤在同一区域,错过真正的最高点。

  5. 一代代进化
    重复2-4步,新一代的人会逐渐向更高处聚集,直到找到最高点或达到迭代次数。

        改进遗传算法是对传统遗传算法的优化版本,目的是解决传统方法存在的收敛速度慢、容易陷入局部最优解(早熟)等问题。通俗来说,就像给传统算法加上“智能调节器”和“加速器”,让它更快、更准地找到最优解。以下是具体改进方向和原理:

1. 动态调整参数——让算法更“聪明”

  • 传统问题:传统算法中,交叉率和变异率是固定值,可能导致进化效率低下或多样性不足。

  • 改进方法:根据个体适应度动态调整参数。比如,适应度高的个体(优秀解)降低交叉率,保留优势;适应度低的个体提高变异率,增加多样性。这种自适应策略既保持种群多样性,又加快收敛速度。

2. 变异操作升级——跳出局部陷阱

  • 传统问题:传统变异是小幅度随机改动,容易卡在局部最优。

  • 改进方法:引入大变异操作二元变异,通过更大范围的随机扰动帮助算法跳出局部最优区域。例如,当种群趋于相似时,突然进行大范围变异,相当于“重启”搜索过程。

3. 混合其他算法——强强联合

  • 传统问题:单一遗传算法全局搜索能力强,但局部搜索能力弱。

  • 改进方法:结合差分进化模拟退火等其他算法的思想。例如,在变异操作中引入差分进化的计算方式,增强全局搜索能力;或在适应度函数中引入模拟退火的温度控制,避免过早收敛。

4. 适应度函数优化——更科学的评价标准

  • 传统问题:适应度函数设计不合理会导致优势个体过快占据种群,引发早熟。

  • 改进方法:用Logistic曲线指数罚系数调整适应度。例如,初期压制过高适应度个体的繁殖机会,后期放大差异,平衡多样性和收敛速度。

5. 编码与解码优化——减少计算负担

  • 传统问题:二进制编码的解码过程耗时,影响速度。

  • 改进方法:采用隐式解码或浮点编码,直接操作数值而非二进制串,减少转换步骤,使优化速度提升6~50倍。

6. 引入加速算子——加快搜索节奏

  • 改进方法:例如借鉴二分查找思想,通过可变步长策略快速缩小搜索范围,结合交叉变异操作平衡全局与局部搜索,显著提高收敛速度。

实际效果举例

  • 收敛更快:在电力系统无功优化中,改进算法比传统方法节省30%以上的计算时间。

  • 更稳定:测试函数优化结果显示,改进算法能稳定找到全局最优,而传统算法常陷入局部最优。

总结比喻

改进遗传算法就像一辆升级后的赛车:传统版本(简单遗传算法)可能因“油门和刹车不灵敏”(固定参数)或“导航不准”(适应度函数问题)而绕远路;改进版本则通过“智能油门”(自适应参数)、“弹射起步”(加速算子)和“防滑系统”(大变异)等设计,更快到达终点(全局最优),且不易打滑(陷入局部最优)。

智能优化算法(NSGA-II)

1.多目标优化是涉及多个目标函数同时优化的数学问题,需要在两个或多个相互冲突的目标之间进行权衡的情况下作出最优决策

NSGA-II像一位“多面手顾问”,能从海量方案中筛选出既优秀又多样的选项,帮助决策者在复杂需求中权衡取舍。其核心是通过分层淘汰和密度控制,高效逼近问题的最优解集。

多目标优化真正的核心难点: 怎么评价解得好坏,即怎么排序

非支配排序(Non-dominated Sorting)
将解集按优劣分层。假设优化目标是同时降低成本和提升性能,若解A的成本和性能均优于解B,则A“支配”B。第一层是所有互不支配的解(Pareto前沿),第二层是被第一层支配的解,依此类推。

支配是指两个值要比另一个好。

拥挤度(Crowding Distance)
衡量解在目标空间中的分布密度。拥挤度高的解周围“邻居”少,保留它们能确保解集覆盖更多可能性,避免结果扎堆(保持多样性)

精英保留(Elitism)
每一代优化时,将父代与子代合并,从中筛选最优解进入下一代,防止优秀解丢失。

算法步骤

通俗版流程如下:

  1. 初始化:随机生成一组解(种群),比如100个设计方案。

  2. 进化循环

    • 生成子代:通过“选择、交叉、变异”操作(类似生物进化)产生新解。

    • 合并种群:将父代和子代合并(共200个解)。

    • 分层筛选:按非支配排序分层,优先保留高层解;同层中选拥挤度大的解(保证多样性)。

  3. 终止:重复上述步骤直到达到迭代次数或收敛,输出最终的Pareto最优解集

电网拓扑识别是确定电网结构的过程,就像绘制电网的地图。电网的结构包括:

母线:电网中的主要节点。

线路:连接母线的路径。

发电机:电力的来源。

负荷:电力的消耗点。

PMU(Phasor Measurement Unit)是电力系统中用来实时、同步测量电压和电流波形的设备,就像给电网装上了“心电图仪”,能精准捕捉电网的“心跳节奏”。

差动保护继电器

就像电力系统的“天平卫士”,通过实时对比设备两侧的电流是否平衡,精准识别内部故障(如短路)并迅速切断电源,防止设备烧毁或爆炸。它的核心逻辑是:“流入的电流必须等于流出的电流,否则就是有故障!

差动保护就像电路的“精密天平”,实时比较设备两端的电流是否相等。一旦发现“进≠出”,立刻断电,专门对付设备内部短路、漏电等危险故障,防止爆炸或烧毁。

差动保护是电力系统的“黄金标准”,专治各种内部电流不平衡。记住三句话:

  1. 原理:进多少电,必须出多少电!
  2. 优势:快、准、狠,只切故障点。
  3. 场景:变压器、发电机、高压电缆的“贴身保镖”。

电网数据:IEEE 14母线系统

IEEE 14母线系统是一个经典的电力系统模型,广泛用于电力系统的研究和教学。该系统包含14个节点(bus)、5个发电机、11条传输线路、11个负荷(load)和3个变压器。以下是一些关键参数:

发电机:与母线2、3、6、8和13连接,主要参数包括有功功率输出、无功功率输出及发电机容量限制。

负荷:分布在多个母线上,包括母线4、5、7、9-14,负荷数据包括有功功率需求和无功功率需求。

传输线路:连接不同的母线,具有电阻、电抗和电导值,这些参数决定了线路的功率传输能力和损耗情况

变压器:用于连接不同电压等级的母线或调节电压,连接在母线4-7、4-9和5-6之间,主要参数包括变压比和阻抗。

RM-AOCS:继电器模块-自适应过流协调系统

RM-AOCS 是电力系统中一种智能继电器模块,专用于精准检测和控制过流故障(如短路、过载)。其核心功能是自适应调整保护参数,确保不同线路的过流保护动作协调,避免误跳闸或越级跳闸,提升电网可靠性。

RM-AOCS = 智能继电器模块 + 自适应过流协调

核心价值:解决复杂电网中过流保护的“误动”与“拒动”难题。未来趋势:结合AI算法(如强化学习)实现完全自主决策,成为智能电网的“保护大脑”。

鲁棒性就是 “你随便折腾,我稳如老狗” 的能力,是工程师在设计系统时最想实现的“抗造”特性。

反时限继电保护

是一种根据故障电流大小自动调整动作时间的保护机制,其核心原理可以通俗理解为:故障电流越大,保护装置动作越快;电流越小,动作时间越长

反时限的动作特性可用一个简单公式表达:

t:动作时间

T:实际检测到的电流

I启动 : 保护启动的电流阈值(类似"警戒线")·k 和n:调整参数,决定曲线形状(如。中提到的不同平坦度特性)

IEEE反时限曲线根据响应速度可分为三种主要类型:

  1. 中等反时限(Moderately Inverse, MI)
    参数为K=0.0515,α=0.02,动作时间公式为 t=K(I/Ipickup)α−1t=(I/Ipickup​)α−1K​,适用于需要中等速度切断故障的场景。


2. 非常反时限(Very Inverse, VI)
参数K=19.61,α=0.491,其曲线斜率更陡峭,在较高电流倍数下动作时间显著缩短,适用于对速动性要求较高的场合。


3. 极端反时限(Extremely Inverse, EI)
参数K=28.2,α=0.8,在极高电流下动作时间极短,常用于保护设备免受短路等严重故障的损害。

2025.4.6

并网模式(联网模式)—— "搭伙过日子"

场景类比
当你们家正常用电时,既可以用自己屋顶的太阳能板发电,也可以从城市电网买电。如果太阳能发电太多用不完,还能把多余的电卖给电网

核心特点

电压和频率由大电网控制(类似全家的电器都跟着城市电网的"心跳"走)

遇到雷击停电时,微网会立刻断开与大电网的连接(就像跳闸保护)

保护系统只需关注内部故障(比如自家线路短路)

孤岛模式(离网模式)—— "自力更生" 

场景类比
如果城市电网大停电(比如台风导致电线倒塌),你们家的太阳能板和储能电池会自动切换成独立供电,形成一个"电力孤岛",继续给冰箱、照明等关键设备供电。

核心特点

微网必须自己控制电压和频率(类似自家装了个迷你发电机维持"心跳")

储能设备(如电池)充当"电力缓冲器",

平衡发电和用电保护系统需要更灵敏(既要防内部故障,还要防电压/频率失控)

3. 模式切换的"惊险一跳"

触发条件
主电网停电(被动切换)或主动断开(比如检修)

技术难点

无缝切换:必须在0.2秒内完成离网并建立稳定供电(比眨眼还快)

保护定值突变
并网时故障电流可能高达数千安培,而孤岛模式可能只有几十安培(类似开车时突然从高速公路切换到乡间小路,刹车距离需要调整)

零序电流

电力系统中的一种特殊电流现象,通俗来说,可以理解为在三相电路中出现的不平衡电流的“剩余部分”

零序电流主要发生在三相电力系统不对称运行单相故障时。例如:

  • 三相负载不平衡:当三相负载(如电动机、照明设备)分配不均时,各相电流大小或相位不同,导致三相电流的矢量和无法完全抵消,剩余部分即形成零序电流。

  • 单相接地故障:当某一相线路接地(如电线触碰金属外壳),故障电流会通过地面流回电源,此时三相电流的矢量和不再为零,产生零序电流。

零序电流的最大特点是三相电流同相位且大小相等。用日常比喻来说,就像三个人同时往同一个方向推箱子,合力无法相互抵消,最终形成“合力”作用于中性线或地线。其数学表达式为:

 

 其中I0为零序电流,IAIA​、IBIB​、ICIC​为三相电流。

实际应用中的控制

  • 负载平衡:通过调整三相负载分配,尽量减少不平衡。
  • 中性点接地方式:采用消弧线圈或电阻接地来限制零序电流。
  • 检测技术:利用零序电流互感器监测故障,或通过投入电容器组增强故障特征以定位故障点

怎么观察相位差?

在您提供的这种波形图上观察相位差,可以采用以下方法:

  • 对比过零点:观察两个波形从负到正(或从正到负)穿越横轴(零值)的时刻。如果两个波形同时过零,则它们同相。如果一个波形比另一个波形提前过零,则其超前;反之则滞后
  • 对比峰值点:观察两个波形达到正向峰值(或负向峰值)的时刻。比较这两个时刻的峰值可以判断相位关系。
  • 使用网格提示:利用图上的垂直波网格线。一个完整的正弦周期(36 0∘可以给出两个波形对应点(如热点点)在时间轴上的差距(Δt​),再根据一个周期的时间(T)计算相位差:Δφ​=(Δt / T )​×36 0∘。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

无限进步呀

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值