【机器学习】在向量的流光中,揽数理星河为衣,以线性代数为钥,轻启机器学习黎明的瑰丽诗章
文章目录
- 线性代数入门:机器学习零基础小白指南
- 前言
- 一、向量:数据的基本单元
- 1.1 什么是向量?
- 1.1.1 举个例子:
- 1.2 向量的表示与维度
- 1.2.1 向量的维度
- 1.2.2 向量的表示方法
- 1.3 向量的基本运算
- 1.3.1 向量加法
- 1.3.2 向量的数乘
- 1.3.3 向量的长度(范数)
- 1.4 向量的几何意义
- 二、矩阵:多维数据的集合
- 2.1 什么是矩阵?
- 2.1.1 举个例子:
- 2.2 矩阵的表示与维度
- 2.2.1 矩阵的表示
- 2.2.2 矩阵的维度
- 2.3 矩阵的基本运算
- 2.3.1 矩阵加法
- 2.3.2 矩阵数乘
- 2.3.3 矩阵乘法
- 2.3.4 转置矩阵
- 三、矩阵的高级操作
- 3.1 矩阵的逆
- 3.1.1 什么是逆矩阵?
- 3.1.2 矩阵可逆的条件
- 3.1.3 逆矩阵的计算
- 3.2 特征值与特征向量
- 3.2.1 什么是特征值和特征向量?
- 3.2.2 几何意义
- 3.2.3 计算特征值和特征向量
- 3.3 奇异值分解(SVD)
- 3.3.1 什么是奇异值分解?
- 3.3.2 SVD的用途
- 3.4 矩阵的伪逆
- 3.4.1 什么是伪逆?
- 3.4.2 伪逆的计算方法
- 四、矩阵在机器学习中的应用
- 4.1 数据表示
- 4.2 模型训练中的矩阵运算
- 4.2.1 线性回归
- 写在最后
线性代数入门:机器学习零基础小白指南
💬 欢迎讨论:如果你在阅读过程中对某些公式或内容有疑问,欢迎在评论区留言,大家一起交流进步!
👍 点赞、收藏与分享:觉得这篇文章对你有帮助吗?记得点赞收藏,并分享给对机器学习感兴趣的朋友吧!你们的支持是我创作的最大动力!
🚀 知识的启航:线性代数是机器学习的基础,也是未来探索智能模型的关键。让我们从这里开始,一步步搭建知识大厦!
前言
在正式踏入机器学习的实战领域前,我们需要为自己筑起一座坚实的数学地基。 对于零基础的学习者而言,数学听起来也许陌生甚至有点“吓人”。然而,不必惧怕:本篇文章将带你从最直观的概念出发,帮助你理解和掌握线性代数这门支撑机器学习大厦的重要支柱。
为什么选择线性代数作为第一站?
- 数据表示:机器学习中的数据常以矩阵和向量的形式表示,线性代数是理解这种数据结构的语言。
- 模型构建:许多经典模型(如线性回归)和高级算法(如神经网络中的参数更新)都依赖矩阵运算和向量运算的思想。
- 特征变换:降维、特征提取、特征工程等处理步骤都离不开对线性代数的理解。
本篇文章将采用从浅入深的方式,带你从最基本的概念(向量与矩阵)出发,逐步触及更深层的运算与应用。你不需要担心自己的数学基础薄弱,每一个概念都会配以直观解释、示例和适合初学者的类比。通过本篇的学习,你将在脑海中构建起对数据表示和线性结构的基础认知,为后续的学习奠定牢固根基。
一、向量:数据的基本单元
1.1 什么是向量?
向量(Vector)是线性代数的核心概念之一。简单来说,向量是一组有序数值的集合,可以用来表示一个物理量或者一个对象的特征。
1.1.1 举个例子:
假设我们想描述一个人的体型,可以用以下信息:
- 身高:170 厘米
- 体重:65 公斤
- 年龄:30 岁
我们可以把这些特征组合成一个向量:
v = [ 170 65 30 ] \mathbf{v} = \begin{bmatrix} 170 \\ 65 \\ 30 \end{bmatrix} v= 1706530
1.2 向量的表示与维度
1.2.1 向量的维度
向量的维度(Dimension)是其元素的个数。例如:
- v = [ 170 65 30 ] \mathbf{v} = \begin{bmatrix} 170 \\ 65 \\ 30 \end{bmatrix} v= 1706530 是一个三维向量。
- w = [ 1 2 ] \mathbf{w} = \begin{bmatrix} 1 \\ 2 \end{bmatrix} w=[12] 是一个二维向量。
1.2.2 向量的表示方法
-
数学表示:用列向量或行向量表示,例如:
- 列向量:
v = [ v 1 v 2 v 3 ] \mathbf{v} = \begin{bmatrix} v_1 \\ v_2 \\ v_3 \end{bmatrix} v= v1v2v3 - 行向量:
v = [ v 1 v 2 v 3 ] \mathbf{v} = \begin{bmatrix} v_1 & v_2 & v_3 \end{bmatrix} v=[v1v2v3]
- 列向量:
-
编程实现(以 Python 为例):
import numpy as np# 创建列向量 v = np.array([[170], [65], [30]]) print(v)# 创建行向量 w = np.array([1, 2, 3]) print(w)
1.3 向量的基本运算
向量运算是线性代数的基础,在机器学习中用于描述数据间的关系。
1.3.1 向量加法
两个维度相同的向量可以逐元素相加。例如:
a = [ 1 2 ] , b = [ 3 4 ] \mathbf{a} = \begin{bmatrix} 1 \\ 2 \end{bmatrix}, \quad \mathbf{b} = \begin{bmatrix} 3 \\ 4 \end{bmatrix} a=[12],b=[34]
它们的加法结果为:
a + b = [ 1 + 3 2 + 4 ] = [ 4 6 ] \mathbf{a} + \mathbf{b} = \begin{bmatrix} 1+3 \\ 2+4 \end{bmatrix} = \begin{bmatrix} 4 \\ 6 \end{bmatrix} a+b=[1+32+4]=[46]
Python代码:
import numpy as npa = np.array([1, 2])
b = np.array([3, 4])
print(a + b) # 输出:[4 6]
1.3.2 向量的数乘
标量 (c) 与向量 v \mathbf{v} v 的乘积是将 (c) 逐一乘以向量中的每个元素:
c v = [ c ⋅ v 1 c ⋅ v 2 ] c \mathbf{v} = \begin{bmatrix} c \cdot v_1 \\ c \cdot v_2 \end{bmatrix} cv=[c⋅v1c⋅v2]
例如:
2 ⋅ [ 3 4 ] = [ 6 8 ] 2 \cdot \begin{bmatrix} 3 \\ 4 \end{bmatrix} = \begin{bmatrix} 6 \\ 8 \end{bmatrix} 2⋅[34]=[68]
Python代码:
v = np.array([3, 4])
c = 2
print(c * v) # 输出:[6 8]
1.3.3 向量的长度(范数)
向量的长度,也称范数(Norm),定义为:
∥ v ∥ = v 1 2 + v 2 2 + ⋯ + v n 2 \|\mathbf{v}\| = \sqrt{v_1^2 + v_2^2 + \cdots + v_n^2} ∥v∥=v12+v22+⋯+vn2
示例:
若 v = [ 3 4 ] \mathbf{v} = \begin{bmatrix} 3 \\ 4 \end{bmatrix} v=[34],则:
∥ v ∥ = 3 2 + 4 2 = 5 \|\mathbf{v}\| = \sqrt{3^2 + 4^2} = 5 ∥v∥=32+42=5
Python代码:
from numpy.linalg import normv = np.array([3, 4])
print(norm(v)) # 输出:5.0
1.4 向量的几何意义
向量可以用来描述“方向”和“大小”。例如:
- 向量 v = [ 3 4 ] \mathbf{v} = \begin{bmatrix} 3 \\ 4 \end{bmatrix} v=[34] 指向二维平面中的点 ((3,4)),其长度为 5。
二、矩阵:多维数据的集合
2.1 什么是矩阵?
矩阵(Matrix)是一个二维数组,由行(Row)和列(Column)组成。矩阵在机器学习中非常重要,用于表示数据集、模型参数和特征变换。
2.1.1 举个例子:
假设我们有一个房价预测的数据集,包括以下信息:
面积(平方米) | 房龄(年) | 房价(万元) |
---|---|---|
50 | 5 | 100 |
100 | 10 | 200 |
150 | 8 | 300 |
可以将这个数据用矩阵表示:
-
特征矩阵 (X):
X = [ 50 5 100 10 150 8 ] X = \begin{bmatrix} 50 & 5 \\ 100 & 10 \\ 150 & 8 \end{bmatrix} X= 501001505108 -
目标向量 (y):
y = [ 100 200 300 ] y = \begin{bmatrix} 100 \\ 200 \\ 300 \end{bmatrix} y= 100200300
2.2 矩阵的表示与维度
2.2.1 矩阵的表示
矩阵通常用大写字母(如 (A), (X))表示,矩阵中的元素可以用行列索引 (A_{ij}) 表示,例如:
A = [ 1 2 3 4 5 6 ] A = \begin{bmatrix} 1 & 2 & 3 \\ 4 & 5 & 6 \end{bmatrix} A=[142536]
- A 11 = 1 A_{11} = 1 A11=1 表示第一行第一列的元素。
- A 23 = 6 A_{23} = 6 A23=6 表示第二行第三列的元素。
2.2.2 矩阵的维度
矩阵的维度用“行数 × 列数”表示,例如:
- 上述矩阵 (A) 的维度是 2 × 3 2 \times 3 2×3(2 行 3 列)。
- 如果一个矩阵的行数和列数相同,则称其为方阵。
Python代码实现:
import numpy as np# 创建矩阵
A = np.array([[1, 2, 3],[4, 5, 6]])
print("矩阵 A:\n", A)
print("A 的形状:", A.shape) # 输出 (2, 3)
2.3 矩阵的基本运算
2.3.1 矩阵加法
两个矩阵相加要求维度相同,逐元素相加。例如:
[ 1 2 3 4 ] + [ 5 6 7 8 ] = [ 6 8 10 12 ] \begin{bmatrix} 1 & 2 \\ 3 & 4 \end{bmatrix} + \begin{bmatrix} 5 & 6 \\ 7 & 8 \end{bmatrix} =\begin{bmatrix} 6 & 8 \\ 10 & 12 \end{bmatrix} [1324]+[5768]=[610812]
Python代码:
A = np.array([[1, 2],[3, 4]])
B = np.array([[5, 6],[7, 8]])
print(A + B) # 输出 [[6, 8], [10, 12]]
2.3.2 矩阵数乘
标量(普通数值)与矩阵相乘是将标量逐元素乘以矩阵中的每个元素。例如:
2 ⋅ [ 1 2 3 4 ] = [ 2 4 6 8 ] 2 \cdot \begin{bmatrix} 1 & 2 \\ 3 & 4 \end{bmatrix} =\begin{bmatrix} 2 & 4 \\ 6 & 8 \end{bmatrix} 2⋅[1324]=[2648]
Python代码:
A = np.array([[1, 2],[3, 4]])
print(2 * A) # 输出 [[2, 4], [6, 8]]
2.3.3 矩阵乘法
矩阵乘法是矩阵运算中最常见的操作,用于特征变换和模型训练。
规则:
- 如果 A A A 是 m × n m \times n m×n 的矩阵, B B B 是 n × p n \times p n×p 的矩阵,则它们的乘积 C = A B C = AB C=AB 是 m × p m \times p m×p 的矩阵。
- 元素 C i j C_{ij} Cij 的计算公式为:
C i j = ∑ k = 1 n A i k B k j C_{ij} = \sum_{k=1}^n A_{ik} B_{kj} Cij=k=1∑nAikBkj
示例:
A = [ 1 2 3 4 ] , B = [ 5 6 7 8 ] A = \begin{bmatrix} 1 & 2 \\ 3 & 4 \end{bmatrix}, \quad B = \begin{bmatrix} 5 & 6 \\ 7 & 8 \end{bmatrix} A=[1324],B=[5768]
矩阵乘积:
C = A ⋅ B = [ 19 22 43 50 ] C = A \cdot B = \begin{bmatrix} 19 & 22 \\ 43 & 50 \end{bmatrix} C=A⋅B=[19432250]
Python代码:
A = np.array([[1, 2],[3, 4]])
B = np.array([[5, 6],[7, 8]])
C = A.dot(B) # 或使用 np.matmul(A, B)
print(C) # 输出 [[19, 22], [43, 50]]
2.3.4 转置矩阵
矩阵的转置是将其行列互换。例如:
A = [ 1 2 3 4 5 6 ] A = \begin{bmatrix} 1 & 2 & 3 \\ 4 & 5 & 6 \end{bmatrix} A=[142536]
其转置为:
A T = [ 1 4 2 5 3 6 ] A^T = \begin{bmatrix} 1 & 4 \\ 2 & 5 \\ 3 & 6 \end{bmatrix} AT= 123456
Python代码:
A = np.array([[1, 2, 3],[4, 5, 6]])
print(A.T) # 输出 [[1, 4], [2, 5], [3, 6]]
三、矩阵的高级操作
矩阵的高级操作是线性代数的重要内容,也是机器学习中不可或缺的数学工具。在这一部分,我们将学习矩阵的逆、特征值、特征向量以及矩阵分解等内容,并结合实际应用来理解它们的意义。
3.1 矩阵的逆
3.1.1 什么是逆矩阵?
对于一个方阵 (A),如果存在一个矩阵 A − 1 A^{-1} A−1,使得:
A ⋅ A − 1 = A − 1 ⋅ A = I A \cdot A^{-1} = A^{-1} \cdot A = I A⋅A−1=A−1⋅A=I
其中 I I I 是单位矩阵(对角线元素为 1,其他为 0 的矩阵),则称 A − 1 A^{-1} A−1 是 A A A 的逆矩阵。
3.1.2 矩阵可逆的条件
- 只有方阵(行数等于列数)可能有逆矩阵。
- 如果矩阵的行列式(Determinant)为 0,则该矩阵不可逆(奇异矩阵)。
3.1.3 逆矩阵的计算
对于 2 × 2 2 \times 2 2×2 的矩阵 A = [ a b c d ] A = \begin{bmatrix} a & b \\ c & d \end{bmatrix} A=[acbd],其逆矩阵为:
A − 1 = 1 a d − b c [ d − b − c a ] A^{-1} = \frac{1}{ad - bc} \begin{bmatrix} d & -b \\ -c & a \end{bmatrix} A−1=ad−bc1[d−c−ba]
例如:
A = [ 4 7 2 6 ] A = \begin{bmatrix} 4 & 7 \\ 2 & 6 \end{bmatrix} A=[4276]
行列式 a d − b c = 4 ⋅ 6 − 7 ⋅ 2 = 10 ad - bc = 4 \cdot 6 - 7 \cdot 2 = 10 ad−bc=4⋅6−7⋅2=10,
因此:
A − 1 = 1 10 [ 6 − 7 − 2 4 ] = [ 0.6 − 0.7 − 0.2 0.4 ] A^{-1} = \frac{1}{10} \begin{bmatrix} 6 & -7 \\ -2 & 4 \end{bmatrix} = \begin{bmatrix} 0.6 & -0.7 \\ -0.2 & 0.4 \end{bmatrix} A−1=101[6−2−74]=[0.6−0.2−0.70.4]
Python代码:
import numpy as np# 定义矩阵
A = np.array([[4, 7],[2, 6]])# 计算逆矩阵
A_inv = np.linalg.inv(A)
print("逆矩阵:\n", A_inv)
3.2 特征值与特征向量
3.2.1 什么是特征值和特征向量?
对于一个方阵 A A A,如果存在一个标量 λ \lambda λ 和一个非零向量 v \mathbf{v} v,使得:
A v = λ v A \mathbf{v} = \lambda \mathbf{v} Av=λv
则称:
- λ \lambda λ 为矩阵 A A A 的特征值。
- v \mathbf{v} v 为对应的特征向量。
3.2.2 几何意义
特征向量是一个方向,在矩阵变换下保持方向不变;特征值是对应的缩放因子。
3.2.3 计算特征值和特征向量
特征值通过解以下特征方程获得:
det ( A − λ I ) = 0 \det(A - \lambda I) = 0 det(A−λI)=0
解得的 λ \lambda λ 为特征值,将特征值代入方程 ( A − λ I ) v = 0 (A - \lambda I)\mathbf{v} = 0 (A−λI)v=0 可解得特征向量。
Python代码:
from numpy.linalg import eig# 定义矩阵
A = np.array([[4, 1],[2, 3]])# 计算特征值和特征向量
values, vectors = eig(A)
print("特征值:\n", values)
print("特征向量:\n", vectors)
3.3 奇异值分解(SVD)
3.3.1 什么是奇异值分解?
奇异值分解(Singular Value Decomposition, SVD)是对矩阵的一种分解方法,可以表示为:
A = U Σ V T A = U \Sigma V^T A=UΣVT
3.3.2 SVD的用途
- 数据降维:通过保留主要的奇异值,可以减少数据维度(如 PCA)。
- 数据压缩:SVD可用于压缩图片或文本数据。
- 推荐系统:通过矩阵分解预测用户评分。
Python代码:
from numpy.linalg import svd# 定义矩阵
A = np.array([[1, 2],[3, 4],[5, 6]])# 奇异值分解
U, Sigma, VT = svd(A)
print("U 矩阵:\n", U)
print("奇异值:\n", Sigma)
print("V 转置:\n", VT)
3.4 矩阵的伪逆
3.4.1 什么是伪逆?
伪逆矩阵(Pseudo-Inverse)是逆矩阵的推广,用于处理非方阵或奇异矩阵。对于一个矩阵 A A A,伪逆记为 A + A^+ A+。
3.4.2 伪逆的计算方法
伪逆可以通过 SVD 计算:
A + = V Σ + U T A^+ = V \Sigma^+ U^T A+=VΣ+UT
其中 Σ + \Sigma^+ Σ+ 是对奇异值矩阵的伪逆。
Python代码:
# 定义矩阵
A = np.array([[1, 2],[3, 4],[5, 6]])# 计算伪逆
A_pinv = np.linalg.pinv(A)
print("伪逆矩阵:\n", A_pinv)
四、矩阵在机器学习中的应用
4.1 数据表示
- 特征矩阵:存储样本的特征数据,每一行表示一个样本,每一列表示一个特征。
- 目标向量:存储样本对应的目标值。
4.2 模型训练中的矩阵运算
4.2.1 线性回归
在线性回归中,我们希望找到参数向量 θ \theta θ,使得:
y = X θ y = X\theta y=Xθ
通过最小化误差:
min θ ∥ X θ − y ∥ 2 \min_\theta \|X\theta - y\|^2 θmin∥Xθ−y∥2
可以使用正规方程求解:
θ = ( X T X ) − 1 X T y \theta = (X^T X)^{-1} X^T y θ=(XTX)−1XTy
Python代码:
# 定义特征矩阵 X 和目标向量 y
X = np.array([[1, 50],[1, 100],[1, 150]])
y = np.array([100, 200, 300])# 计算参数向量 theta
theta = np.linalg.inv(X.T.dot(X)).dot(X.T).dot(y)
print("参数向量 theta:", theta)
写在最后
通过这篇文章的学习,你初步了解了向量和矩阵这些基础概念,以及它们在机器学习中的重要性。从简单的向量加减和数乘,到稍微复杂的矩阵运算,再到特征值、奇异值分解等高级知识点,这些都是构建更高级模型和理解算法原理的关键砖瓦。
你或许会发现,这些数学内容并不是遥不可及的高门槛,相反,它们能帮助你更直观地理解数据与模型之间的关系。接下来,你可以尝试把这里学到的知识灵活运用到一些简单数据分析或小项目中,比如实现一个最基础的线性回归预测,或者对一个数据集进行简单的降维操作。
在后续的学习中,我们还会介绍更多与机器学习相关的数学和编程技巧。希望这篇文章能成为你打牢数学基础的起点,让你在机器学习这片广阔的领域中更有方向感和掌控力。加油!
以上就是关于【机器学习】窥数据之序,悟算法之道:机器学习的初心与远方的内容啦,各位大佬有什么问题欢迎在评论区指正,或者私信我也是可以的啦,您的支持是我创作的最大动力!❤️
相关文章:

【机器学习】在向量的流光中,揽数理星河为衣,以线性代数为钥,轻启机器学习黎明的瑰丽诗章
文章目录 线性代数入门:机器学习零基础小白指南前言一、向量:数据的基本单元1.1 什么是向量?1.1.1 举个例子: 1.2 向量的表示与维度1.2.1 向量的维度1.2.2 向量的表示方法 1.3 向量的基本运算1.3.1 向量加法1.3.2 向量的数乘1.3.3…...
Python PPT合并与拆分 – 详解
目录 使用工具 Python 合并 PPT 合并多个PPT文档 合并每个PPT文档中的特定幻灯片 Python 拆分 PPT 按幻灯片数量拆分 按幻灯片范围拆分 按幻灯片内容拆分 按节 (Section) 拆分 在日常工作或学习中,我们经常需要对PPT文件进行调整,比如将多个PPT…...

舌头分割数据集labelme格式2557张1类别
数据集格式:labelme格式(不包含mask文件,仅仅包含jpg图片和对应的json文件) 图片数量(jpg文件个数):2557 标注数量(json文件个数):2557 标注类别数:1 标注类别名称:["tongue"] 每个类别标注的框数࿱…...
LVS能否实现两台服务器的负载均衡
LVS能否实现两台服务器的负载均衡 是的,LVS(Linux Virtual Server)可以实现两台服务器的负载均衡,并且它非常适合这种场景。 LVS(Linux Virtual Server)简介: LVS 是一种基于 Linux 的负载均…...
onlyoffice 容器配置修改后制作镜像导出以及上传到 dockerhub
1.将容器制作成新的镜像 docker commit -p -a "xxx" -m "zh-cn-20-100" onlyoffice ooffice:7.1.1.23docker commit: 这是 Docker 中用于创建新镜像的命令。 -p: 这个选项用于在提交之前暂停容器的运行。这可以确保数据的完整性,因为容器在提交…...

Java常用 Date 时间格式化、Calender日历、正则表达式的用法
目录 1. SimpleDateFormat 日期格式化类 1.1 Date 类型转 String 1.2 String 类型转 Date 2. Calendar 日历类 3. 正则表达式 3.1 正则表达式的组成部分 3.2 手机号正则表达式 3.3 常用密码校验正则表达式 1. SimpleDateFormat 日期格式化类 SimpleDateFormat 是Java中…...
案例讲解自然语言处理(NLP)
自然语言处理(NLP)是一种涉及计算机与人类自然语言之间的交互的技术。以下是一些NLP技术的示例: 语言翻译:NLP可以用于将一种语言翻译成另一种语言。Google翻译就是一个使用NLP技术的例子,它可以将输入的文本从一种语言…...

tryhackme——Pre Security(安检前)-Offensive Security(进攻性安全)
这里我用的edge的插件闪击翻译。这里我英语不好,所以用这个可以顺便学习下英语。 任务一:What is Offensive Security?(什么是进攻性安全?) 很简单啊,通过阅读,知道以下哪个选项更能代表您模拟黑客操作…...
2.python变量
理解,我将提供更详细和深入的解释,包括一些进阶概念和实际应用的例子。我们将从变量类型开始,逐步深入到每种数据类型的特性、操作方法以及它们在编程中的应用场景。 文章目录 1. 变量赋值与作用域变量赋值变量作用域 2. 标准数据类型Number…...

【工业机器视觉】基于深度学习的水表盘读数识别(4-训练与预测)
【工业机器视觉】基于深度学习的仪表盘识读(读数识别)(3)-CSDN博客 训练与预测 Ultralytics YOLO指的是由Ultralytics公司开发的一系列基于YOLO(You Only Look Once)架构的目标检测算法。YOLO是一种实时目标检测系统,它…...
opencv获取摄像头的最大分辨率图像
事情是这样的,在拼多多花了40买了一个4k高清的摄像偷,确实清楚。但是我一直以为网络摄像头分辨率只有640*480,于是用python测试了一下,上代码 import cv2def get_max_resolution(camera_index):"""获取摄像头的最大分辨率。&…...

23.DDD与微服务
学习视频来源:DDD独家秘籍视频合集 https://space.bilibili.com/24690212/channel/collectiondetail?sid1940048&ctype0 文章目录 DDD与微服务的关系1. DDD可以用微服务实现,也可以不用微服务实现2. DDD是微服务拆分的必须参考项之一3. 微服务架构…...

Redis是什么?Redis和MongoDB的区别在那里?
Redis介绍 Redis(Remote Dictionary Server)是一个开源的、基于内存的数据结构存储系统,它可以用作数据库、缓存和消息中间件。以下是关于Redis的详细介绍: 一、数据结构支持 字符串(String) 这是Redis最…...
git SSL certificate problem: unable to get local issuer certificate
Git 客户端将会验证服务器端提供的SSL证书是否由受信任的证书颁发机构(Certification Authority,CA)签发。如果Git客户端无法找到或验证本地签发者证书,就会出现 unable to get local issuer certificate 或类似的错误。 该问题一…...

使用Keil V6编译 FreeRTOS CMSIS V2版本 ETH + Lwip 编译报错问题解决方式
网上其他人写的都解决不了,要不用的是CMSIS V1版本,根据他们的方式搞完还是报错,今天花点时间自己搞一下。 不想自己动手?没问题,模版已上传Gitee https://gitee.com/maybe_404/stm32-f4xx_-free-rtos_-lwip_-templa…...

驱动开发系列30 - Linux Graphics DRM光标绘制分析
一:概述 本文分析了 Linux 直接渲染管理器 (DRM) 绘制光标的过程,目的是将 OpenGL 与 DRM 连接,弄清楚整个调用逻辑。本文将详细描述这一过程,介绍如何在图形软件栈中实现光标渲染。整体软件栈的架构图也将展示其中的各个组成部分及其相互关系。 二:代码介绍 drm-cursor …...
如何利用Java爬虫获得淘宝买家秀
在电商平台上,买家秀数据是商家了解消费者反馈、优化产品和服务的重要资源。本文将详细介绍如何利用Java爬虫技术获取淘宝商品的买家秀信息,并提供一个完整的代码示例。 一、淘宝买家秀数据的重要性 买家秀数据包括买家上传的图片、视频、评论等内容&a…...

【ArcGIS】基于R语言、MaxEnt模型融合技术的物种分布模拟、参数优化方法、结果分析制图与论文写作
第一章、以问题导入的方式,深入掌握原理基础【理论篇】 1、R语言入门: (1)安装R及集成开发环境(IDE);(2)R语言基础语法与数据结构,包括:程序包安…...
虚幻引擎C++按键绑定
在项目的 Project Settings -> Engine -> Input 中进行配置。 配置输入映射的步骤: 打开 Project Settings: 在 Unreal Editor 中,点击菜单栏的 Edit -> Project Settings。 导航到 Input: 在 Project Settings 窗口的左侧导航栏中࿰…...
秒杀抢购场景下实战JVM级别锁与分布式锁
背景历史 在电商系统中,秒杀抢购活动是一种常见的营销手段。它通过设定极低的价格和有限的商品数量,吸引大量用户在特定时间点抢购,从而迅速增加销量、提升品牌曝光度和用户活跃度。然而,这种活动也对系统的性能和稳定性提出了极…...

业务系统对接大模型的基础方案:架构设计与关键步骤
业务系统对接大模型:架构设计与关键步骤 在当今数字化转型的浪潮中,大语言模型(LLM)已成为企业提升业务效率和创新能力的关键技术之一。将大模型集成到业务系统中,不仅可以优化用户体验,还能为业务决策提供…...

JavaSec-RCE
简介 RCE(Remote Code Execution),可以分为:命令注入(Command Injection)、代码注入(Code Injection) 代码注入 1.漏洞场景:Groovy代码注入 Groovy是一种基于JVM的动态语言,语法简洁,支持闭包、动态类型和Java互操作性,…...
SkyWalking 10.2.0 SWCK 配置过程
SkyWalking 10.2.0 & SWCK 配置过程 skywalking oap-server & ui 使用Docker安装在K8S集群以外,K8S集群中的微服务使用initContainer按命名空间将skywalking-java-agent注入到业务容器中。 SWCK有整套的解决方案,全安装在K8S群集中。 具体可参…...
从零实现富文本编辑器#5-编辑器选区模型的状态结构表达
先前我们总结了浏览器选区模型的交互策略,并且实现了基本的选区操作,还调研了自绘选区的实现。那么相对的,我们还需要设计编辑器的选区表达,也可以称为模型选区。编辑器中应用变更时的操作范围,就是以模型选区为基准来…...
Frozen-Flask :将 Flask 应用“冻结”为静态文件
Frozen-Flask 是一个用于将 Flask 应用“冻结”为静态文件的 Python 扩展。它的核心用途是:将一个 Flask Web 应用生成成纯静态 HTML 文件,从而可以部署到静态网站托管服务上,如 GitHub Pages、Netlify 或任何支持静态文件的网站服务器。 &am…...
汇编常见指令
汇编常见指令 一、数据传送指令 指令功能示例说明MOV数据传送MOV EAX, 10将立即数 10 送入 EAXMOV [EBX], EAX将 EAX 值存入 EBX 指向的内存LEA加载有效地址LEA EAX, [EBX4]将 EBX4 的地址存入 EAX(不访问内存)XCHG交换数据XCHG EAX, EBX交换 EAX 和 EB…...
JS设计模式(4):观察者模式
JS设计模式(4):观察者模式 一、引入 在开发中,我们经常会遇到这样的场景:一个对象的状态变化需要自动通知其他对象,比如: 电商平台中,商品库存变化时需要通知所有订阅该商品的用户;新闻网站中࿰…...

Mysql中select查询语句的执行过程
目录 1、介绍 1.1、组件介绍 1.2、Sql执行顺序 2、执行流程 2.1. 连接与认证 2.2. 查询缓存 2.3. 语法解析(Parser) 2.4、执行sql 1. 预处理(Preprocessor) 2. 查询优化器(Optimizer) 3. 执行器…...

C++ 设计模式 《小明的奶茶加料风波》
👨🎓 模式名称:装饰器模式(Decorator Pattern) 👦 小明最近上线了校园奶茶配送功能,业务火爆,大家都在加料: 有的同学要加波霸 🟤,有的要加椰果…...
WebRTC从入门到实践 - 零基础教程
WebRTC从入门到实践 - 零基础教程 目录 WebRTC简介 基础概念 工作原理 开发环境搭建 基础实践 三个实战案例 常见问题解答 1. WebRTC简介 1.1 什么是WebRTC? WebRTC(Web Real-Time Communication)是一个支持网页浏览器进行实时语音…...