正交投影与内积空间:机器学习的几何基础
前言
本文隶属于专栏《机器学习数学通关指南》,该专栏为笔者原创,引用请注明来源,不足和错误之处请在评论区帮忙指出,谢谢!
本专栏目录结构和参考文献请见《机器学习数学通关指南》
正文
🔍 1. 内积空间的数学定义
1.1 代数定义 ✏️
两个维度相同的向量 a = [ a 1 , … , a n ] \mathbf{a} = [a_1, \dots, a_n] a=[a1,…,an] 和 b = [ b 1 , … , b n ] \mathbf{b} = [b_1, \dots, b_n] b=[b1,…,bn],其内积为:
a ⋅ b = ∑ i = 1 n a i b i \mathbf{a} \cdot \mathbf{b} = \sum_{i=1}^n a_i b_i a⋅b=∑i=1naibi
内积结果为标量,是后续投影和正交性的计算基础。在Python中可以这样实现:
import numpy as npa = np.array([1, 2, 3])
b = np.array([4, 5, 6])
dot_product = np.dot(a, b) # 或简写为 a.dot(b) 或 a @ b
print(f"内积结果: {dot_product}") # 输出: 内积结果: 32
1.2 几何定义 📐
从几何角度,向量 a \mathbf{a} a 与向量 b \mathbf{b} b 的内积为:
a ⋅ b = ∥ a ∥ ∥ b ∥ cos θ \mathbf{a} \cdot \mathbf{b} = \|\mathbf{a}\| \|\mathbf{b}\| \cos\theta a⋅b=∥a∥∥b∥cosθ
其中 θ \theta θ 是两个向量的夹角。这一性质直接关联到正交投影的计算,并表明:
- 当 θ = 90 ° \theta = 90° θ=90° 时,内积为0(正交向量)
- 当 θ = 0 ° \theta = 0° θ=0° 时,内积最大(同向向量)
- 当 θ = 180 ° \theta = 180° θ=180° 时,内积为负(反向向量)
🚀 2. 正交投影的核心思想
2.1 投影的物理意义 💡
向量 a \mathbf{a} a 在向量 b \mathbf{b} b 上的正交投影反映了前者在后者方向上的"影子长度"(即分解到该方向的分量):
投影长度 = ∥ a ∥ cos θ = a ⋅ b ∥ b ∥ \text{投影长度} = \|\mathbf{a}\| \cos\theta = \frac{\mathbf{a} \cdot \mathbf{b}}{\|\mathbf{b}\|} 投影长度=∥a∥cosθ=∥b∥a⋅b
投影向量则为:
投影向量 = a ⋅ b ∥ b ∥ 2 b \text{投影向量} = \frac{\mathbf{a} \cdot \mathbf{b}}{\|\mathbf{b}\|^2} \mathbf{b} 投影向量=∥b∥2a⋅bb
2.2 正交基与坐标表示 📊
在标准正交基下(如二维空间的基向量 e 1 , e 2 \mathbf{e}_1, \mathbf{e}_2 e1,e2),向量 v = [ v 1 , v 2 ] T \mathbf{v} = [v_1, v_2]^T v=[v1,v2]T 的坐标值实际上是其在基向量上的投影:
v 1 = v ⋅ e 1 , v 2 = v ⋅ e 2 v_1 = \mathbf{v} \cdot \mathbf{e}_1, \quad v_2 = \mathbf{v} \cdot \mathbf{e}_2 v1=v⋅e1,v2=v⋅e2
这揭示了一个重要概念:内积空间的坐标系本质上建立在投影关系上。
🧩 3. 正交基的构造方法(Gram-Schmidt过程)
3.1 算法步骤 🔄
Gram-Schmidt正交化是将一组线性无关向量转换为正交基(甚至标准正交基)的经典方法:
- 从第一个向量开始,标准化得到第一个正交基向量
- 计算下一个向量在已有正交基上的投影
- 从原向量中减去这些投影分量,得到正交分量
- 标准化正交分量得到新的正交基向量
- 重复步骤2-4直到处理完所有向量
3.2 二维空间实例实现 🔨
如何将非正交基 { a 1 , a 2 } \{\mathbf{a}_1, \mathbf{a}_2\} {a1,a2} 转化为正交基 { q 1 , q 2 } \{\mathbf{q}_1, \mathbf{q}_2\} {q1,q2}:
- 赋值 q 1 = a 1 ∥ a 1 ∥ \mathbf{q}_1 = \frac{\mathbf{a}_1}{\|\mathbf{a}_1\|} q1=∥a1∥a1
- 计算 a 2 \mathbf{a}_2 a2 到 q 1 \mathbf{q}_1 q1 的投影分量:
投影向量 = ( a 2 ⋅ q 1 ) q 1 \text{投影向量} = (\mathbf{a}_2 \cdot \mathbf{q}_1) \mathbf{q}_1 投影向量=(a2⋅q1)q1 - 去除投影分量后的正交向量:
v 2 = a 2 − ( a 2 ⋅ q 1 ) q 1 \mathbf{v}_2 = \mathbf{a}_2 - (\mathbf{a}_2 \cdot \mathbf{q}_1) \mathbf{q}_1 v2=a2−(a2⋅q1)q1 - 标准化得:
q 2 = v 2 ∥ v 2 ∥ \mathbf{q}_2 = \frac{\mathbf{v}_2}{\|\mathbf{v}_2\|} q2=∥v2∥v2
生成的 { q 1 , q 2 } \{\mathbf{q}_1, \mathbf{q}_2\} {q1,q2} 是标准正交基。
Python实现 🐍
def gram_schmidt(vectors):"""将一组线性无关向量正交化"""basis = []for v in vectors:w = v.copy() # 从原始向量开始for b in basis:# 减去在已有基向量上的投影w = w - np.dot(w, b) / np.dot(b, b) * b# 如果剩余向量不为零,则标准化并添加到基向量集if np.linalg.norm(w) > 1e-10:basis.append(w / np.linalg.norm(w))return np.array(basis)# 示例
vectors = np.array([[1, 1], [1, 0]])
orthonormal_basis = gram_schmidt(vectors)
print("正交基:\n", orthonormal_basis)# 验证正交性
dot_product = np.dot(orthonormal_basis[0], orthonormal_basis)
print(f"内积结果(应接近0): {dot_product:.10f}")
🔬 4. 正交投影与矩阵表示
4.1 矩阵向量乘法的几何解释 📈
在标准正交基下,向量 v \mathbf{v} v 的坐标可表示为:
v 投影 = [ v ⋅ e 1 v ⋅ e 2 ] \mathbf{v}_{\text{投影}} = \begin{bmatrix} \mathbf{v} \cdot \mathbf{e}_1 \\ \mathbf{v} \cdot \mathbf{e}_2 \end{bmatrix} v投影=[v⋅e1v⋅e2]
它等价于基向量组成的变换矩阵 Q = [ e 1 e 2 ] \mathbf{Q} = [\mathbf{e}_1 \quad \mathbf{e}_2] Q=[e1e2] 的转置与向量的乘积:
v 投影 = Q T v \mathbf{v}_{\text{投影}} = \mathbf{Q}^T \mathbf{v} v投影=QTv
4.2 投影矩阵 🔄
向量 v \mathbf{v} v 投影到子空间 W W W 上的投影矩阵为:
P W = Q ( Q T Q ) − 1 Q T \mathbf{P}_W = \mathbf{Q}(\mathbf{Q}^T\mathbf{Q})^{-1}\mathbf{Q}^T PW=Q(QTQ)−1QT
当 Q \mathbf{Q} Q 是标准正交基时,简化为:
P W = Q Q T \mathbf{P}_W = \mathbf{Q}\mathbf{Q}^T PW=QQT
🌟 5. 机器学习中的应用实例
5.1 主成分分析 (PCA) 🧠
PCA是最常见的降维技术,其核心就是寻找数据最大方差方向的正交基,并在该基上投影:
import numpy as np
import matplotlib.pyplot as plt
from sklearn.decomposition import PCA# 生成有相关性的二维数据
np.random.seed(42)
cov = [[2, 1.5], [1.5, 1]]
data = np.random.multivariate_normal([0, 0], cov, 500)# 应用PCA
pca = PCA(n_components=2)
pca.fit(data)
transformed = pca.transform(data)# 可视化
plt.figure(figsize=(12, 5))# 原始数据
plt.subplot(1, 2, 1)
plt.scatter(data[:, 0], data[:, 1], alpha=0.5)
plt.title('原始数据')
plt.grid(True)# PCA转换后的数据
plt.subplot(1, 2, 2)
plt.scatter(transformed[:, 0], transformed[:, 1], alpha=0.5)
for i, (comp, var) in enumerate(zip(pca.components_, pca.explained_variance_)):plt.quiver(0, 0, comp[0], comp, scale=var*3, color='r',label=f'PC{i+1}: {var:.2f}')
plt.title('PCA转换后数据')
plt.grid(True)
plt.legend()plt.tight_layout()
plt.show()print(f"主成分方差比例: {pca.explained_variance_ratio_}")
print(f"主成分方向: {pca.components_}")
5.2 QR分解与矩阵求解 🧮
QR分解是Gram-Schmidt正交化的矩阵形式,广泛用于线性方程组求解和最小二乘法问题:
import numpy as np# 用于求解线性方程组 Ax = b
A = np.array([[2, 1], [1, 3]])
b = np.array([5, 4])# QR分解
Q, R = np.linalg.qr(A)# 求解方程 Rx = Q^T b
y = Q.T @ b
x = np.linalg.solve(R, y)print("QR分解求解的解: ", x)
print("直接求解的解: ", np.linalg.solve(A, b))
print("误差: ", np.linalg.norm(A @ x - b))
5.3 核方法与支持向量机 🔍
在支持向量机(SVM)中,核函数实质上定义了特征空间中的内积,使我们能在高维空间中执行计算而无需显式映射:
from sklearn import svm
from sklearn.datasets import make_circles
from sklearn.model_selection import train_test_split
import numpy as np
import matplotlib.pyplot as plt# 生成非线性可分数据
X, y = make_circles(n_samples=500, noise=0.1, factor=0.3, random_state=42)# 分割数据集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)# 训练RBF核SVM(本质是在高维空间中寻找正交超平面)
clf = svm.SVC(kernel='rbf', gamma=10)
clf.fit(X_train, y_train)# 预测与评估
accuracy = clf.score(X_test, y_test)# 绘制决策边界
h = 0.02
x_min, x_max = X[:, 0].min() - 0.1, X[:, 0].max() + 0.1
y_min, y_max = X[:, 1].min() - 0.1, X[:, 1].max() + 0.1
xx, yy = np.meshgrid(np.arange(x_min, x_max, h),np.arange(y_min, y_max, h))
Z = clf.predict(np.c_[xx.ravel(), yy.ravel()])
Z = Z.reshape(xx.shape)plt.figure(figsize=(8, 6))
plt.contourf(xx, yy, Z, alpha=0.3, cmap=plt.cm.Paired)
plt.scatter(X[:, 0], X[:, 1], c=y, edgecolors='k', cmap=plt.cm.Paired)
plt.scatter(clf.support_vectors_[:, 0], clf.support_vectors_[:, 1],s=80, facecolors='none', edgecolors='k')
plt.title(f'RBF核SVM (准确率: {accuracy:.2f})')
plt.xlabel('特征1')
plt.ylabel('特征2')
plt.tight_layout()
plt.show()
5.4 正交化在神经网络中的应用 🧠
正交初始化和正交约束可以提高神经网络的训练稳定性和泛化能力:
import torch
import torch.nn as nn
import numpy as npclass OrthogonalRegularization(nn.Module):"""实现权重正交化的正则项"""def __init__(self):super(OrthogonalRegularization, self).__init__()def forward(self, model, strength=1e-4):reg_loss = 0.0for name, param in model.named_parameters():if 'weight' in name:if param.ndimension() > 1:# 计算 WW^T - I 的范数,鼓励权重矩阵正交mat = param.view(param.shape[0], -1)sym = torch.mm(mat, mat.t())sym -= torch.eye(sym.shape[0]).to(param.device)reg_loss += torch.sum(sym * sym)return strength * reg_loss# 在训练循环中使用:
optimizer.zero_grad()
outputs = model(inputs)
loss = criterion(outputs, labels) + ortho_reg(model)
loss.backward()
optimizer.step()
🧮 6. 正交投影和内积空间的进阶应用
6.1 最小二乘法与线性回归 📊
最小二乘法是机器学习中最基础的模型之一,其解可以通过正交投影来理解:
β ^ = ( X T X ) − 1 X T y \hat{\beta} = (X^TX)^{-1}X^Ty β^=(XTX)−1XTy
这个公式本质上是将目标向量 y y y 投影到 X X X 的列空间上:
import numpy as np
import matplotlib.pyplot as plt
from sklearn.linear_model import LinearRegression# 生成带噪声的线性数据
np.random.seed(42)
X = 2 * np.random.rand(100, 1)
y = 3 * X.squeeze() + 2 + np.random.randn(100) * 0.5# 正交投影方法(手动实现最小二乘)
X_b = np.c_[np.ones((100, 1)), X] # 添加偏置项
theta_best = np.linalg.inv(X_b.T @ X_b) @ X_b.T @ y
print(f"手动计算的系数: {theta_best}")# 使用sklearn实现
reg = LinearRegression()
reg.fit(X, y)
print(f"sklearn系数: [{reg.intercept_}, {reg.coef_[0]}]")# 绘制结果
plt.figure(figsize=(10, 6))
plt.scatter(X, y, alpha=0.7)
X_test = np.array([[0], ])
X_test_b = np.c_[np.ones((2, 1)), X_test]
y_pred = X_test_b @ theta_best
plt.plot(X_test, y_pred, 'r-', linewidth=2, label='预测线')
plt.xlabel('X')
plt.ylabel('y')
plt.title('通过正交投影实现的最小二乘法')
plt.grid(True)
plt.legend()
plt.show()
6.2 特征值分解与谱理论 🔮
正交性在特征值分解中表现为正交特征向量,这是许多算法的理论基础:
import numpy as np
import matplotlib.pyplot as plt# 创建一个对称矩阵
A = np.array([[4, 2], [2, 3]])# 特征值分解
eigenvalues, eigenvectors = np.linalg.eig(A)
print("特征值:", eigenvalues)
print("特征向量:\n", eigenvectors)# 验证正交性
dot_product = np.dot(eigenvectors[:, 0], eigenvectors[:, 1])
print(f"特征向量内积(应接近0): {dot_product:.10f}")# 验证 Av = λv
for i in range(len(eigenvalues)):v = eigenvectors[:, i]lhs = A @ vrhs = eigenvalues[i] * vprint(f"特征向量{i+1}的验证误差: {np.linalg.norm(lhs - rhs):.10f}")# 可视化
plt.figure(figsize=(7, 7))
plt.axhline(y=0, color='k', linestyle='-', alpha=0.3)
plt.axvline(x=0, color='k', linestyle='-', alpha=0.3)
plt.grid(alpha=0.3)# 绘制原始矩阵的作用
for i in range(-2, 3):for j in range(-2, 3):v = np.array([i, j]) * 0.5Av = A @ vplt.arrow(v[0], v, Av[0]-v[0], Av-v, head_width=0.1, head_length=0.2, fc='b', ec='b', alpha=0.3)# 绘制特征向量
colors = ['red', 'green']
for i in range(len(eigenvalues)):v = eigenvectors[:, i] * eigenvalues[i]plt.arrow(0, 0, v[0], v, head_width=0.2, head_length=0.3, fc=colors[i], ec=colors[i], label=f'特征向量{i+1} (λ={eigenvalues[i]:.2f})')plt.xlim(-4, 4)
plt.ylim(-4, 4)
plt.title('特征向量与矩阵变换')
plt.legend()
plt.axis('equal')
plt.show()
📝 7. 总结与思考
7.1 核心概念回顾 💭
- 内积空间提供了计算向量长度、角度和投影的统一框架
- 正交性是向量空间中最重要的几何关系之一,表示两个方向完全独立
- 正交投影允许我们将向量分解为互相独立的分量
- Gram-Schmidt过程构造了线性无关向量集的正交基
- 投影矩阵以矩阵形式表达投影操作,为线性代数提供几何解释
7.2 机器学习中的价值 🌱
内积空间和正交投影在机器学习中至关重要,因为它们:
- 简化计算:正交基使得矩阵运算和问题分解更加高效
- 增强解释性:正交特征往往具有更好的解释性和独立含义
- 避免过拟合:特征正交化减少了冗余信息,有助于泛化
- 启发算法设计:从PCA到深度学习中的正交初始化,正交性启发了众多算法改进
相关文章:

正交投影与内积空间:机器学习的几何基础
前言 本文隶属于专栏《机器学习数学通关指南》,该专栏为笔者原创,引用请注明来源,不足和错误之处请在评论区帮忙指出,谢谢! 本专栏目录结构和参考文献请见《机器学习数学通关指南》 正文 🔍 1. 内积空间的…...

Qt中txt文件输出为PDF格式
main.cpp PdfReportGenerator pdfReportGenerator;// 加载中文字体if (QFontDatabase::addApplicationFont(":/new/prefix1/simsun.ttf") -1) {QMessageBox::warning(nullptr, "警告", "无法加载中文字体");}// 解析日志文件QVector<LogEntr…...

《HelloGitHub》第 107 期
兴趣是最好的老师,HelloGitHub 让你对编程感兴趣! 简介 HelloGitHub 分享 GitHub 上有趣、入门级的开源项目。 github.com/521xueweihan/HelloGitHub 这里有实战项目、入门教程、黑科技、开源书籍、大厂开源项目等,涵盖多种编程语言 Python、…...
Langchain解锁LLM大语言模型的结构化输出能力(多种实现方案)
在 LangChain解锁LLM大语言模型的结构化输出能力:调用 with_structured_output() 方法 这篇博客中,我们了解了格式化LLM输出内容的必要性以及如何通过调用langchain框架中提供的 with_structured_output() 方法对LLM输出进行格式化(三种可选方…...

AI数据分析:deepseek生成SQL
在当今数据驱动的时代,数据分析已成为企业和个人决策的重要工具。随着人工智能技术的快速发展,AI 驱动的数据分析工具正在改变我们处理和分析数据的方式。本文将着重介绍如何使用 DeepSeek 进行自动补全SQL 查询语句。 我们都知道,SQL 查询语…...
力扣-动态规划-115 不同子序列
思路 dp数组定义:0_i-1的字符串中有0_j-1的字符串有dp[i][j]个递推公式: if(s[i-1] t[j-1]){dp[i][j] dp[i-1][j-1] dp[i-1][j]; }else{dp[i][j] dp[i-1][j]; } 在该元素相同时,有两种可能1:使用该元素,所以0_i-2…...

Qt C++ 开发 动态上下页按钮实现
项目开发,想实现动态的显示按钮,考虑使用QStackedWidget做两个页面去切换。 首先,我们使用Qt ui 画出两个QStackedWidget的两个页面 要实现切换,我们只需要调用stackedWidget->setCurrentIndex(index)就行。 那么如何自动调…...

数据结构第五节:排序
1.常见的排序算法 插入排序:直接插入排序、希尔排序 选择排序:直接选择排序、堆排序 交换排序:冒泡排序、快速排序 归并排序:归并排序 排序的接口实现: // 1. 直接插入排序 void InsertSort(int* a, int n); // 2. 希…...

从文件到块: 提高 Hugging Face 存储效率
Hugging Face 在Git LFS 仓库中存储了超过30 PB 的模型、数据集和 Spaces。由于 Git 在文件级别进行存储和版本控制,任何文件的修改都需要重新上传整个文件。这在 Hub 上会产生高昂的成本,因为平均每个 Parquet 和 CSV 文件大小在 200-300 MB 之间&#…...
Android14 串口控制是能wifi adb实现简介
Android14 串口控制是能wifi adb实现简介 一、前言 文章目录 Android14 串口控制是能wifi adb实现简介一、前言二、Android14 串口控制是能wifi adb实现1、设置prop属性命令开启adb(1)相关prop属性设置(2)在设置界面或者 ifconfi…...
vue3中 组合式~测试深入组件:事件 与 $emit()
一、语法(props) 第一步:在组件模板表达式中,可以直接用$emit()方法触发自定义事件, <!-- MyComponent --> <button click"$emit(someEvent)">Click Me</button> 第二步父组件可以通过 v-on (缩写为 ) 来监听…...

SQL-labs13-16闯关记录
http://127.0.0.1/sqli-labs/less-13/ 基于POST单引号双注入变形 1,依然是一个登录框,POST型SQL注入 2,挂上burpsuite,然后抓取请求,构造请求判断漏洞类型和闭合条件 admin 发生了报错,根据提示闭合方式是(…...

基于微信小程序的停车场管理系统的设计与实现
第1章 绪论 1.1 课题背景 随着移动互联形式的不断发展,各行各业都在摸索移动互联对本行业的改变,不断的尝试开发出适合于本行业或者本公司的APP。但是这样一来用户的手机上就需要安装各种软件,但是APP作为一个只为某个公司服务的一个软件&a…...

DAIR-V2X-R数据集服务器下载
【官方github链接】https://github.com/ylwhxht/V2X-R 点击并登录 选择并点击下载 浏览器弹窗,右键选择复制下载链接 ------------------------------------服务器下载----------------------------------------- 登录服务器,选在要下载的文件夹复制路…...

table 拖拽移动
表格拖拽 Sortable.js中文网|配置 <!-- 教务处 --><template><div class"but"><el-button click"mergeAndPrintArrays()" type"primary">保存数据</el-button><el-button click"restoration()" t…...
Linux使用笔记:Find Tree 命令
Tree 命令的使用 使用-I 参数,过滤掉不想展未的目录或文件使用-L参数,指定展示的目录层级个数 arsenaltxzq1899:~/Workspace/vue-application$ tree -I node_modules/ -I public/ -L 2 . ├── components.json ├── Dockerfile ├── ecosystem.c…...

数据结构入门篇——什么是数据结构。
一、引入 工具是一种什么东西呢?是一种转化媒介,我们需要熟食,我们要通过用火来将生肉烤熟。在这个过程中。我们要输入一个东西——生肉,通过工具——火的加工,从而得到我们的目的产物——熟肉。 将上面的例子和红字部…...

MySQL-简介与基本命令
数据库 主流数据库 关系型数据库 MySQL:开源免费的关系型数据库,易于使用和学习,支持大型企业级应用。其特点包括高性能、可靠性和可扩展性,支持多种编程语言和操作系统,拥有大量的社区支持和插件SQLite:…...

汽车材料耐候性测试仪器-太阳光模拟器介绍
**太阳光模拟器**是一种用于模拟太阳光谱的设备,广泛应用于汽车材料的耐候性测试。通过模拟太阳光中的紫外线、可见光和红外线,评估材料在长期光照下的性能变化。 主要组成部分 1. **光源系统**: - **氙灯**:最常用的光源&…...

音频3A测试--AEC(回声消除)测试
一、测试前期准备 一台录制电脑:用于作为近段音源和收集远端处理后的数据; 一台测试设备B:用于测试AEC的设备; 一个高保真音响:用于播放设备B的讲话; 一台播放电脑:用于模拟设备A讲话,和模拟设备B讲话; 一台音频处理器(调音台):用于录制和播放数据; 测试使用转接线若…...

CTF show Web 红包题第六弹
提示 1.不是SQL注入 2.需要找关键源码 思路 进入页面发现是一个登录框,很难让人不联想到SQL注入,但提示都说了不是SQL注入,所以就不往这方面想了 先查看一下网页源码,发现一段JavaScript代码,有一个关键类ctfs…...

《Qt C++ 与 OpenCV:解锁视频播放程序设计的奥秘》
引言:探索视频播放程序设计之旅 在当今数字化时代,多媒体应用已渗透到我们生活的方方面面,从日常的视频娱乐到专业的视频监控、视频会议系统,视频播放程序作为多媒体应用的核心组成部分,扮演着至关重要的角色。无论是在个人电脑、移动设备还是智能电视等平台上,用户都期望…...

React第五十七节 Router中RouterProvider使用详解及注意事项
前言 在 React Router v6.4 中,RouterProvider 是一个核心组件,用于提供基于数据路由(data routers)的新型路由方案。 它替代了传统的 <BrowserRouter>,支持更强大的数据加载和操作功能(如 loader 和…...

基于uniapp+WebSocket实现聊天对话、消息监听、消息推送、聊天室等功能,多端兼容
基于 UniApp + WebSocket实现多端兼容的实时通讯系统,涵盖WebSocket连接建立、消息收发机制、多端兼容性配置、消息实时监听等功能,适配微信小程序、H5、Android、iOS等终端 目录 技术选型分析WebSocket协议优势UniApp跨平台特性WebSocket 基础实现连接管理消息收发连接…...

【CSS position 属性】static、relative、fixed、absolute 、sticky详细介绍,多层嵌套定位示例
文章目录 ★ position 的五种类型及基本用法 ★ 一、position 属性概述 二、position 的五种类型详解(初学者版) 1. static(默认值) 2. relative(相对定位) 3. absolute(绝对定位) 4. fixed(固定定位) 5. sticky(粘性定位) 三、定位元素的层级关系(z-i…...
质量体系的重要
质量体系是为确保产品、服务或过程质量满足规定要求,由相互关联的要素构成的有机整体。其核心内容可归纳为以下五个方面: 🏛️ 一、组织架构与职责 质量体系明确组织内各部门、岗位的职责与权限,形成层级清晰的管理网络…...
【服务器压力测试】本地PC电脑作为服务器运行时出现卡顿和资源紧张(Windows/Linux)
要让本地PC电脑作为服务器运行时出现卡顿和资源紧张的情况,可以通过以下几种方式模拟或触发: 1. 增加CPU负载 运行大量计算密集型任务,例如: 使用多线程循环执行复杂计算(如数学运算、加密解密等)。运行图…...

如何在最短时间内提升打ctf(web)的水平?
刚刚刷完2遍 bugku 的 web 题,前来答题。 每个人对刷题理解是不同,有的人是看了writeup就等于刷了,有的人是收藏了writeup就等于刷了,有的人是跟着writeup做了一遍就等于刷了,还有的人是独立思考做了一遍就等于刷了。…...
第7篇:中间件全链路监控与 SQL 性能分析实践
7.1 章节导读 在构建数据库中间件的过程中,可观测性 和 性能分析 是保障系统稳定性与可维护性的核心能力。 特别是在复杂分布式场景中,必须做到: 🔍 追踪每一条 SQL 的生命周期(从入口到数据库执行)&#…...
深入理解Optional:处理空指针异常
1. 使用Optional处理可能为空的集合 在Java开发中,集合判空是一个常见但容易出错的场景。传统方式虽然可行,但存在一些潜在问题: // 传统判空方式 if (!CollectionUtils.isEmpty(userInfoList)) {for (UserInfo userInfo : userInfoList) {…...