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站视频。
Python数据类型
1.Python 变量
命名约定:
-
小写字母:变量名通常使用小写字母,单词之间可以用下划线分隔,这种风格称为“snake_case”。
-
避免使用 Python 关键字:不要使用 Python 的保留字作为变量名,例如
if、for、while等。 -
避免使用数字开头:变量名不应以数字开头,例如
1variable是不合法的。 -
常量:常量通常使用全大写字母,单词之间用下划线分隔,例如
MAX_OVERFLOW。 -
函数名:函数名应该使用小写字母,单词之间用下划线分隔,例如
my_function。
2.数字
2.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) # 打开文件夹
-
path = '':定义一个变量path并赋值为一个空字符串。这个变量应该用来存储要打开的文件夹的路径,但在这段代码中它被设置为了一个空字符串,这意味着没有指定任何路径。 -
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 会通过以下步骤来进行预测:
-
构建第一棵树:它会根据这些数据先构建一棵简单的树,比如根据温度、是否节日等因素分裂成几个节点。它会尝试找到哪些特征(比如“是否节日”)对销量影响最大。
-
计算误差:第一棵树的预测可能不准,LightGBM 会计算预测值与真实值之间的差距,这个差距叫误差。
-
构建第二棵树:LightGBM 用上一棵树的误差作为新的目标,构建第二棵树。第二棵树的任务就是减少这些误差,也就是说,第二棵树的目标是让预测值更接近真实值。
-
重复这个过程:LightGBM 会反复建树,每次都在减少误差,逐步提升预测的准确性。
-
最终结果:所有树的结果结合起来,得到最终的预测值。这个组合方式就是加权的方式,有的树权重高,有的权重低。
-
LightGBM 是一种高效的决策树集成算法,特别适合大数据和高维数据。
-
它通过不断构建新的树,逐步减少误差,让预测越来越准。
-
因为用了更高效的分裂方式,所以它比传统方法更快。
LightGBM 的核心是梯度提升决策树(GBDT),它通过构建多个决策树,逐步提升模型的精度。
LightGBM 在 GBDT 的基础上进行了以下改进:
-
直方分裂:LightGBM 先将连续特征离散化为多个直方块,这样可以加速找到最佳分裂点。
-
基于叶子节点的增长策略:它每次选择叶子节点来进行分裂,而不是基于树的层级分裂,这样可以提高模型的精确度。
我们将使用 Kaggle 数据集 “Bike Sharing Dataset” 来训练一个 LightGBM 模型,用于预测自行车共享的使用量。
首先,导入数据并对数据进行基本处理。我们会选择少量特征进行简化操作。
在训练过程中,我们手动实现一个简化的分裂算法。我们将对每个特征进行分裂,计算不同分裂点的残差平方和来选择最佳分裂点。
通过计算残差并训练新树来改进模型。
我们可以生成以下 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)通常协同工作以增强特征表示。下面是它们在模型中如何配合的详细解释:
-
卷积层:
- 卷积层是神经网络中用于提取特征的层,特别是在处理图像或序列数据时。
- 在卷积层中,滤波器(或称为卷积核)在输入数据上滑动,计算滤波器与输入数据的局部区域的点积,生成特征图(feature maps)。
- 这些特征图捕捉了输入数据的局部空间层次结构,例如边缘、纹理等。
-
SEBlock:
- SEBlock是一种注意力机制,它通过加权不同的特征图来提高特征的表示能力。
- SEBlock的核心思想是通过对特征图的每个通道进行自适应的重标定,来强调有用的特征并抑制无用的特征。
- 它首先使用全局平均池化(Global Average Pooling,GAP)将每个通道的特征图压缩成一个单独的数值,然后通过一个全连接层(通常是两个全连接层,第一个是降维,第二个是升维)和一个激活函数(通常是Sigmoid)来生成每个通道的权重。
在 CNN_LSTM_SeAt 模型中,卷积层和SEBlock的协同工作如下:
-
输入数据首先通过卷积层,卷积层提取输入数据的特征,并生成特征图。
-
然后,这些特征图被传递到SEBlock。SEBlock通过全局平均池化和两个全连接层来学习每个通道的重要性权重。
-
SEBlock输出的权重被用来重标定原始特征图的每个通道,这样模型就可以更加关注于信息丰富的通道,而忽略那些不太重要的通道。
-
经过SEBlock处理的特征图具有更丰富的表示能力,因为它们已经通过注意力机制被优化。
-
这些增强的特征图随后被送入LSTM层,LSTM层可以利用这些特征的时间序列信息来做出预测。
通过这种方式,卷积层和SEBlock的结合不仅提取了空间特征,还通过注意力机制增强了这些特征,使得模型能够更有效地处理序列数据。这种结合在处理复杂的序列任务时,如时间序列预测、语音识别或视频处理等,是非常有用的。
卷积神经网络(cnn)
1.怎么处理数据?
-
数据预处理:
时间序列数据通常需要被转换成适合CNN输入的格式。这可能包括将数据分割成固定长度的序列(例如,使用滑动窗口技术),以及可能的归一化处理。 -
一维卷积层(1D Convolutional Layer):
在时间序列预测中,一维卷积层用于提取序列的局部特征。每个卷积核在时间序列上滑动,捕捉局部模式,如趋势、季节性等。卷积操作后,通常会跟随一个激活函数,如ReLU,以引入非线性。 -
池化层(Pooling Layer):
池化层,最大池化(MaxPooling),用于降低特征的空间维度,提取最显著的特征,并减少计算量。(降低维度,减少过拟合) -
全连接层(Fully Connected Layer):
在卷积和池化层之后,数据通常会被展平(Flatten)并通过一个或多个全连接层,这些层可以学习特征的组合并进行最终的预测。(整体) -
模型训练:
使用时间序列数据训练CNN模型,通常涉及到最小化预测值和实际值之间的差异,这可以通过各种损失函数来实现,如均方误差(MSE)。 -
递归预测:
在预测未来值时,可以将模型的输出作为下一时间步的输入,进行递归预测。这种方法可以捕捉时间序列的动态变化,但也可能导致累积误差。 -
模型优化:
为了提高预测精度,可能需要对模型参数进行优化,如调整卷积核的大小和数量、调整网络深度和宽度等。
时间序列
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.在神经网络中主要扮演数据降维和特征提取的角色。
作用:
-
数据降维:PCA通过线性变换将高维数据映射到低维空间,同时尽可能保留数据中的主要变化模式。这有助于减少神经网络模型的输入维度,降低模型的计算复杂度和训练时间。
-
特征提取:PCA能够从原始数据中提取出最重要的特征,即主成分。这些主成分是原始数据中方差最大的方向,代表了数据中的主要信息。通过选择前几个主成分,可以在降低数据维度的同时保留大部分的信息。
-
去噪:PCA还可以用于去除数据中的噪声,因为它通过最大化方差来选择主成分,这通常会导致噪声成分被忽略或减少。
-
提高模型性能:在神经网络中,使用PCA进行预处理可以提高模型的性能和稳定性。通过减少数据的维度,PCA有助于避免过拟合,并可能提高模型的泛化能力。
-
数据预处理:在构建神经网络模型之前,对数据集进行PCA处理是一个常见的步骤。这有助于从数据中提取关键信息,为神经网络的训练提供更有效的输入特征


结合PCA和自适应算法的流程:
-
使用PCA降维时序数据,减少冗余特征。
-
使用深度学习模型(如LSTM)结合Adam优化进行预测。
数学知识
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/。


被折叠的 条评论
为什么被折叠?



