集合卡尔曼滤波ENKF的学习笔记

集合卡尔曼滤波ENKF的学习笔记

什么是数据同化?天气模型预测是25°C(这叫"背景场"),实际观测是23°C(这叫"观测值"),数据同化就是把这两个信息合理结合。

# 最简单的组合方式:取平均
forecast = 25    # 预报温度
observation = 23 # 观测温度
analysis = (forecast + observation) / 2
print(f"分析结果: {analysis}°C")

但是简单的平均是有问题的,这里我们就需要用到同化算法。

其中经典算法就是集合卡尔曼滤波(有趣的是,Evensen把ENKF的文章发在一个SCI四区期刊上,但是引用量超过5000次)。

基本概念

方差

方差(variance)是描述单个随机变量的离散程度

σ 2 = 1 n ∑ i = 1 n ( x i − μ ) 2 \sigma^2 = \frac{1}{n}\sum_{i=1}^{n}(x_i - \mu)^2 σ2=n1i=1n(xiμ)2

σ 2 \sigma^2 σ2 是方差; x i x_i xi 是第i个观测值; μ \mu μ 是平均值; n n n 是样本数量;标准差就是方差开方。

# 计算预报的不确定性
def calculate_uncertainty(forecasts):mean = np.mean(forecasts)variance = np.mean((forecasts - mean)**2)return np.sqrt(variance)  # 标准差# 两组不同的预报
forecast1 = np.random.normal(25, 1, 10)   # 较确定的预报
forecast2 = np.random.normal(25, 3, 10)   # 较不确定的预报print(f"预报1的不确定性: {calculate_uncertainty(forecast1):.2f}")
print(f"预报2的不确定性: {calculate_uncertainty(forecast2):.2f}")
#输出
#预报1的不确定性: 1.30
#预报2的不确定性: 2.15

协方差

协方差(covariance)是描述两个随机变量之间的关系,计算两个变量与各自平均值的差异乘积.

样本协方差: C o v ( X , Y ) = 1 n − 1 ∑ i = 1 n ( x i − μ x ) ( y i − μ y ) Cov(X,Y) = \frac{1}{n-1}\sum_{i=1}^{n}(x_i - \mu_x)(y_i - \mu_y) Cov(X,Y)=n11i=1n(xiμx)(yiμy)

总体协方差: C o v ( X , Y ) = 1 n ∑ i = 1 n ( x i − μ x ) ( y i − μ y ) Cov(X,Y) = \frac{1}{n}\sum_{i=1}^{n}(x_i - \mu_x)(y_i - \mu_y) Cov(X,Y)=n1i=1n(xiμx)(yiμy)

其中:

x i , y i x_i, y_i xi,yi 是第i个观测值

μ x , μ y \mu_x, \mu_y μx,μy 是X和Y的平均值

对于两个随机变量X和Y,协方差矩阵是一个2×2的对称矩阵

[Var(X)     Cov(X,Y)]
[Cov(X,Y)   Var(Y) ]

X的方差 (Var(X))[1,1]位置,Y的方差 (Var(Y))[2,2]位置。X和Y的协方差 (Cov(X,Y))在[1,2][2,1]位置,这两个值相等。

import numpy as np# 生成两组原始数据
np.random.seed(42)
X = np.random.normal(0, 1, 1000)  # 1000个标准正态分布随机数
Y = X * 0.8 + np.random.normal(0, 0.2, 1000)  # 与X正相关的数据# 手动计算协方差矩阵
def calculate_cov_matrix(x, y):# 计算样本方差var_x = np.var(x, ddof=1)  # 使用 ddof=1 来计算样本方差var_y = np.var(y, ddof=1)  # 使用 ddof=1 来计算样本方差# 计算样本协方差cov_xy = np.mean((x - np.mean(x)) * (y - np.mean(y)))# 构建协方差矩阵return np.array([[var_x, cov_xy],[cov_xy, var_y]])# 计算并打印协方差矩阵
cov_matrix = calculate_cov_matrix(X, Y)
print("手动计算的协方差矩阵:")
print(cov_matrix)# 计算相关系数
correlation = cov_matrix[0, 1] / np.sqrt(cov_matrix[0, 0] * cov_matrix[1, 1])
print(f"\n相关系数: {correlation:.3f}")
#输出
#手动计算的协方差矩阵:
#[[0.95886385 0.75843999]
# [0.75843999 0.64084244]]
#相关系数: 0.968

集合平均

集合平均通常被认为是最佳估计,单个成员可能有偏差,但平均能降低随机误差(这也是我们为什么要用集合卡尔曼的原因)。

正离差表示高于平均,负离差表示低于平均,所有离差之和为0。

def explain_deviations():"""解释离差的性质"""members = np.array([10, 12, 8, 11, 9])mean = np.mean(members)devs = members - meanprint("示例数据分析:")for m, d in zip(members, devs):print(f"成员值: {m:2d}, 离差: {d:5.2f}")print(f"\n离差之和: {np.sum(devs):.2e}")  # 应该接近0
explain_deviations()
#示例数据分析:
成员值: 10, 离差:  0.00
成员值: 12, 离差:  2.00
成员值:  8, 离差: -2.00
成员值: 11, 离差:  1.00
成员值:  9, 离差: -1.00

卡尔曼增益

卡尔曼增益K可以理解为一个"权重系数",值范围在0到1之间:接近1:更相信观测;接近0:更相信预报。用一个代码来测试:

def simple_kalman_gain(forecast_error, observation_error):"""简单的卡尔曼增益计算"""K = forecast_error / (forecast_error + observation_error)return K# 示例
def demonstrate_kalman_gain():cases = [(2.0, 1.0),  # 预报误差大,观测误差小(1.0, 2.0),  # 预报误差小,观测误差大(1.0, 1.0)   # 误差相等]for f_err, o_err in cases:K = simple_kalman_gain(f_err, o_err)print(f"\n预报误差: {f_err}, 观测误差: {o_err}")print(f"卡尔曼增益: {K:.2f}")print(f"解释: {'更相信观测' if K > 0.5 else '更相信预报'}")demonstrate_kalman_gain()

卡尔曼增益决定了我们应该相信预报还是观测的程度,公式为

K = P b H T H P b H T + R K = \frac{P^b H^T}{HP^b H^T + R} K=HPbHT+RPbHT

K K K:卡尔曼增益矩阵; P b P^b Pb:背景误差协方差矩阵,计算公式为 C o v ( X , Y ) = 1 n − 1 ∑ i = 1 n ( x i − μ x ) ( y i − μ y ) Cov(X,Y) = \frac{1}{n-1}\sum_{i=1}^{n}(x_i - \mu_x)(y_i - \mu_y) Cov(X,Y)=n11i=1n(xiμx)(yiμy)

H H H:观测算子,目的是将模式空间映射到观测空间的矩阵;

R R R:观测误差协方差矩阵;

分子$ P^b H^T :表示背景场的不确定性;分母 :表示背景场的不确定性;分母 :表示背景场的不确定性;分母 (HPbHT + R)$表示总的不确定性(背景场 + 观测);

n是集合的样本数量,m是观测点数量,k是背景点的数量,则 P b P^b Pb维度是K*K维度,

H H H是m*k

分子 P b H T {P^b H^T} PbHT是k*m个维度,

分母 H P b H T + R {HP^b H^T + R} HPbHT+R是m*m个维度,

所以卡尔曼增益维度为k*m

卡尔曼滤波的状态更新

示意图

x a = x b + K ( y − H x b ) x^a = x^b + K(y - Hx^b) xa=xb+K(yHxb)

每个集合成员都会单独更新:

x i a = x i b + K ( y i − H x i b ) x^a_i = x^b_i + K(y_i - Hx^b_i) xia=xib+K(yiHxib)

x i b x^b_i xib : 第i个集合成员的背景场(所有格点都有值)

y y y : 观测值(只在观测点有值)

H H H 观测算子,将模式空间的值映射到观测空间,在观测点为1,其他点为0, H x i b Hx^b_i Hxib 就是提取出观测位置的背景场值

K K K : 卡尔曼增益,H在非观测点是0,但K通过Pb传播了观测信息到所有格点,反映了每个格点受观测的影响程度

( y − H x i b ) (y - Hx^b_i) (yHxib) : 创新项,只在观测点计算,通过K传播到其他格点,

可以根据我的代码跑一遍,因为每一步都涉及到了公式,要理解这里面的每一个过程,会涉及一些线性代数的知识(矩阵求逆、二次型矩阵等)。

我刚开始使用的草稿纸计算的,根据公式在算的过程中就开始理解它的内在含义。

一般来说,集合数量要大于30,提高维度计算量就太大了,用python来做。这里为了测试,集合成员数量设置为了4。

import numpy as npn = 4  #  集合成员数量
m = 3  # 观测值的数量
k = 5  # 背景值的数量(看做模型预测的数量)# 假设观测向量的三个值分别为:
y = np.array([1.20,3.10, 5.00,
])
# 创建原始数据数组
data = np.array([[1.00, 2.00, 3.00, 4.00, 5.00],[1.10, 1.90, 3.20, 3.80, 4.90], [0.90, 2.10, 2.80, 4.20, 5.10],[1.05, 1.95, 3.10, 4.05, 5.05]
])
print("X1到X5在4个样本分别为")
for i, row in enumerate(data):for val in  row:print(f"{val}", end=" ")print()# 计算每列的均值
means = np.mean(data, axis=0)# 打印结果
for i, mean in enumerate(means):print(f"x{i+1}的均值: {mean:.4f}")# 计算偏差 (每个值减去该列的均值)
deviations = data - means
# 打印偏差矩阵
for i, row in enumerate(deviations):print(f"子集{i+1}的偏差:", end=" ")for val in row:print(f"{val:.4f}", end=" ")print()# 计算协方差矩阵
Pb = np.zeros((5, 5))  # 创建5x5的零矩阵# 使用公式计算每个元素
for i in range(5):for j in range(5):# 计算 P[i,j] = 1/(n-1) * sum(δk,i * δk,j)sum_product = 0for k in range(n):sum_product += deviations[k,i] * deviations[k,j]Pb[i,j] = sum_product / (n-1)# 打印结果矩阵
print("协方差矩阵 Pb:")
for row in Pb:for val in row:print(f"{val:.6f}", end=" ")print()# 现在给一个观测算子H的矩阵,1代表着在哪个格子有观测值,大小为m*k,3个观测值,5个背景值
H=np.array([[1, 0, 0, 0, 0],[0, 0, 1, 0, 0], [0, 0, 0, 0, 1],
])
# 计算分子:卡尔曼系数$K = \frac{P^b H^T}{HP^b H^T + R}$的分子:P^b H^T
PbHt=Pb@H.T
print("计算分子:卡尔曼系数 P^b*H^T\n",PbHt)
# 计算分母:卡尔曼系数$K = \frac{P^b H^T}{HP^b H^T + R}$的分母:HP^b H^T + R
# 假设观测误差独立且方差相同,因此 𝑅 为对角矩阵,大小为m*m
R=np.array([[0.05, 0,    0,    ],[0,    0.05, 0,    ], [0,    0,    0.05, ],
])
all=H@Pb@H.T+R
print("计算分母: HP^b H^T + R:\n", all)
#计算卡尔曼的增益K
# 首先计算分母的逆
all_inv = np.linalg.inv(all)
print("计算分母的逆矩阵: all_inv:\n", all_inv)
# 然后进行矩阵乘法
K_cor = PbHt @ all_inv
# 卡尔曼增益的大小为背景值的数量*样本值的数量:k*m
print("卡尔曼增益 K_cor:\n", K_cor)# 开始进行状态更新$x^a = x^b + K(y - Hx^b)$  ,x^b就是我们前面求到的4个子集的平均值
xb=means
print("H@xb:\n", H@xb)
xa=xb+K_cor@(y-H@xb)
print("卡尔曼的结果 xa:\n", xa)

集合卡尔曼滤波的状态更新

对于集合卡尔曼滤波(Ensemble Kalman Filter, EnKF) ,输出不仅仅是一个分析均值,而是一个经过观测更新后的集合。每个集合成员代表可能的系统状态,并且每个成员都会独立地进行更新。

$x_i^a = x_i^b + K(y + \epsilon_i - Hx_i^b) $

ϵ i \epsilon_i ϵi是从观测误差协方差矩阵 R 中采样得到的扰动, ϵ i \epsilon_i ϵi 的均值为零向量; ϵ i \epsilon_i ϵi 的协方差矩阵为 R R R,即 Cov ( ϵ i ) = R \text{Cov}(\epsilon_i) = R Cov(ϵi)=R。使用矩阵分解方法从标准正态分布中生成具有所需协方差的随机向量。例如,利用Cholesky分解 R = L L ⊤ R = LL^\top R=LL,其中 L L L 是下三角矩阵,则:

ϵ i = L ⋅ η i ϵ i = L ⋅ η i ϵ i = L ⋅ η i ϵi=L⋅ηi\epsilon_i = L \cdot \eta_iϵi=L⋅ηi ϵi=Lηiϵi=Lηiϵi=Lηi

其中, η i ∼ N ( 0 , I ) \eta_i \sim \mathcal{N}(0, I) ηiN(0,I) I I I 为单位矩阵。

对之前的代码添加扰动以及观测更新后的集合(而非均值)

import numpy as np# 1. 定义初始参数
n = 4  # 集合成员数量 
m = 3  # 观测数量
k = 5  # 状态变量数量# 2. 观测数据
y = np.array([1.20, 3.10, 5.00])# 3. 创建集合矩阵 A ∈ R^(k×n)  # 注意:这里更改了维度说明
A = np.array([[1.00, 2.00, 3.00, 4.00, 5.00],[1.10, 1.90, 3.20, 3.80, 4.90], [0.90, 2.10, 2.80, 4.20, 5.10],[1.05, 1.95, 3.10, 4.05, 5.05]
]).T  # 转置矩阵使其变为 5x4print("Ensemble matrix A:")
print(A)# 4. 计算集合平均 A
A_mean = np.mean(A, axis=1, keepdims=True)  # 改为axis=1
print("\nEnsemble mean:")
print(A_mean)# 5. 计算集合扰动矩阵 A' = A - A
A_prime = A - A_mean
print("\nEnsemble perturbation matrix A':")
print(A_prime)# 6. 观测算子
H = np.array([[1, 0, 0, 0, 0],[0, 0, 1, 0, 0], [0, 0, 0, 0, 1]
])# 7. 生成观测扰动
R = np.array([[0.05, 0, 0],[0, 0.05, 0], [0, 0, 0.05]
])
eps = np.random.multivariate_normal(np.zeros(m), R, n).T
print("\nObservation perturbations:")
print(eps)# 8. 创建扰动观测集合
D = np.tile(y, (n, 1)).T + eps
print("\nPerturbed observations D:")
print(D)# 9. 计算观测空间的创新向量
D_prime = D - H @ A  # 现在维度应该匹配了
print("\nInnovation D':")
print(D_prime)# 10. 计算分析步骤
# 计算 HA'
HA_prime = H @ A_prime# 计算 (HA')(HA')^T + εε^T
C = HA_prime @ HA_prime.T + eps @ eps.T# 计算分析增量
X = A_prime @ HA_prime.T @ np.linalg.inv(C) @ D_prime# 更新集合
A_a = A + Xprint("\nAnalyzed ensemble:")
print(A_a)print("\nAnalyzed mean:")
print(np.mean(A_a, axis=1))

空间上的ENKF实现代码

import numpy as np
from scipy.interpolate import griddata
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = ['SimHei']  # 用来正常显示中文标签
plt.rcParams['axes.unicode_minus'] = False    # 用来正常显示负号np.random.seed(42)# 1. 定义观测点坐标和真实温度值
known_points = np.array([[20, 20], [20, 50], [20, 80],[50, 20], [50, 50], [50, 80],[80, 20], [80, 50], [80, 80]
])
true_temperatures = np.array([25, 26, 28, 26, 32, 30, 27, 29, 31])# 2. 创建网格点
grid_x = np.linspace(0, 100, 100)
grid_y = np.linspace(0, 100, 100)
grid_x, grid_y = np.meshgrid(grid_x, grid_y)# 3. IDW插值函数
def idw_interpolation(known_points, values, grid_x, grid_y, power=2):result = np.zeros_like(grid_x)for i in range(len(grid_x)):for j in range(len(grid_y)):distances = np.sqrt((known_points[:, 0] - grid_x[i, j])**2 + (known_points[:, 1] - grid_y[i, j])**2)distances[distances == 0] = 1e-10weights = 1 / (distances ** power)result[i, j] = np.sum(weights * values) / np.sum(weights)return result# 4. 生成真实场
true_field = idw_interpolation(known_points, true_temperatures, grid_x, grid_y, power=2)# 5. 生成带误差的观测值
R = 0.1  # 观测误差标准差
observed_temperatures = true_temperatures + np.random.normal(0, R, size=true_temperatures.shape)# 6. 生成背景场(添加随机噪声)
def generate_background_field(true_field, noise_level=0.3):noise = np.random.normal(0, noise_level, true_field.shape)return true_field + noise# 7. 修改后的ENKF数据同化
def enkf_data_assimilation(true_field, known_points, observed_temperatures, ensemble_size=50):# 状态空间维度state_dim = grid_x.sizeobs_dim = len(known_points)# 初始化集合矩阵 A (state_dim × ensemble_size)ensemble = np.zeros((state_dim, ensemble_size))for i in range(ensemble_size):ensemble[:, i] = generate_background_field(true_field).ravel()# 构建观测算子 H (sparse matrix)H = np.zeros((obs_dim, state_dim))for i, (x, y) in enumerate(known_points):H[i, int(y) * grid_x.shape[1] + int(x)] = 1# 计算集合平均A_mean = np.mean(ensemble, axis=1, keepdims=True)# 计算集合扰动矩阵 A'A_prime = ensemble - A_mean# 生成观测扰动R_matrix = np.eye(obs_dim) * R**2eps = np.random.multivariate_normal(np.zeros(obs_dim), R_matrix, ensemble_size).T# 创建扰动观测集合D = np.tile(observed_temperatures, (ensemble_size, 1)).T + eps# 计算观测空间的模式值HA = H @ ensemble# 计算创新向量D_prime = D - HA# 计算 HA'HA_prime = H @ A_prime# 计算分析步骤# (HA')(HA')^T + εε^TC = HA_prime @ HA_prime.T + eps @ eps.T# 计算分析增量X = A_prime @ HA_prime.T @ np.linalg.inv(C) @ D_prime# 更新集合A_a = ensemble + X# 计算分析场均值analysis = np.mean(A_a, axis=1).reshape(grid_x.shape)return analysis, A_a# 8. 执行同化
background_field = generate_background_field(true_field)
analysis_field, ensemble = enkf_data_assimilation(true_field, known_points, observed_temperatures)# 9. 计算RMSE
def calculate_rmse(reference, estimate):return np.sqrt(np.mean((reference - estimate)**2))rmse_background = calculate_rmse(true_field, background_field)
rmse_analysis = calculate_rmse(true_field, analysis_field)
improvement = ((rmse_background - rmse_analysis) / rmse_background) * 100# 10. 绘图
fig, axes = plt.subplots(1, 3, figsize=(18, 5))
titles = ['真 实 场', '背景场', '分析场']
fields = [true_field, background_field, analysis_field]for ax, field, title in zip(axes, fields, titles):im = ax.imshow(field, origin='lower', extent=[0, 100, 0, 100],cmap='RdBu_r', vmin=24, vmax=32)ax.scatter(known_points[:, 0], known_points[:, 1], c='black',marker='o', s=50, label='观测站')ax.set_title(title)ax.set_xlabel('X')ax.set_ylabel('Y')fig.colorbar(im, ax=ax)plt.tight_layout()
plt.show()print(f"背景场 RMSE: {rmse_background:.3f}°C")
print(f"分析场 RMSE: {rmse_analysis:.3f}°C")
print(f"改善程度: {improvement:.1f}%")

参考:

Evensen G. The ensemble Kalman filter: Theoretical formulation and practical implementation[J]. Ocean dynamics, 2003, 53: 343-367.

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

DeepSeek-V3 通俗详解:从诞生到优势,以及与 GPT-4o 的对比

1. DeepSeek 的前世今生 1.1 什么是 DeepSeek? DeepSeek 是一家专注于人工智能技术研发的公司,致力于打造高性能、低成本的 AI 模型。它的目标是让 AI 技术更加普惠,让更多人能够用上强大的 AI 工具。 1.2 DeepSeek-V3 的诞生 DeepSeek-V…

UI自动化测试保姆级教程--pytest详解(精简易懂)

欢迎来到啊妮莫的学习小屋 别让过去的悲伤,毁掉当下的快乐一《借东西的小人阿莉埃蒂》 简介 pytest是一个用于Python的测试框架, 支持简单的单元测试和复杂的功能测试. 和Python自带的UnitTest框架类似, 但是相比于UnitTest更加简洁, 效率更高. 特点 非常容易上手…

Javascript算法——贪心算法(一)

贪心算法详解(JavaScript)(局部最优->全局最优) 贪心算法(Greedy Algorithm)是一种在每一步选择中都采取当前状态下的最优选择(局部最优)的算法设计方法。通过局部最优解的累积&…

CK18——肝损伤无创诊断标志物

肝脏作为人体至关重要的代谢与解毒器官,极易遭受病毒、药物、酒精及不良饮食等多种因素的损害,进而引发一系列如非酒精性脂肪肝(NAFLD)、肝纤维化、肝硬化、肝细胞癌以及各类肝炎等病症。因此,确定一种高可靠性、非侵入…

.NET Core + Kafka 开发指南

什么是Kafka Apache Kafka是一个分布式流处理平台,由LinkedIn开发并开源,后来成为Apache软件基金会的顶级项目。Kafka主要用于构建实时数据管道和流式应用程序。 Kafka 架构 从下面3张架构图中可以看出Kafka Server 实际扮演的是Broker的角色, 一个Kafka Cluster由多个Bro…

[离线数仓] 总结二、Hive数仓分层开发

接 [离线数仓] 总结一、数据采集 5.8 数仓开发之ODS层 ODS层的设计要点如下: (1)ODS层的表结构设计依托于从业务系统同步过来的数据结构。 (2)ODS层要保存全部历史数据,故其压缩格式应选择压缩比率,较高的,此处选择gzip。 CompressedStorage - Apache Hive - Apac…

Unity3D仿星露谷物语开发19之库存栏丢弃及交互道具

1、目标 从库存栏中把道具拖到游戏场景中,库存栏中道具数相应做减法或者删除道具。同时在库存栏中可以交换两个道具的位置。 2、UIInventorySlot设置Raycast属性 在UIInventorySlot中,我们只希望最外层的UIInventorySlot响应Raycast,他下面…

阿里云代理商热销产品推荐

在数字化浪潮的推动下,企业对于云计算的依赖日益加深。阿里云,作为中国领先的云计算服务提供商,为企业提供了丰富多样的云产品和服务。本文将聚焦于阿里云代理商热销产品推荐,探讨其如何帮助企业高效利用云资源,加速数…

江科大STM32入门——IIC通信笔记总结

wx:嵌入式工程师成长日记 (一)简介 STM32内部集成了硬件I2C收发电路,可以由硬件自动执行时钟生成、起始终止条件生成、应答位收发、数据收发等功能,减轻CPU的负担 支持多主机 支持7位/10位地址模式 支持不同的通讯速…

MySQL安装,配置教程

一、Linux在线yum仓库安装 打开MySQL官方首页,链接为:https://www.mysql.com/ 界面如下: 在该页面中找到【DOWNOADS】选项卡,点击进入下载页面。 在下载界面中,可以看到不同版本的下载链接,这里选择【My…

四、VSCODE 使用GIT插件

VSCODE 使用GIT插件 一下载git插件与git Graph插件二、git插件使用三、文件提交到远程仓库四、git Graph插件 一下载git插件与git Graph插件 二、git插件使用 git插件一般VSCode自带了git,就是左边栏目的图标 在下载git软件后vscode的git插件会自动识别当前项目 …

消息队列MQ(二)

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 MQ学习笔记 前言一、发送者的可靠性1. 生产者重试机制2. 生产者确认机制3. 实现生产者确认 二、MQ的可靠性1. 数据持久化2. LazyQueue 前言 在用MQ实现异步调用时&#xff0…

数据分析思维(九):分析方法——AARRR模型分析方法

数据分析并非只是简单的数据分析工具三板斧——Excel、SQL、Python,更重要的是数据分析思维。没有数据分析思维和业务知识,就算拿到一堆数据,也不知道如何下手。 推荐书本《数据分析思维——分析方法和业务知识》,本文内容就是提取…

【计算机网络】课程 实验四 配置快速生成树协议(RSTP)

实验四 配置快速生成树协议(RSTP) 一、实验目的 1.理解快速生成树协议RSTP的工作原理。 2.掌握如何在交换机上配置快速生成树。 二、实验分析与设计 【背景描述】 某学校为了开展计算机教学和网络办公,建立了一个计…

Tauri教程-基础篇-第一节 Tauri项目创建及结构说明

“如果结果不如你所愿,就在尘埃落定前奋力一搏。”——《夏目友人帐》 “有些事不是看到了希望才去坚持,而是因为坚持才会看到希望。”——《十宗罪》 “维持现状意味着空耗你的努力和生命。”——纪伯伦 Tauri 技术教程 * 第四章 Tauri的基础教程 第一节…

pyinstaller冻结打包多进程程序的bug:无限创建进程直至系统崩溃

前面写过两篇相关的文章: PyQt应用程序打包Python自动按键 这两篇文章都没有提到下面的这个重要问题: 采用Pyinstaller冻结打包多进程程序时,必须非常小心。这个技术线在Windows上会有一个非常严重的Bug。直接运行打包后的程序会造成无限创…

网络安全-kail linux 网络配置(基础篇)

一、网络配置 1.查看网络IP地址, 我的kail:192.168.15.128 使用ifconfig查看kail网络连接情况,ip地址情况 又复制了一台kail计算机的IP地址。 再看一下windows本机:使用ipconfig进行查看: 再看一下虚拟机上的win7I…

uni app 写的 小游戏,文字拼图?文字拼写?不知道叫啥

从下方的偏旁部首中选在1--3个组成上面文章中的文字&#xff0c;完成的文字标红 不喜勿喷 《满江红》 其中用到了两个文件 strdata.json parameters.json 这两个文件太大 放到资源中了 资源文件 <template><view class"wenzi_page_main"><view c…

分享几个高清无水印国外视频素材网站

在数字内容创作日益盛行的今天&#xff0c;高质量的视频素材成为了视频制作、广告创意和多媒体项目中不可或缺的元素。对于追求专业水准的创作者而言&#xff0c;高清、无水印的视频素材是确保作品质量的基石。以下将分享几个优质的视频素材网站&#xff0c;为您的创作之路提供…

【LLM】大语言模型基础知识及主要类别架构

文章目录 LLM大语言模型1.LLM基础知识1.1大模型介绍:1.2语言模型1.21n-gram语言模型1.22神经网络语言模型1.23基于Transformer的预训练语言模型1.24大语言模型 1.3模型评估指标1.31 BLEU1.32 Rouge指标1.33 困惑度PPL 2.LLM主要类别架构2.1 自编码模型2.2 自回归模型2.3 Encode…