【人工智能数学基础篇】——深入详解矩阵分解:奇异值分解(SVD)与主成分分析(PCA)在数据降维与特征提取中的应用
目录
1. 引言
2. 矩阵分解概述
2.1 矩阵分解的意义
3. 奇异值分解(SVD)
3.1 定义与数学基础
3.2 SVD 的性质
3.3 SVD 在数据降维中的应用
3.4 示例代码:使用 SVD 进行图像压缩
3.5 结果分析
4. 主成分分析(PCA)
4.1 定义与数学基础
4.2 PCA 与协方差矩阵
4.3 PCA 与 SVD 的关系
4.4 PCA 在特征提取中的应用
4.5 示例代码:使用 PCA 进行手写数字分类
4.6 结果分析
5. SVD 与 PCA 的比较
6. 其他矩阵分解方法简介
6.1 LU分解
6.2 QR分解
6.3 非负矩阵分解(NMF)
6.4 矩阵近似
7. 实践中的注意事项
7.1 数据预处理
7.2 选择适当的 \( k \) 值
7.3 处理高维稀疏数据
7.4 评估降维效果
7.5 扩展方法
8. 结论
9. 参考资料
1. 引言
在现代数据分析与机器学习领域,数据的维度通常非常高,这不仅增加了计算复杂度,还可能导致“维度灾难”(Curse of Dimensionality)。为了高效处理和理解高维数据,数据降维与特征提取技术显得尤为重要。矩阵分解作为一种强大的数学工具,在数据降维与特征提取中扮演着关键角色。本文将深入探讨两种经典的矩阵分解方法——奇异值分解(Singular Value Decomposition, SVD)和主成分分析(Principal Component Analysis, PCA),并详细介绍它们在数据降维和特征提取中的应用与实现。
2. 矩阵分解概述
矩阵分解是将一个复杂的矩阵表示为多个简单矩阵的乘积。不同的分解方法适用于不同的应用场景,能够揭示矩阵的内在结构和特征。常见的矩阵分解方法包括LU分解、QR分解、特征值分解、奇异值分解(SVD)和主成分分析(PCA)等。本文将重点介绍SVD和PCA,并阐述它们在数据降维和特征提取中的应用。
2.1 矩阵分解的意义
降维:通过减少数据的维度,可以降低计算复杂度,减少存储空间,提高算法的效率。
特征提取:提取数据中的主要特征,有助于发现数据的潜在模式和结构。
数据压缩:利用矩阵分解的低秩近似,实现对数据的有效压缩。
噪声过滤:通过保留主要成分,去除数据中的噪声,提高数据的质量。
3. 奇异值分解(SVD)
3.1 定义与数学基础
奇异值分解(Singular Value Decomposition, SVD)是线性代数中一种重要的矩阵分解方法。它将任意形状的矩阵分解为三个特定矩阵的乘积,揭示了原矩阵的许多重要性质。
定义:给定一个任意的 \( m \times n \) 矩阵 \( A \),其奇异值分解为:
\[
A = U \Sigma V^T
\]
其中:
\( U \) 是一个 \( m \times m \) 的正交矩阵,称为左奇异向量矩阵。
\( \Sigma \) 是一个 \( m \times n \) 的对角矩阵,其对角线元素为奇异值,按降序排列。
\( V \) 是一个 \( n \times n \) 的正交矩阵,称为右奇异向量矩阵。
\( V^T \) 表示 \( V \) 的转置。
3.2 SVD 的性质
1. 正交性:矩阵 \( U \) 和 \( V \) 都是正交矩阵,即 \( U^T U = I \) 和 \( V^T V = I \)。
2. 奇异值性质:奇异值 \( \sigma_i \) 满足 \( \sigma_1 \geq \sigma_2 \geq \dots \geq \sigma_p \geq 0 \),其中 \( p = \min(m, n) \)。
3. 稀疏性:原矩阵的秩等于非零奇异值的数量。
4. 最低误差近似:截断的 SVD 提供了最佳的低秩近似,即对于给定的 \( k \),通过保留最大的 \( k \) 个奇异值及对应的奇异向量,可以得到最小的误差近似。
3.3 SVD 在数据降维中的应用
奇异值分解在数据降维中的主要应用包括:
数据压缩:利用低秩近似减少数据的存储空间。
降噪:通过去除较小的奇异值,过滤掉数据中的噪声。
特征提取:提取数据的主要特征,用于后续的机器学习算法。
3.4 示例代码:使用 SVD 进行图像压缩
以下是一个使用 Python 和 NumPy 实现 SVD 图像压缩的示例。我们将对一张灰度图像进行 SVD 分解,并通过保留前 \( k \) 个奇异值实现图像的压缩与重构。
import numpy as np
import matplotlib.pyplot as plt
from PIL import Imagedef load_image(image_path):"""加载灰度图像并转换为 NumPy 数组"""img = Image.open(image_path).convert('L') # 转为灰度图return np.array(img, dtype=np.float64)def svd_compression(image_matrix, k):"""对图像矩阵进行 SVD 分解,并保留前 k 个奇异值进行重构"""U, S, VT = np.linalg.svd(image_matrix, full_matrices=False)S_k = np.diag(S[:k])U_k = U[:, :k]VT_k = VT[:k, :]compressed_matrix = np.dot(U_k, np.dot(S_k, VT_k))return compressed_matrixdef plot_images(original, compressed, k):"""绘制原始图像和压缩后图像的比较"""plt.figure(figsize=(10, 5))plt.suptitle(f'SVD Compression with k={k}')plt.subplot(1, 2, 1)plt.imshow(original, cmap='gray')plt.title('Original Image')plt.axis('off')plt.subplot(1, 2, 2)plt.imshow(compressed, cmap='gray')plt.title(f'Compressed Image\nk={k}')plt.axis('off')plt.show()def main():image_path = 'path_to_grayscale_image.jpg' # 替换为你的图像路径original_image = load_image(image_path)ks = [5, 20, 50, 100] # 不同的 k 值for k in ks:compressed_image = svd_compression(original_image, k)plot_images(original_image, compressed_image, k)if __name__ == "__main__":main()
代码说明:
1. 加载图像:
使用 `PIL` 库加载图像,并将其转换为灰度图像。
将图像转换为 NumPy 数组,数据类型为 `float64` 以提高计算精度。2. SVD 压缩:
对图像矩阵进行奇异值分解,得到 \( U \)、\( S \) 和 \( VT \)。
选择前 \( k \) 个奇异值及对应的奇异向量,构建低秩近似矩阵。
通过矩阵乘法重构压缩后的图像矩阵。3. 绘图展示:
使用 `matplotlib` 绘制原始图像和压缩后图像的对比。
通过不同的 \( k \) 值展示压缩效果与质量的权衡。
3.5 结果分析
通过调整 \( k \) 值,可以观察到图像压缩的效果。较小的 \( k \) 值会导致图像失真较严重,但压缩率较高;较大的 \( k \) 值则保留更多的细节信息,但压缩率降低。选择合适的 \( k \) 值需要在压缩效率和图像质量之间进行权衡。
4. 主成分分析(PCA)
4.1 定义与数学基础
主成分分析(Principal Component Analysis, PCA)是一种经典的统计方法,用于将高维数据投影到低维空间,同时尽可能保留数据的主要变异信息。PCA通过线性变换找到数据中的主成分(主轴),这些主轴是数据方差最大的方向,彼此正交。
定义:给定一个 \( n \times p \) 的数据矩阵 \( X \)(其中 \( n \) 为样本数量,\( p \) 为特征数量),PCA的目标是找到一个 \( p \times k \) 的转换矩阵 \( W \),将数据映射到 \( k \) 维空间:
\[
Y = XW
\]
其中,\( Y \) 是降维后的 \( n \times k \) 数据矩阵。
4.2 PCA 与协方差矩阵
PCA 通过最大化数据在新坐标系下的方差来寻找主成分,这可以转化为求解协方差矩阵的特征值和特征向量的问题。
1. 数据中心化:首先对数据进行中心化处理,即减去每个特征的均值,使得数据的均值为零。
2. 协方差矩阵:计算中心化后数据的协方差矩阵 \( C \):
\[
C = \frac{1}{n-1} X^T X
\]
3. 特征值分解:对协方差矩阵进行特征值分解,得到特征值和对应的特征向量。
4. 选择主成分:选取前 \( k \) 个最大的特征值所对应的特征向量,组成转换矩阵 \( W \)。
4.3 PCA 与 SVD 的关系
PCA 和 SVD 在数学上密切相关。事实上,PCA 可以通过 SVD 直接计算实现,无需显式计算协方差矩阵。
具体来说,假设 \( X \) 是经过中心化的数据矩阵,则:
\[
X = U \Sigma V^T
\]
其中,\( V \) 的列向量就是协方差矩阵的特征向量,且相应的奇异值 \( \sigma_i \) 满足:
\[
\lambda_i = \frac{\sigma_i^2}{n-1}
\]
因此,PCA 的主成分可以通过 SVD 直接获得。
4.4 PCA 在特征提取中的应用
PCA 在特征提取中的主要应用包括:
数据降维:减少特征数量,降低存储和计算成本。
去噪:通过保留主要成分,去除数据中的噪声。
可视化:将高维数据投影到2D或3D空间,便于可视化和理解数据结构。
特征提取:提取数据的主要变异方向,作为后续机器学习算法的输入。
4.5 示例代码:使用 PCA 进行手写数字分类
以下是一个使用 Python 和 scikit-learn 实现 PCA 进行手写数字分类的示例。我们将对 MNIST 数据集应用 PCA 进行降维,并使用降维后的特征进行分类。
import numpy as np
import matplotlib.pyplot as plt
from sklearn.decomposition import PCA
from sklearn.datasets import load_digits
from sklearn.model_selection import train_test_split
from sklearn.svm import SVC
from sklearn.metrics import classification_report, accuracy_scoredef load_data():"""加载手写数字数据集"""digits = load_digits()X = digits.datay = digits.targetreturn X, y, digits.imagesdef plot_digits(images, labels, n_row=2, n_col=5):"""绘制数字图像"""plt.figure(figsize=(n_col, n_row))for index, (image, label) in enumerate(zip(images, labels)):plt.subplot(n_row, n_col, index + 1)plt.imshow(image, cmap='gray')plt.title(f'Label: {label}')plt.axis('off')plt.show()def apply_pca(X_train, X_test, n_components=0.95):"""对数据应用 PCA,保留 95% 的方差"""pca = PCA(n_components=n_components, whiten=True, random_state=42)X_train_pca = pca.fit_transform(X_train)X_test_pca = pca.transform(X_test)print(f'Original number of features: {X_train.shape[1]}')print(f'Reduced number of features after PCA: {X_train_pca.shape[1]}')return X_train_pca, X_test_pca, pcadef classify(X_train, y_train, X_test, y_test):"""使用支持向量机(SVM)进行分类"""clf = SVC(kernel='rbf', class_weight='balanced', random_state=42)clf.fit(X_train, y_train)y_pred = clf.predict(X_test)acc = accuracy_score(y_test, y_pred)print(f'Classification Accuracy: {acc:.4f}')print('Classification Report:')print(classification_report(y_test, y_pred))return clfdef main():# 加载数据X, y, images = load_data()# 可视化部分样本plot_digits(images[:10], y[:10], n_row=2, n_col=5)# 划分训练集和测试集X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42, stratify=y)# 应用 PCA 进行降维X_train_pca, X_test_pca, pca = apply_pca(X_train, X_test, n_components=0.95)# 使用 SVM 进行分类classifier = classify(X_train_pca, y_train, X_test_pca, y_test)# 可视化降维后的数据(前两个主成分)plt.figure(figsize=(8,6))scatter = plt.scatter(X_train_pca[:, 0], X_train_pca[:, 1], c=y_train, cmap='viridis', alpha=0.5)plt.legend(*scatter.legend_elements(), title="Classes")plt.xlabel('Principal Component 1')plt.ylabel('Principal Component 2')plt.title('PCA of MNIST Dataset')plt.show()if __name__ == "__main__":main()
代码说明:
1. 数据加载与可视化:
使用 `sklearn.datasets` 加载手写数字数据集(8x8灰度图像)。
可视化部分样本图像,帮助理解数据结构。2. 数据划分:
将数据集划分为训练集和测试集,保持类别分布的一致性(`stratify=y`)。3. PCA 降维:
使用 scikit-learn 的 `PCA` 类,对训练数据进行降维,保留 95% 的方差。
`whiten=True` 对数据进行白化处理,使得各主成分具有相同的方差。
输出降维前后的特征数量。4. 分类器训练与评估:
使用支持向量机(SVM)进行分类。
训练、预测并评估分类器的性能,输出准确率和分类报告。5. 降维结果可视化:
可视化前两个主成分,展示数据在主成分空间中的分布。
4.6 结果分析
通过 PCA 的降维,可以显著减少特征数量,同时保持数据的大部分变异信息。使用 SVM 进行分类,往往能够在降维后的特征上取得较好的性能,同时提高计算效率。可视化降维后的数据有助于理解数据的聚类结构和类别分布。
5. SVD 与 PCA 的比较
虽然 SVD 和 PCA 都是矩阵分解方法,并且在许多应用中可以互相替代,但它们在概念和应用上还是存在一些区别。
| 特性 | SVD(奇异值分解) | PCA(主成分分析) |
|---|---|---|
| 定义 | 矩阵的奇异值分解,将矩阵分解为 \( U \Sigma V^T \) | 统计方法,通过线性变换找到数据中的主成分 |
| 应用范围 | 通用矩阵分解方法,适用于任意形状的矩阵 | 专用于数据降维和特征提取,通常在统计分析和机器学习中使用 |
| 数学基础 | 线性代数中的矩阵分解方法 | 统计学中的方差最大化方法,与协方差矩阵密切相关 |
| 与协方差矩阵的关系 | 无直接关系,除非特定应用下(如在计算PCA时使用SVD) | 直接基于协方差矩阵,通过特征值分解或SVD来计算主成分 |
| 输出解释 | 左奇异向量、奇异值、右奇异向量 | 主成分向量、解释方差 |
| 计算复杂度 | 较高,尤其对于大规模矩阵 | 计算PCA时通常需先计算协方差矩阵,复杂度与SVD相似 |
总结:
SVD是一种通用的矩阵分解工具,在信号处理、图像压缩、推荐系统等多个领域有广泛应用。
PCA 是基于 SVD 的特例,专注于数据降维和特征提取,通过最大化数据方差来寻找主成分,广泛应用于统计分析和机器学习。
在实际应用中,PCA 通常通过 SVD 实现,但聚焦于特定的目的(如维度降减),而 SVD 本身具有更广泛的适用性。
6. 其他矩阵分解方法简介
除了 SVD 和 PCA,矩阵分解领域还有许多其他方法,每种方法都有其独特的应用场景和优势。
6.1 LU分解
定义:将一个方阵分解为一个下三角矩阵 \( L \) 和一个上三角矩阵 \( U \) 的乘积 \( A = LU \)。
应用:主要用于求解线性方程组、计算矩阵的逆和行列式。
6.2 QR分解
定义:将一个矩阵分解为一个正交矩阵 \( Q \) 和一个上三角矩阵 \( R \) 的乘积 \( A = QR \)。
应用:用于求解最小二乘问题、特征值计算等。
6.3 非负矩阵分解(NMF)
定义:将一个非负矩阵 \( A \) 分解为两个非负矩阵 \( W \) 和 \( H \) 的乘积 \( A \approx WH \)。
应用:广泛用于图像处理、文本挖掘、推荐系统等领域,能够揭示数据的潜在非负特征。
6.4 矩阵近似
定义:通过各种方法(如截断 SVD、低秩近似)找到一个低复杂度的矩阵近似原矩阵。
应用:用于数据压缩、降噪和加速计算。
7. 实践中的注意事项
在实际应用 SVD 和 PCA 进行数据降维和特征提取时,需要考虑以下几个方面:
7.1 数据预处理
中心化:对于 PCA,需要将数据进行中心化处理(减去均值),确保数据的中心位于原点。
标准化:对特征进行标准化,使其具有相同的尺度,特别是在特征具有不同量纲时。
7.2 选择适当的 \( k \) 值
信息保留:选择能够保留足够信息(如 95% 方差)的 \( k \) 值。
计算效率:较小的 \( k \) 值可以提高计算效率,但可能损失部分信息。
7.3 处理高维稀疏数据
存储效率:对于稀疏数据,可以利用稀疏矩阵的存储结构,降低存储和计算成本。
降维方法选择:某些降维方法(如 NMF)更适合处理非负且稀疏的数据。
7.4 评估降维效果
可视化:通过可视化降维后的数据,评估降维效果。
模型性能:在降维后的特征上训练机器学习模型,观察其性能变化。
7.5 扩展方法
核 PCA:适用于非线性数据,通过核技巧将数据映射到高维空间后进行 PCA。
稀疏 PCA:在 PCA 的基础上引入稀疏约束,增强特征的可解释性。
8. 结论
奇异值分解(SVD)和主成分分析(PCA)作为矩阵分解领域的经典方法,在数据降维与特征提取中具有重要的应用价值。SVD 提供了对于任意矩阵的全面分解,而 PCA 则专注于通过最大化数据方差来寻找主要特征。在实际应用中,合理选择和应用这些方法,可以显著提高数据处理的效率与效果,助力于更高效的机器学习和数据分析任务。
此外,了解其他矩阵分解方法(如 NMF、LU分解等)也能扩展数据处理的工具集,根据具体的应用需求选择最适合的方法,将进一步提升数据分析与建模的效果。
9. 参考资料
1. 《矩阵分析与应用》(Carl D. Meyer 著)
2. 《统计学习方法》(李航 著)
3. 《Python数据科学手册》(Jake VanderPlas 著)
4. Scikit-learn 官方文档:<https://scikit-learn.org/stable/>
5. NumPy 官方文档:<https://numpy.org/doc/>
本文旨在深入探讨奇异值分解(SVD)和主成分分析(PCA)在数据降维与特征提取中的应用,通过理论分析与实践示例相结合,帮助读者全面理解和掌握这些关键技术。希望本文能为从事数据科学与机器学习的读者提供有价值的参考和指导。
相关文章:
【人工智能数学基础篇】——深入详解矩阵分解:奇异值分解(SVD)与主成分分析(PCA)在数据降维与特征提取中的应用
目录 1. 引言 2. 矩阵分解概述 2.1 矩阵分解的意义 3. 奇异值分解(SVD) 3.1 定义与数学基础 3.2 SVD 的性质 3.3 SVD 在数据降维中的应用 3.4 示例代码:使用 SVD 进行图像压缩 3.5 结果分析 4. 主成分分析(PCA࿰…...
ThreeJS示例教程200+【目录】
Three.js 是一个强大的 JavaScript 库,旨在简化在网页上创建和展示3D图形的过程。它基于 WebGL 技术,但提供了比直接使用 WebGL 更易于使用的API,使得开发者无需深入了解 WebGL 的复杂细节就能创建出高质量的3D内容。 由于目前内容还不多,下面的内容暂时做一个占位。 文章目…...
DC-DC稳压电源——实战(基于Ti5450芯片)基础知识篇(1)
一:基础知识-耦合 1)去耦电容 (1)耦合与去耦 耦合:系统内部的各个部分之间存在相互依赖、相互影响、相互制约的情况。用人话说就是不同部分之间的相互影响。 去耦:自然就是消除不同部分之间的影响了。 &…...
pyrender 渲染mesh
目录 render_meshes函数 调用函数 render_meshes函数 def overlay_human_meshes(humans, K, model, img_pil, unique_colorFalse):# Color of humans seen in the image._color [color[0] for _ in range(len(humans))] if unique_color else color# Get focal and princpt …...
防火墙安全策略
目录 一.拓扑信息 二.需求分析 三.命令行详细配置信息 1.配置IP 2.交换机配置 3.修改安全区域 4.安全策略 四.web界面详细配置 1.配置IP和设置安全区域 2.交换机配置 3.安全策略 五.测试 一.拓扑信息 二.需求分析 1.VLAN 2属于办公区域;VLAN 3属于生…...
selenium clear()方法清除文本框内容
在使用Selenium进行Web自动化测试时,清除文本框内容是一个常见的需求。这可以通过多种方式实现,取决于你使用的是哪种编程语言(如Python、Java等)以及你的具体需求。以下是一些常见的方法: 1. 使用clear()方法 clear…...
(回溯分割)leetcode93 复原IP地址
#include<iostream> #include<vector> #include<string> #include<algorithm> using namespace std; //卡尔的图不是按照程序执行过程而是直接画程序会执行的过程 // 实际执行是:n个字符,递推n1后(叶子节点ÿ…...
高性能队列 Disruptor 在 IM 系统中的实战
高性能队列 Disruptor 在 IM 系统中的实战 前三期我们介绍了Disruptor的典型使用场景和相关高性能原理,本期我介绍一下Disruptor在IM系统用的应用实战,IM系统即社交聊天系统,对实时性的要求非常高,非常符合Disruptor的使用场景。 …...
原生HTML集合
一、表格 1、固定表格 <div class"tablebox"><div class"table-container"><table id"myTable" border"0" cellspacing"0" cellpadding"0"><thead><tr></tr></thead>…...
ES6 简单练习笔记--变量申明
一、ES5 变量定义 1.在全局作用域中 this 其实就是window对象 <script>console.log(window this) </script>输出结果: true 2.在全局作用域中用var定义一个变量其实就相当于在window上定义了一个属性 例如: var name "孙悟空" 其实就相当于执行了 win…...
2025.1.21——六、BUU XSS COURSE 1
题目来源:buuctf BUU XSS COURSE 1 一、打开靶机,整理信息 有吐槽和登陆两个尝试点,题目名称提示是XSS漏洞 XSS(Cross-Site Scripting)漏洞 1.定义:跨站脚本攻击,是一种常见的 Web 安全漏洞。攻…...
Linux - 五种常见I/O模型
I/O操作 (输入/输出操作, Input/Output) 是指计算机与外部设备就行数据交互的过程. 什么是外部设备: 如键盘, 鼠标, 硬盘, 网卡等. 五种常见的 I/O 模型: 阻塞 I/O非阻塞 I/O信号驱动 I/OI/O 多路复用异步 I/O 阻塞 I/O 阻塞 I/O 的特点: 当用户发起 I/O 请求后, 进程/线程就…...
【负载均衡式在线OJ】加载题目信息(文件版)
目录 如何读取文件 -- 常见流程 代码 如何读取文件 -- 常见流程 在C中使用 std::ifstream来打开文件流是一个常见的操作,用于创建一个输入文件流,并尝试打开名为 question_list的文件。if (!in.is_open()):检查文件是否成功打开。如果文件未…...
“上门按摩” 小程序开发项目:基于 SOP 的全流程管理
在竞争激烈的生活服务市场,“上门按摩” 服务需求日益增长。为满足这一需求,我们启动了 O2O 模式的 “上门按摩” 小程序开发项目,该项目涵盖客户端、系统管理端、技师端。以下将通过各类 SOP 对项目进行全面管理,确保项目顺利推进。 一、项目启动 SOP:5W2H 分析法 What(…...
WPF1-从最简单的xaml开始
1. 最简单的WPF应用 1.1. App.config1.2. App.xaml 和 App.xaml.cs1.3. MainWindow.xaml 和 MainWindow.xaml.cs 2. 正式开始分析 2.1. 声明即定义2.2. 命名空间 2.2.1. xaml的Property和Attribute2.2.2. xaml中命名空间2.2.3. partial关键字 学习WPF,肯定要先学…...
2025牛客寒假算法营2
A题 知识点:模拟 打卡。检查给定的七个整数是否仅包含 1,2,3,5,6 即可。为了便于书写,我们可以反过来,检查这七个整数是否不为 4 和 7。 时间 O(1);空间 O(1)。 #include <bits/stdc.h> using namespace std;signed main()…...
编译Android平台使用的FFmpeg库
目录 前言 一、编译环境 二、搭建环境 1.安装MSYS2 2.更新系统包 2.1 打开MSYS2 MinGW 64-bit终端(mingw64.exe) 2.2 更新所有软件包到最新版本 2.3 安装必要的工具和库。 3. 克隆FFmpeg源码 4. 配置编译选项 5. 执行编译 总结 前言 记录学习…...
【C++高并发服务器WebServer】-2:exec函数簇、进程控制
本文目录 一、exec函数簇介绍二、exec函数簇 一、exec函数簇介绍 exec 函数族的作用是根据指定的文件名找到可执行文件,并用它来取代调用进程的内容,换句话说,就是在调用进程内部执行一个可执行文件。 exec函数族的函数执行成功后不会返回&…...
力扣707题(2)——设计链表
#题目 #3,5和6的代码 今天看剩下几个题的代码,1,2,4的代码已经在上篇博客写过了想看的小伙伴移步到: 力扣707题——设计链表-CSDN博客 //第3题头插法 void addAtHead(int val){ //记录头结点ListNode nhead; //新节点的创建,并让它指向原本头结点的后…...
K8S中ingress详解
Ingress介绍 Kubernetes 集群中,服务(Service)是一种抽象,它定义了一种访问 Pod 的方式,无论这些 Pod 如何变化,服务都保持不变。服务可以被映射到一个静态的 IP 地址(ClusterIP)、一…...
OpenLayers 可视化之热力图
注:当前使用的是 ol 5.3.0 版本,天地图使用的key请到天地图官网申请,并替换为自己的key 热力图(Heatmap)又叫热点图,是一种通过特殊高亮显示事物密度分布、变化趋势的数据可视化技术。采用颜色的深浅来显示…...
Oracle查询表空间大小
1 查询数据库中所有的表空间以及表空间所占空间的大小 SELECTtablespace_name,sum( bytes ) / 1024 / 1024 FROMdba_data_files GROUP BYtablespace_name; 2 Oracle查询表空间大小及每个表所占空间的大小 SELECTtablespace_name,file_id,file_name,round( bytes / ( 1024 …...
线程与协程
1. 线程与协程 1.1. “函数调用级别”的切换、上下文切换 1. 函数调用级别的切换 “函数调用级别的切换”是指:像函数调用/返回一样轻量地完成任务切换。 举例说明: 当你在程序中写一个函数调用: funcA() 然后 funcA 执行完后返回&…...
关于nvm与node.js
1 安装nvm 安装过程中手动修改 nvm的安装路径, 以及修改 通过nvm安装node后正在使用的node的存放目录【这句话可能难以理解,但接着往下看你就了然了】 2 修改nvm中settings.txt文件配置 nvm安装成功后,通常在该文件中会出现以下配置&…...
2025 后端自学UNIAPP【项目实战:旅游项目】6、我的收藏页面
代码框架视图 1、先添加一个获取收藏景点的列表请求 【在文件my_api.js文件中添加】 // 引入公共的请求封装 import http from ./my_http.js// 登录接口(适配服务端返回 Token) export const login async (code, avatar) > {const res await http…...
无人机侦测与反制技术的进展与应用
国家电网无人机侦测与反制技术的进展与应用 引言 随着无人机(无人驾驶飞行器,UAV)技术的快速发展,其在商业、娱乐和军事领域的广泛应用带来了新的安全挑战。特别是对于关键基础设施如电力系统,无人机的“黑飞”&…...
【C++特殊工具与技术】优化内存分配(一):C++中的内存分配
目录 一、C 内存的基本概念 1.1 内存的物理与逻辑结构 1.2 C 程序的内存区域划分 二、栈内存分配 2.1 栈内存的特点 2.2 栈内存分配示例 三、堆内存分配 3.1 new和delete操作符 4.2 内存泄漏与悬空指针问题 4.3 new和delete的重载 四、智能指针…...
[拓扑优化] 1.概述
常见的拓扑优化方法有:均匀化法、变密度法、渐进结构优化法、水平集法、移动可变形组件法等。 常见的数值计算方法有:有限元法、有限差分法、边界元法、离散元法、无网格法、扩展有限元法、等几何分析等。 将上述数值计算方法与拓扑优化方法结合&#…...
嵌入式面试常问问题
以下内容面向嵌入式/系统方向的初学者与面试备考者,全面梳理了以下几大板块,并在每个板块末尾列出常见的面试问答思路,帮助你既能夯实基础,又能应对面试挑战。 一、TCP/IP 协议 1.1 TCP/IP 五层模型概述 链路层(Link Layer) 包括网卡驱动、以太网、Wi‑Fi、PPP 等。负责…...
二叉树-144.二叉树的前序遍历-力扣(LeetCode)
一、题目解析 对于递归方法的前序遍历十分简单,但对于一位合格的程序猿而言,需要掌握将递归转化为非递归的能力,毕竟递归调用的时候会调用大量的栈帧,存在栈溢出风险。 二、算法原理 递归调用本质是系统建立栈帧,而非…...
