首页
关于
Search
1
微服务
11 阅读
2
图神经网络
11 阅读
3
微信小程序
10 阅读
4
欢迎使用 Typecho
9 阅读
5
数学基础
8 阅读
默认分类
科研
自学
登录
找到
54
篇与
zy123
相关的结果
- 第 4 页
2025-04-03
JAVA面试题
JAVA面试题(1) 说说 Java 中 HashMap 的原理? 为什么引入红黑树: 当hash冲突较多的时候,链表中的元素会增多,插入、删除、查询的效率会变低,退化成O(n)使用红黑树可以优化插入、删除、查询的效率,logN级别。 转换时机: 链表上的元素个数大于等于8 且 数组长度大于等于64; 链表上的元素个数小于等于6的时候,红黑树退化成链表。 链表插入方式变更:从"头插法"改为"尾插法" 头插法特点: 插入时不需要遍历链表 直接替换头结点 扩容时会导致链表逆序 多线程环境下可能产生死循环 尾插法改进: 避免扩容时的链表逆序 解决多线程环境下的潜在死循环问题 Java 中 ConcurrentHashMap 1.7 和 1.8 之间有哪些区别? ConcurrentHashMap 不同JDK版本的实现对比 数据结构 JDK1.7: 使用 Segment(分段锁) + HashEntry数组 + 链表 的数据结构 JDK1.8及之后: 使用 数组 + 链表/红黑树 的数据结构(与HashMap类似) 锁的类型与宽度 JDK1.7: 分段锁(Segment)继承了 ReentrantLock Segment容量默认16,不会扩容 → 默认支持16个线程并发访问 JDK1.8: 使用 synchronized + CAS 保证线程安全 空节点:通过CAS添加(put操作,多个线程可能同时想要将一个新的键值对插入到同一个桶中,这时它们会使用 CAS 来比较当前桶中的元素(或节点)是否已经被修改过。) 非空节点:通过synchronized加锁,只锁住该桶,其他桶可以并行访问。 渐进式扩容(JDK1.8+) 触发条件:元素数量 ≥ 数组容量 × 负载因子(默认0.75) 扩容过程: 创建2倍大小的新数组 线程操作数据时,逐步迁移旧数组数据到新数组 使用 transferIndex 标记迁移进度 直到旧数组数据完全迁移完成 500. 什么是 Java 的 CAS(Compare-And-Swap)操作? CAS操作包含三个基本操作数: 内存位置(V):要更新的变量 预期原值(A):认为变量当前应该具有的值 新值(B):想要更新为的值 CAS 工作原理: 读取内存位置V的当前值为A 计算新值B 当且仅当V的值等于A时,将V的值设置为B 如果不等于A,则操作失败(通常重试) 伪代码表示: if (V == A) { V = B; return true; } else { return false; }
自学
zy123
4月3日
0
4
0
2025-04-01
凸优化问题求解
凸优化 核心概念 凸函数 定义:$f(x)$ 是凸函数当且仅当 $$ f(\theta x_1 + (1-\theta)x_2) \leq \theta f(x_1) + (1-\theta)f(x_2), \quad \forall x_1,x_2 \in \text{dom}(f), \theta \in [0,1] $$ 示例:$f(x)=x^2$, $f(x)=e^x$ 验证 $f(x) = x^2$ 是凸函数: 代入 $f(x) = x^2$: $$ (\theta x_1 + (1-\theta) x_2)^2 \leq \theta x_1^2 + (1-\theta) x_2^2 $$ 展开左边: $$ (\theta x_1 + (1-\theta) x_2)^2 = \theta^2 x_1^2 + 2\theta(1-\theta)x_1x_2 + (1-\theta)^2 x_2^2 $$ 右边: $$ \theta x_1^2 + (1-\theta) x_2^2 $$ 计算差值(右边减左边): $$ \theta x_1^2 + (1-\theta) x_2^2 - \theta^2 x_1^2 - 2\theta(1-\theta)x_1x_2 - (1-\theta)^2 x_2^2 $$ 化简: $$ = \theta(1-\theta)x_1^2 + (1-\theta)\theta x_2^2 - 2\theta(1-\theta)x_1x_2 $$ $$ = \theta(1-\theta)(x_1^2 + x_2^2 - 2x_1x_2) $$ $$ = \theta(1-\theta)(x_1 - x_2)^2 \geq 0 $$ 结论: 因为 $\theta \in [0,1]$,所以 $\theta(1-\theta) \geq 0$,且 $(x_1 - x_2)^2 \geq 0$。 因此,右边减左边 $\geq 0$,即: $$ (\theta x_1 + (1-\theta) x_2)^2 \leq \theta x_1^2 + (1-\theta) x_2^2 $$ $f(x)=x^2$ 满足凸函数的定义。 凸集 集合中任意两点的连线仍然完全包含在该集合内。换句话说,这个集合没有“凹陷”的部分。 定义:集合$X$是凸集当且仅当 $$ \forall x_1,x_2 \in X, \theta \in [0,1] \Rightarrow \theta x_1 + (1-\theta)x_2 \in X $$ 示例:超平面、球体 凸优化问题标准形式 $$ \min_x f(x) \quad \text{s.t.} \quad \begin{cases} g_i(x) \leq 0 & (凸不等式约束) \\ h_j(x) = 0 & (线性等式约束) \\ x \in X & (凸集约束) \end{cases} $$ 交替方向乘子法(ADMM) Alternating Direction Method of Multipliers (ADMM) 是一种用于求解大规模优化问题的高效算法,结合了拉格朗日乘子法和分裂方法的优点。 基本概念 优化问题分解 ADMM 的核心思想是将复杂优化问题分解为多个较简单的子问题,通过引入辅助变量将原问题转化为约束优化问题,使子问题独立求解。 拉格朗日乘子 利用拉格朗日乘子处理约束条件,构造增强拉格朗日函数,确保子问题求解时同时考虑原问题的约束信息。 交替更新 通过交替更新子问题的解和拉格朗日乘子,逐步逼近原问题的最优解。 算法流程 问题分解 将原问题分解为两个子问题。假设原问题表示为: $\min_{x, z} f(x) + g(z) \quad \text{s.t.} \quad Ax + Bz = c$ 其中 $f$ 和 $g$ 是凸函数,$A$ 和 $B$ 为给定矩阵。 构造增强拉格朗日函数 引入拉格朗日乘子 $y$,构造增强拉格朗日函数: $L_\rho(x, z, y) = f(x) + g(z) + y^T(Ax+Bz-c) + \frac{\rho}{2}|Ax+Bz-c|^2$ 其中 $\rho > 0$ 控制惩罚项的权重。 交替更新 更新 $x$:固定 $z$ 和 $y$,求解 $\arg\min_x L_\rho(x, z, y)$。 更新 $z$:固定 $x$ 和 $y$,求解 $\arg\min_z L_\rho(x, z, y)$。 更新乘子 $y$:按梯度上升方式更新: $y := y + \rho(Ax + Bz - c)$ 迭代求解 重复上述步骤,直到原始残差和对偶残差满足收敛条件(如 $|Ax+Bz-c| < \epsilon$)。 例子 下面给出一个简单的数值例子,展示 ADMM 在求解分解问题时的迭代过程。我们构造如下问题: $$ \begin{aligned} \min_{x, z}\quad & (x-1)^2 + (z-2)^2 \\ \text{s.t.}\quad & x - z = 0. \end{aligned} $$ 注意:由于约束要求 $x=z$,实际问题等价于 $$ \min_ (x-1)^2 + (x-2)^2, $$ 其解析最优解为: $$ 2(x-1)+2(x-2)=4x-6=0\quad\Rightarrow\quad x=1.5, $$ 因此我们希望得到 $x=z=1.5$。 构造 ADMM 框架 将问题写成 ADMM 标准形式: 令 $$ f(x)=(x-1)^2,\quad g(z)=(z-2)^2, $$ 约束写为 $$ x-z=0, $$ 即令 $A=1$、$B=-1$、$c=0$。 增强拉格朗日函数为 $$ L_\rho(x,z,y)=(x-1)^2+(z-2)^2+y(x-z)+\frac{\rho}{2}(x-z)^2, $$ 其中 $y$ 是拉格朗日乘子,$\rho>0$ 是惩罚参数。为简单起见,我们选取 $\rho=1$。 ADMM 的更新公式 针对本问题可以推导出三个更新步骤: $\arg\min_x; $表示在变量 $x$ 的可行范围内,找到使目标函数 $f(x)$ 最小的 $x$ 的具体值。 $k$ 代表当前的迭代次数 更新 $x$: 固定 $z$ 和 $y$,求解 $$ x^{k+1} = \arg\min_x; (x-1)^2 + y^k(x-z^k)+\frac{1}{2}(x-z^k)^2. $$ 对 $x$ 求导并令其为零: $$ 2(x-1) + y^k + (x-z^k)=0 \quad\Rightarrow\quad (2+1)x = 2 + z^k - y^k, $$ 得到更新公式: $$ x^{k+1} = \frac{2+z^k-y^k}{3}. $$ 更新 $z$: 固定 $x$ 和 $y$,求解 $$ z^{k+1} = \arg\min_z; (z-2)^2 - y^kz+\frac{1}{2}(x^{k+1}-z)^2. $$ 注意:由于 $y(x-z)$ 中关于 $z$ 的部分为 $-y^kz$(常数项 $y^kx$ 可忽略),求导得: $$ 2(z-2) - y^k - (x^{k+1}-z)=0 \quad\Rightarrow\quad (2+1)z = 4 + y^k + x^{k+1}, $$ 得到更新公式: $$ z^{k+1} = \frac{4+y^k+x^{k+1}}{3}. $$ 更新 $y$: 按梯度上升更新乘子: $$ y^{k+1} = y^k + \rho,(x^{k+1}-z^{k+1}). $$ 这里 $\rho=1$,所以 $$ y^{k+1} = y^k + \bigl(x^{k+1}-z^{k+1}\bigr). $$ 数值迭代示例 第 1 次迭代: 更新 $x$: $$ x^1 = \frac{2+z^0-y^0}{3}=\frac{2+0-0}{3}=\frac{2}{3}\approx0.667. $$ 更新 $z$: $$ z^1 = \frac{4+y^0+x^1}{3}=\frac{4+0+0.667}{3}\approx\frac{4.667}{3}\approx1.556. $$ 更新 $y$: $$ y^1 = y^0+(x^1-z^1)=0+(0.667-1.556)\approx-0.889. $$ 第 2 次迭代: 更新 $x$: $$ x^2 = \frac{2+z^1-y^1}{3}=\frac{2+1.556-(-0.889)}{3}=\frac{2+1.556+0.889}{3}\approx\frac{4.445}{3}\approx1.4817. $$ 更新 $z$: $$ z^2 = \frac{4+y^1+x^2}{3}=\frac{4+(-0.889)+1.4817}{3}=\frac{4-0.889+1.4817}{3}\approx\frac{4.5927}{3}\approx1.5309. $$ 更新 $y$: $$ y^2 = y^1+(x^2-z^2)\approx -0.889+(1.4817-1.5309)\approx -0.889-0.0492\approx -0.938. $$ 第 3 次迭代: 更新 $x$: $$ x^3 = \frac{2+z^2-y^2}{3}=\frac{2+1.5309-(-0.938)}{3}=\frac{2+1.5309+0.938}{3}\approx\frac{4.4689}{3}\approx1.4896. $$ 更新 $z$: $$ z^3 = \frac{4+y^2+x^3}{3}=\frac{4+(-0.938)+1.4896}{3}\approx\frac{4.5516}{3}\approx1.5172. $$ 更新 $y$: $$ y^3 = y^2+(x^3-z^3)\approx -0.938+(1.4896-1.5172)\approx -0.938-0.0276\approx -0.9656. $$ 从迭代过程可以看出: $x$ 和 $z$ 的值在不断调整,目标是使两者相等,从而满足约束。 最终随着迭代次数增加,$x$ 和 $z$ 会收敛到约 1.5,同时乘子 $y$ 收敛到 $-1$(这与 KKT 条件相符)。 应用领域 大规模优化 在大数据、机器学习中利用并行计算加速求解。 信号与图像处理 用于去噪、压缩感知等稀疏表示问题。 分布式计算 在多节点协同场景下求解大规模问题。 优点与局限性 优点 局限性 分布式计算能力 小规模问题可能收敛较慢 支持稀疏性和正则化 参数 $\rho$ 需精细调节 收敛性稳定 — KKT 条件 KKT 条件是用于求解约束优化问题的一组必要条件,特别适用于非线性规划问题。当目标函数是非线性的,并且存在约束时,KKT 条件提供了优化问题的最优解的必要条件。 一般形式 考虑优化问题: $$ \min_x f(x) $$ 约束条件: $$ g_i(x) \leq 0, \quad i = 1, 2, \dots, m $$ $$ h_j(x) = 0, \quad j = 1, 2, \dots, p $$ KKT 条件 1. 拉格朗日函数 构造拉格朗日函数: $$ \mathcal{L}(x, \lambda, \mu) = f(x) + \sum_{i=1}^m \lambda_i g_i(x) + \sum_{j=1}^p \mu_j h_j(x) $$ 其中: $\lambda_i$ 是不等式约束的拉格朗日乘子 $\mu_j$ 是等式约束的拉格朗日乘子 2. 梯度条件(驻点条件) $$ \nabla_x \mathcal{L}(x, \lambda, \mu) = 0 $$ 即: $$ \nabla f(x) + \sum_{i=1}^m \lambda_i \nabla g_i(x) + \sum_{j=1}^p \mu_j \nabla h_j(x) = 0 $$ 3. 原始可行性条件 $$ g_i(x) \leq 0, \quad i = 1, 2, \dots, m $$ $$ h_j(x) = 0, \quad j = 1, 2, \dots, p $$ 4. 对偶可行性条件 $$ \lambda_i \geq 0, \quad i = 1, 2, \dots, m $$ 5. 互补松弛性条件 $$ \lambda_i g_i(x) = 0, \quad i = 1, 2, \dots, m $$ (即:$\lambda_i > 0 \Rightarrow g_i(x) = 0$,或 $g_i(x) < 0 \Rightarrow \lambda_i = 0$) 示例: 我们有以下优化问题: $$ \min_x \quad f(x) = x^2 \\ \text{s.t.} \quad g(x) = x - 1 \leq 0 $$ 首先,我们可以直观地理解这个问题: 目标函数f(x)=x²是一个开口向上的抛物线,无约束时最小值在x=0 约束条件x-1≤0意味着x≤1 所以我们需要在x≤1的范围内找f(x)的最小值 显然,无约束最小值x=0已经满足x≤1的约束,因此x=0就是最优解。但让我们看看KKT条件如何形式化地得出这个结论。 1. 构造拉格朗日函数 拉格朗日函数为: $$ \mathcal{L}(x, \lambda) = x^2 + \lambda(x-1), \quad \lambda \geq 0 $$ 这里λ是拉格朗日乘子,必须非负(因为是不等式约束)。 2. KKT条件 KKT条件包括: 平稳性条件:∇ₓℒ = 0 原始可行性:g(x) ≤ 0 对偶可行性:λ ≥ 0 互补松弛性:λ·g(x) = 0 平稳性条件 对x求导: $$ \frac{\partial \mathcal{L}}{\partial x} = 2x + \lambda = 0 \quad (1) $$ 互补松弛性 $$ \lambda(x-1) = 0 \quad (2) $$ 这意味着有两种情况: 情况1:λ=0 情况2:x-1=0(即x=1) 情况1:λ=0 步骤 计算过程 结果 平稳性条件 $2x + 0 = 0 \Rightarrow x = 0$ $x = 0$ 原始可行性 $g(0) = 0 - 1 = -1 \leq 0$ 满足 对偶可行性 $\lambda = 0 \geq 0$ 满足 互补松弛性 $0 \cdot (-1) = 0$ 满足 情况2:x=1 步骤 计算过程 结果 平稳性条件 $2(1) + \lambda = 0 \Rightarrow \lambda = -2$ $\lambda = -2$ 对偶可行性 $\lambda = -2 \geq 0$ 不满足(乘子为负) 唯一满足所有KKT条件的解是x=0, λ=0。 总结 KKT 条件通过拉格朗日乘子法将约束和目标函数结合,为求解约束优化问题提供了必要的最优性条件。其核心是: 拉格朗日函数的梯度为零 原始约束和对偶约束的可行性 互补松弛性
科研
zy123
4月1日
0
4
0
2025-03-31
KAN
KAN Kolmogorov-Arnold表示定理 该定理表明,任何多元连续函数都可以表示为有限个单变量函数的组合。 对于任意一个定义在$[0,1]^n$上的连续多元函数: $$ f(x_1, x_2, \ldots, x_n), $$ 存在**单变量连续函数** $\phi_{q}$ 和 $\psi_{q,p}$(其中 $q = 1, 2, \ldots, 2n+1$,$p = 1, 2, \ldots, n$),使得: $$ f(x_1, \ldots, x_n) = \sum_{q=1}^{2n+1} \phi_{q}\left( \sum_{p=1}^{n} \psi_{q,p}(x_p) \right). $$ 即,$f$可以表示为$2n+1$个“外层函数”$\phi_{q}$和$n \times (2n+1)$个“内层函数”$\psi_{q,p}$的组合。 和MLP的联系 Kolmogorov-Arnold定理 神经网络(MLP) 外层函数 $\phi_q$ 的叠加 输出层的加权求和(线性组合) + 激活函数 内层函数 $\psi_{q,p}$ 的线性组合 隐藏层的加权求和 + 非线性激活函数 固定 $2n+1$ 个“隐藏单元” 隐藏层神经元数量可以自由设计,依赖于网络的深度和宽度 严格的数学构造(存在性证明) 通过数据驱动的学习(基于梯度下降等方法)来优化参数 和MLP的差异 浅层结构(一个隐藏层)的数学表达与模型设计 模型 数学公式 模型设计 MLP $f(x) \approx \sum_{i=1}^{N} a_i \sigma(w_i \cdot x + b_i)$ 线性变换后再跟非线性激活函数(RELU) KAN $f(x) = \sum_{q=1}^{2n+1} \Phi_q \left( \sum_{p=1}^n \phi_{q,p}(x_p) \right)$ 可学习激活函数(如样条)在边上,求和操作在神经元上 边上的可学习函数: $\phi_{q,p}(x_p)$(如B样条) 求和操作:$\sum_{p=1}^n \phi_{q,p}(x_p)$ 深层结构的数学表达与模型设计 模型 数学公式 模型设计 MLP $\text{MLP}(x) = (W_3 \circ \sigma_2 \circ W_2 \circ \sigma_1 \circ W_1)(x)$ 交替的线性层($W_i$)和固定非线性激活函数($\sigma_i$)。 KAN $\text{KAN}(x) = (\Phi_3 \circ \Phi_2 \circ \Phi_1)(x)$ 每一层都是单变量函数的组合($\Phi_i$),每一层的激活函数都可以进行学习 传统MLP的缺陷 梯度消失和梯度爆炸: 与其他传统的激活函数(如 Sigmoid 或 Tanh)一样,MLP 在进行反向传播时有时就会遇到梯度消失/爆炸的问题,尤其当网络层数过深时。当它非常小或为负大,网络会退化;连续乘积会使得梯度慢慢变为 0(梯度消失)或变得异常大(梯度爆炸),从而阻碍学习过程。 参数效率: MLP 常使用全连接层,每层的每个神经元都与上一层的所有神经元相连。尤其是对于大规模输入来说,这不仅增加了计算和存储开销,也增加了过拟合的风险。效率不高也不够灵活。 处理高维数据能力有限:MLP 没有利用数据的内在结构(例如图像中的局部空间相关性或文本数据的语义信息)。例如,在图像处理中,MLP 无法有效地利用像素之间的局部空间联系,这很典型在图像识别等任务上的性能不如卷积神经网络(CNN)。 长依赖问题: 虽然 MLP 理论上可以逼近任何函数,但在实际应用中,它们很难捕捉到序列中的长依赖关系(例如句子跨度很长)。这让人困惑:如何把前后序列的信息互相处理?而自注意力(如 transformer)在这类任务中表现更好。 但无论CNN/RNN/transformer怎么改进,都躲不掉MLP这个基础模型根上的硬伤,即线性组合+激活函数的模式。 KAN网络 主要贡献: 过去的类似想法受限于原始的Kolmogorov-Arnold表示定理(两层网络,宽度为2n+12n+1),未能利用现代技术(如反向传播)进行训练。 KAN通过推广到任意宽度和深度的架构,解决了这一限制,同时通过实验验证了KAN在“AI + 科学”任务中的有效性,兼具高精度和可解释性。 B样条(B-spline) 是一种通过分段多项式函数的线性组合构造的光滑曲线,其核心思想是利用局部基函数(称为B样条基函数)来表示整个曲线。 形式上,一个B样条函数通常表示为基函数的线性组合: $$ S(t) = \sum_{i=0}^{n} c_i \cdot B_i(t) $$ 其中: $B_i(t)$ 是 B样条基函数(basis functions); $c_i$ 是 控制点 或系数(可以来自数据、拟合、插值等); $S(t)$ 是最终的 B样条曲线 或函数。 每个基函数只在某个局部区间内非零,改变一个控制点只会影响曲线的局部形状。 示例:基函数定义 $B_0(t)$ - 支撑区间[0,1] $$ B_0(t) = \begin{cases} 1 - t, & 0 \leq t < 1,\\ 0, & \text{其他区间}. \end{cases} $$ $B_1(t)$ - 支撑区间[0,2] $$ B_1(t) = \begin{cases} t, & 0 \leq t < 1, \\ 2 - t, & 1 \leq t < 2, \\ 0, & \text{其他区间}. \end{cases} $$ $B_2(t)$ - 支撑区间[1,3] $$ B_2(t) = \begin{cases} t - 1, & 1 \leq t < 2, \\ 3 - t, & 2 \leq t < 3, \\ 0, & \text{其他区间}. \end{cases} $$ $B_3(t)$ - 支撑区间[2,4] $$ B_3(t) = \begin{cases} t - 2, & 2 \leq t < 3, \\ 4 - t, & 3 \leq t \leq 4, \\ 0, & \text{其他区间}. \end{cases} $$ 假设用该基函数对$f(t) = \sin\left(\dfrac{\pi t}{4}\right)$在[0,4]区间上拟合 $$ S(t) = 0 \cdot B_0(t) + 0.7071 \cdot B_1(t) + 1 \cdot B_2(t) + 0.7071 \cdot B_3(t) $$ 网络结构: 左图: 节点(如$x_{l,i}$)表示第$l$层第$i$个神经元的输入值 边(如$\phi_{l,j,i}$)表示可学习的激活函数(权重) 下一层节点的值计算: $$x_{l+1,j} = \sum_i \phi_{l,j,i}(x_{l,i})$$ 右图:
科研
zy123
3月31日
0
4
0
2025-03-23
线性代数
线性代数 线性变换 每列代表一个基向量,行数代码这个基向量所张成空间的维度,二行三列表示二维空间的三个基向量。 二维标准基矩阵(单位矩阵): $$ \begin{bmatrix} 1 & 0 \ 0 & 1 \end{bmatrix} = \begin{bmatrix} | & | \ \mathbf{i} & \mathbf{j} \ | & | \end{bmatrix} $$ 三维标准基矩阵(单位矩阵): $$ \begin{bmatrix} 1 & 0 & 0 \ 0 & 1 & 0 \ 0 & 0 & 1 \end{bmatrix} = \begin{bmatrix} | & | & | \ \mathbf{i} & \mathbf{j} & \mathbf{k} \ | & | & | \end{bmatrix} $$ 矩阵乘向量 在 3blue1brown 的“线性代数的本质”系列中,他把矩阵乘向量的运算解释为线性组合和线性变换的过程。具体来说: 计算方法 给定一个 $ m \times n $ 的矩阵 $ A $ 和一个 $ n $ 维向量 $ \mathbf = [x_1, x_2, \dots, x_n]^T $,矩阵与向量的乘积可以表示为: $$ A\mathbf = x_1 \mathbf{a}_1 + x_2 \mathbf{a}_2 + \cdots + x_n \mathbf{a}_n $$ 其中,$\mathbf{a}_i$ 表示 $ A $ 的第 $ i $ 列向量。也就是说,我们用向量 $\mathbf $ 的各个分量作为权重,对矩阵的各列进行线性组合。 例如:矩阵 $ A $ 是一个二阶矩阵: $$ A = \begin{bmatrix} a & b \ c & d \end{bmatrix} $$ 向量 $ \mathbf $ 是一个二维列向量: $$ \mathbf = \begin{bmatrix} x \ y \end{bmatrix} $$ 可以将这个乘法看作是用 $ x $ 和 $ y $ 这两个数,分别对矩阵的两列向量进行加权: $$ A\mathbf = x \cdot \begin{bmatrix} a \ c \end{bmatrix} + y \cdot \begin{bmatrix} b \ d \end{bmatrix} $$ 也就是说,矩阵乘向量的结果,是“矩阵每一列”乘以“向量中对应的分量”,再把它们加起来。 背后的思想 分解为基向量的组合: 任何向量都可以看作是标准基向量的线性组合。矩阵 $ A $ 在几何上代表了一个线性变换,而标准基向量在这个变换下会分别被映射到新的位置,也就是矩阵的各列。 构造变换: 当我们用 $\mathbf $ 的分量对这些映射后的基向量加权求和时,就得到了 $ \mathbf $ 在变换后的结果。这种方式不仅方便计算,而且直观地展示了线性变换如何“重塑”空间——每一列告诉我们基向量被如何移动,然后这些移动按比例组合出最终向量的位置。 矩阵乘矩阵 当你有两个矩阵 $ A $ 和 $ B $,矩阵乘法 $ AB $ 实际上代表的是: 先对向量应用 $ B $ 的线性变换,再应用 $ A $ 的线性变换。 也就是说: $$ (AB)\vec{v} = A(B\vec{v}) $$ 3blue1brown 的直觉解释: 矩阵 B:提供了新的变换后基向量 记住:矩阵的每一列,表示标准基向量 $ \mathbf{e}_1, \mathbf{e}_2 $ 在变换后的样子。 所以: $ B $ 是一个变换,它把空间“拉伸/旋转/压缩”成新的形状; $ A $ 接着又对这个已经变形的空间进行变换。 例: $$ A = \begin{bmatrix} 2 & 0 \\ 0 & 3 \end{bmatrix}, \quad B = \begin{bmatrix} 1 & -1 \\ 1 & 1 \end{bmatrix} $$ $ B $ 的列是: $ \begin{bmatrix} 1 \ 1 \end{bmatrix} $ → 第一个标准基向量变形后的位置 $ \begin{bmatrix} -1 \ 1 \end{bmatrix} $ → 第二个标准基向量变形后的位置 我们计算: $ A \cdot \begin{bmatrix} 1 \ 1 \end{bmatrix} = \begin{bmatrix} 2 \ 3 \end{bmatrix} $ $ A \cdot \begin{bmatrix} -1 \ 1 \end{bmatrix} = \begin{bmatrix} -2 \ 3 \end{bmatrix} $ 所以: $$ AB = \begin{bmatrix} 2 & -2 \\ 3 & 3 \end{bmatrix} $$ 这个新矩阵 $ AB $ 的列向量,表示标准基向量在经历了 “先 B 再 A” 的变换后,落在了哪里。 行列式 3blue1brown讲解行列式时,核心在于用几何直观来理解行列式的意义: 缩放比例!!! 体积(或面积)的伸缩因子 对于二维空间中的2×2矩阵,行列式的绝对值表示该矩阵作为线性变换时,对单位正方形施加变换后得到的平行四边形的面积。类似地,对于三维空间中的3×3矩阵,行列式的绝对值就是单位立方体变换后的平行六面体的体积。也就是说,行列式告诉我们这个变换如何“拉伸”或“压缩”空间。 方向的指示(有向面积或体积) 行列式不仅仅给出伸缩倍数,还通过正负号反映了变换是否保持了原来的方向(正)还是发生了翻转(负)。例如,在二维中,如果行列式为负,说明变换过程中存在翻转(类似镜像效果)。 变换的可逆性 当行列式为零时,说明该线性变换把空间压缩到了低维(例如二维变一条线,三维变成一个平面或线),这意味着信息在变换过程中丢失,变换不可逆。 逆矩阵、列空间、零空间 逆矩阵 逆矩阵描述了一个矩阵所代表的线性变换的**“反过程”**。假设矩阵 $A$ 对空间做了某种变换(比如旋转、拉伸或压缩),那么 $A^{-1}$ 就是把这个变换“逆转”,把变换后的向量再映射回原来的位置。 前提是$A$ 是可逆的,即它对应的变换不会把空间压缩到更低的维度。 秩 秩等于矩阵列向量(或行向量)所生成的空间的维数。例如,在二维中,如果一个 $2 \times 2$ 矩阵的秩是 2,说明这个变换把平面“充满”;如果秩为 1,则所有输出都落在一条直线上,说明变换“丢失”了一个维度。 列空间 列空间是矩阵所有列向量的线性组合所构成的集合(也可以说所有可能的输出向量$A\mathbf $所构成的集合)。 比如一个二维变换的列空间可能是整个平面,也可能只是一条直线,这取决于矩阵的秩。 零空间 零空间(又称核、kernel)是所有在该矩阵作用(线性变换$A$)下变成零向量的输入向量的集合。 它展示了变换中哪些方向被“压缩”成了一个点(原点)。例如,在三维中,如果一个矩阵将所有向量沿某个方向压缩到零,那么这个方向构成了零空间。 零空间解释了$Ax=0$的解的集合,就是齐次的通解。如果满秩,零空间只有唯一解零向量。 求解线性方程 设线性方程组写作 $$ A\mathbf = \mathbf{b} $$ 这相当于在问:“有没有一个向量 $\mathbf $ ,它经过矩阵 $A$ 的变换后,恰好落在 $\mathbf{b}$ 所在的位置?” 如果 $\mathbf{b}$ 落在 $A$ 的列空间内,那么就存在解。解可能是唯一的(当矩阵满秩时)或无穷多(当零空间非平凡时)。 如果 $\mathbf{b}$ 不在列空间内,则说明 $\mathbf{b}$ 不可能由 $A$ 的列向量线性组合得到,这时方程组无解。 唯一解对应于所有这些几何对象在一点相交; 无限多解对应于它们沿着某个方向重合; 无解则说明这些对象根本没有公共交点。 基变换 新基下的变换矩阵 $A_C$ 为: $$ A_C = P^{-1} A P $$ $P$:从原基到新基的基变换矩阵(可逆),$P$的每一列代表了新基中的一个基向量 $A$:线性变换 $T$ 在原基下的矩阵表示 原来空间中进行$A$线性变换等同于新基的视角下进行 $A_C$ 变换 点积、哈达马积 向量点积(Dot Product) 3blue1brown认为,两个向量的点乘就是将其中一个向量转为线性变换。 假设有两个向量 $$ \mathbf{v} = \begin{bmatrix} v_1 \\ v_2 \end{bmatrix}, \quad \mathbf{w} = \begin{bmatrix} w_1 \\ w_2 \end{bmatrix}. $$ $$ \mathbf{v} \cdot \mathbf{w} =\begin{bmatrix} v_1 & v_2 \end{bmatrix}\begin{bmatrix} w_1 \\ w_2 \end{bmatrix}=v_1w_1 + v_2w_2.. $$ 结果: 点积的结果是一个标量(即一个数)。 几何意义: 点积可以衡量两个向量的相似性,或者计算一个向量在另一个向量方向上的投影。 哈达马积(Hadamard Product) 定义: 对于两个向量 $\mathbf{u} = [u_1, u_2, \dots, u_n]$ 和 $\mathbf{v} = [v_1, v_2, \dots, v_n]$,它们的哈达马积定义为: $$ \mathbf{u} \circ \mathbf{v} = [u_1 v_1, u_2 v_2, \dots, u_n v_n]. $$ 结果: 哈达马积的结果是一个向量,其每个分量是对应位置的分量相乘。 几何意义: 哈达马积通常用于逐元素操作,比如在神经网络中对两个向量进行逐元素相乘。 矩阵也有哈达马积!。 特征值和特征向量 设矩阵: $$ A = \begin{bmatrix} 2 & 1 \\ 0 & 3 \end{bmatrix} $$ 步骤 1:求特征值 构造特征方程: $$ \det(A - \lambda I) = \det\begin{bmatrix} 2-\lambda & 1 \\ 0 & 3-\lambda \end{bmatrix} = (2-\lambda)(3-\lambda) - 0 = 0 $$ 解得: $$ (2-\lambda)(3-\lambda) = 0 \quad \Longrightarrow \quad \lambda_1 = 2,\quad \lambda_2 = 3 $$ 步骤 2:求特征向量 对于 $\lambda_1 = 2$: 解方程: $$ (A - 2I)\mathbf = \begin{bmatrix} 2-2 & 1 \\ 0 & 3-2 \end{bmatrix}\begin{bmatrix} x_1 \\ x_2 \end{bmatrix} = \begin{bmatrix} 0 & 1 \\ 0 & 1 \end{bmatrix}\begin{bmatrix} x_1 \\ x_2 \end{bmatrix} = \begin{bmatrix} x_2 \\ x_2 \end{bmatrix} = \begin{bmatrix} 0 \\ 0 \end{bmatrix} $$ 从第一行 $x_2 = 0$。因此特征向量可以写成: $$ \mathbf{v}_1 = \begin{bmatrix} 1 \\ 0 \end{bmatrix} \quad (\text{任意非零常数倍}) $$ 对于 $\lambda_2 = 3$: 解方程: $$ (A - 3I)\mathbf = \begin{bmatrix} 2-3 & 1 \\ 0 & 3-3 \end{bmatrix}\begin{bmatrix} x_1 \\ x_2 \end{bmatrix} = \begin{bmatrix} -1 & 1 \\ 0 & 0 \end{bmatrix}\begin{bmatrix} x_1 \\ x_2 \end{bmatrix} = \begin{bmatrix} -x_1+x_2 \\ 0 \end{bmatrix} = \begin{bmatrix} 0 \\ 0 \end{bmatrix} $$ 从第一行得 $-x_1 + x_2 = 0$ 或 $x_2 = x_1$。因此特征向量可以写成: $$ \mathbf{v}_2 = \begin{bmatrix} 1 \\ 1 \end{bmatrix} \quad (\text{任意非零常数倍}) $$ 设一个对角矩阵: $$ D = \begin{bmatrix} d_1 & 0 \\ 0 & d_2 \end{bmatrix} $$ $$ \lambda_1 = d_1,\quad \lambda_2 = d_2 $$ 对角矩阵的特征方程为: $$ \det(D - \lambda I) = (d_1 - \lambda)(d_2 - \lambda) = 0 $$ 因此特征值是: $$ \lambda_1 = d_1,\quad \lambda_2 = d_2 $$ 对于 $\lambda_1 = d_1$,方程 $(D-d_1I)\mathbf =\mathbf{0}$ 得到: $$ \begin{bmatrix} 0 & 0 \\ 0 & d_2-d_1 \end{bmatrix}\begin{bmatrix} x_1 \\ x_2 \end{bmatrix} = \begin{bmatrix} 0 \\ (d_2-d_1)x_2 \end{bmatrix} = \begin{bmatrix} 0 \\ 0 \end{bmatrix} $$ 若 $d_1 \neq d_2$,则必须有 $x_2=0$,而 $x_1$ 可任意取非零值,因此特征向量为: $$ \mathbf{v}_1 = \begin{bmatrix} 1 \\ 0 \end{bmatrix} $$ 对于 $\lambda_2 = d_2$,类似地解得: $$ \mathbf{v}_2 = \begin{bmatrix} 0 \\ 1 \end{bmatrix} $$ 矩阵乘法 全连接神经网络 其中: $a^{(0)}$ 是输入向量,表示当前层的输入。 $\mathbf{W}$ 是权重矩阵,表示输入向量到输出向量的线性变换。 $b$ 是偏置向量,用于调整输出。 $\sigma$ 是激活函数(如 ReLU、Sigmoid 等),用于引入非线性。 输入向量 $a^{(0)}$: $$ a^{(0)} = \begin{pmatrix} a_0^{(0)} \\ a_1^{(0)} \\ \vdots \\ a_n^{(0)} \end{pmatrix} $$ 这是一个 $n+1$ 维的列向量,表示输入特征。 权重矩阵 $\mathbf{W}$: $$ \mathbf{W} = \begin{pmatrix} w_{0,0} & w_{0,1} & \cdots & w_{0,n} \\ w_{1,0} & w_{1,1} & \cdots & w_{1,n} \\ \vdots & \vdots & \ddots & \vdots \\ w_{k,0} & w_{k,1} & \cdots & w_{k,n} \\ \end{pmatrix} $$ 这是一个 $k \times (n+1)$ 的矩阵,其中 $k$ 是输出向量的维度,$n+1$ 是输入向量的维度。 偏置向量 $b$: $$ b = \begin{pmatrix} b_0 \\ b_1 \\ \vdots \\ b_k \end{pmatrix} $$ 这是一个 $k$ 维的列向量,用于调整输出。 在传统的连续时间 RNN 写法里,常见的是 $$ \sum_{j} W_{ij} \, \sigma(x_j), $$ 这代表对所有神经元 $j$ 的激活 $\sigma(x_j)$ 做加权求和,再求和到神经元 $i$。 如果拆开来看,每个输出分量也都含一个求和 $\sum_{j}$: 输出向量的第 1 个分量(记作第 1 行的结果): $$ (W_r x)_1 = 0.3 \cdot x_1 + (-0.5) \cdot x_2 = 0.3 \cdot 2 + (-0.5) \cdot 1 = 0.6 - 0.5 = 0.1. $$ 输出向量的第 2 个分量(第 2 行的结果): $$ (W_r x)_2 = 1.2 \cdot x_1 + 0.4 \cdot x_2 = 1.2 \cdot 2 + 0.4 \cdot 1 = 2.4 + 0.4 = 2.8. $$ 在使用矩阵乘法时,你可以写成 $$ y = W_r \, \sigma(x), $$ 其中 $\sigma$ 表示对 $x$ 的各分量先做激活,接着用 $W_r$ 乘上去。这就是把“$\sum_j \dots$”用矩阵乘法隐藏了。 $$ \begin{pmatrix} 0.3 & -0.5\\ 1.2 & \;\,0.4 \end{pmatrix} \begin{pmatrix} 2\\ 1 \end{pmatrix} = \begin{pmatrix} 0.3 \times 2 + (-0.5) \times 1\\[6pt] 1.2 \times 2 + 0.4 \times 1 \end{pmatrix} = \begin{pmatrix} 0.6 - 0.5\\ 2.4 + 0.4 \end{pmatrix} = \begin{pmatrix} 0.1\\ 2.8 \end{pmatrix}. $$ 奇异值 定义 对于一个 $m \times n$ 的矩阵 $A$,其奇异值是非负实数 $\sigma_1, \sigma_2, \ldots, \sigma_r$($r = \min(m, n)$),满足存在正交矩阵 $U$ 和 $V$,使得: $$ A = U \Sigma V^T $$ 其中,$\Sigma$ 是对角矩阵,对角线上的元素即为奇异值。 主要特点 非负性:奇异值总是非负的。 对角矩阵的奇异值是对角线元素的绝对值。 降序排列:通常按从大到小排列,即 $\sigma_1 \geq \sigma_2 \geq \ldots \geq \sigma_r \geq 0$。 矩阵分解:奇异值分解(SVD)将矩阵分解为三个矩阵的乘积,$U$ 和 $V$ 是正交矩阵,$\Sigma$ 是对角矩阵。 应用广泛:奇异值在数据降维、噪声过滤、图像压缩等领域有广泛应用。 奇异值求解 奇异值可以通过计算矩阵 $A^T A$ 或 $A A^T$ 的特征值的平方根得到。 步骤 1:计算 $A^T A$ 首先,我们计算矩阵 $A$ 的转置 $A^T$: $$ A^T = \begin{pmatrix} 3 & 0 \\ 0 & -4 \end{pmatrix} $$ 然后,计算 $A^T A$: $$ A^T A = \begin{pmatrix} 3 & 0 \\ 0 & -4 \end{pmatrix} \begin{pmatrix} 3 & 0 \\ 0 & -4 \end{pmatrix} = \begin{pmatrix} 9 & 0 \\ 0 & 16 \end{pmatrix} $$ 步骤 2:计算 $A^T A$ 的特征值 接下来,我们计算 $A^T A$ 的特征值。特征值 $\lambda$ 满足以下特征方程: $$ \det(A^T A - \lambda I) = 0 $$ 即: $$ \det \begin{pmatrix} 9 - \lambda & 0 \\ 0 & 16 - \lambda \end{pmatrix} = (9 - \lambda)(16 - \lambda) = 0 $$ 解这个方程,我们得到两个特征值: $$ \lambda_1 = 16, \quad \lambda_2 = 9 $$ 步骤 3:计算奇异值 奇异值是特征值的平方根,因此我们计算: $$ \sigma_1 = \sqrt{\lambda_1} = \sqrt{16} = 4 $$ $$ \sigma_2 = \sqrt{\lambda_2} = \sqrt{9} = 3 $$ 结果 矩阵 $A$ 的奇异值为 4 和 3。 奇异值分解 给定一个实矩阵 $A$(形状为 $m \times n$),SVD 是将它分解为: $$ A = U \Sigma V^T $$ 构造 $A^T A$ 计算对称矩阵 $A^T A$($n \times n$) 求解 $A^T A$ 的特征值和特征向量 设特征值为 $\lambda_1 \geq \lambda_2 \geq \dots \geq \lambda_n \geq 0$ 对应特征向量为 $\mathbf{v}_1, \mathbf{v}_2, \dots, \mathbf{v}_n$ 计算奇异值 $\sigma_i = \sqrt{\lambda_i}$ 构造矩阵 $V$ 将正交归一的特征向量作为列向量:$V = [\mathbf{v}_1 | \mathbf{v}_2 | \dots | \mathbf{v}_n]$ 求矩阵 $U$ 对每个非零奇异值:$\mathbf{u}_i = \frac{A \mathbf{v}_i}{\sigma_i}$ 标准化(保证向量长度为 1)后组成 $U = [\mathbf{u}_1 | \mathbf{u}_2 | \dots | \mathbf{u}_m]$ 构造 $\Sigma$ 对角线放置奇异值:$\Sigma = \text{diag}(\sigma_1, \sigma_2, \dots, \sigma_p)$,$p=\min(m,n)$ 范数 L2范数定义: 对于一个向量 $\mathbf{w} = [w_1, w_2, \dots, w_n]$,L2 范数定义为 $$ \|\mathbf{w}\|_2 = \sqrt{w_1^2 + w_2^2 + \dots + w_n^2} $$ 假设一个权重向量为 $\mathbf{w} = [3, -4]$,则 $$ \|\mathbf{w}\|_2 = \sqrt{3^2 + (-4)^2} = \sqrt{9+16} = \sqrt{25} = 5. $$ 用途: 正则化(L2正则化/权重衰减):在训练过程中,加入 L2 正则项有助于防止模型过拟合。正则化项通常是权重的 L2 范数的平方,例如 $$ \lambda \|\mathbf{w}\|_2^2 $$ 其中 $\lambda$ 是正则化系数。 梯度裁剪:在 RNN 等深度网络中,通过计算梯度的 L2 范数来判断是否需要对梯度进行裁剪,从而防止梯度爆炸。 具体例子: 假设我们有一个简单的线性回归模型,损失函数为均方误差(MSE): $$ L(\mathbf{w}) = \frac{1}{2N} \sum_{i=1}^N (y_i - \mathbf{w}^T \mathbf _i)^2 $$ 其中,$N$ 是样本数量,$y_i$ 是第 $i$ 个样本的真实值,$\mathbf _i$ 是第 $i$ 个样本的特征向量,$\mathbf{w}$ 是权重向量。 加入 L2 正则项后,新的损失函数为: $$ L_{\text{reg}}(\mathbf{w}) = \frac{1}{2N} \sum_{i=1}^N (y_i - \mathbf{w}^T \mathbf _i)^2 + \lambda \|\mathbf{w}\|_2^2 $$ 在训练过程中,优化算法会同时最小化原始损失函数和正则项,从而在拟合训练数据的同时,避免权重值过大。 梯度更新 在梯度下降算法中,权重 $\mathbf{w}$ 的更新公式为: $$ \mathbf{w} \leftarrow \mathbf{w} - \eta \nabla L_{\text{reg}}(\mathbf{w}) $$ 其中,$\eta$ 是学习率,$\nabla L_{\text{reg}}(\mathbf{w})$ 是损失函数关于 $\mathbf{w}$ 的梯度。 对于加入 L2 正则项的损失函数,梯度为: $$ \nabla L_{\text{reg}}(\mathbf{w}) = \nabla L(\mathbf{w}) + 2\lambda \mathbf{w} $$ 因此,权重更新公式变为: $$ \mathbf{w} \leftarrow \mathbf{w} - \eta (\nabla L(\mathbf{w}) + 2\lambda \mathbf{w}) $$ 通过加入 L2 正则项,模型在训练过程中不仅会最小化原始损失函数,还会尽量减小权重的大小,从而避免过拟合。正则化系数 $\lambda$ 控制着正则化项的强度,较大的 $\lambda$ 会导致权重更小,模型更简单,但可能会欠拟合;较小的 $\lambda$ 则可能无法有效防止过拟合。因此,选择合适的 $\lambda$ 是使用 L2 正则化的关键。 矩阵的元素级范数 L0范数(但它 并不是真正的范数): $$ \|A\|_0 = \text{Number of non-zero elements in } A = \sum_{i=1}^{m} \sum_{j=1}^{n} \mathbb{I}(a_{ij} \neq 0) $$ 其中: $\mathbb{I}(\cdot)$ 是指示函数(若 $a_{ij} \neq 0$ 则取 1,否则取 0)。 如果矩阵 $A$ 有 $k$ 个非零元素,则 $|A|_0 = k$。 衡量稀疏性: $|A|_0$ 越小,矩阵 $A$ 越稀疏(零元素越多)。 在压缩感知、低秩矩阵恢复、稀疏编码等问题中,常用 $L_0$ 范数来 约束解的稀疏性。 非凸、非连续、NP难优化: $L_0$ 范数是 离散的,导致优化问题通常是 NP难 的(无法高效求解)。 因此,实际应用中常用 $L_1$ 范数(绝对值之和)作为凸松弛替代: $$ |A|1 = \sum{i,j} |a_{ij}| $$ NP难问题: 可以在多项式时间内 验证一个解是否正确,但 不一定能在多项式时间内找到解。 L1范数:元素绝对值和 $$ \|A\|_1 = \sum_{i=1}^{m} \sum_{j=1}^{n} |a_{ij}| $$ 范数类型 定义 性质 优化难度 用途 $L_0$ $\sum_{i,j} \mathbb{I}(a_{ij} \neq 0)$ 非凸、离散、不连续 NP难 精确稀疏性控制 $L_1$ $\sum_{i,j} a_{ij} $ 凸、连续 矩阵的核范数 核范数,又称为迹范数(trace norm),是矩阵范数的一种,定义为矩阵所有奇异值之和。对于一个矩阵 $A$(假设其奇异值为 $\sigma_1, \sigma_2, \dots, \sigma_r$),其核范数定义为: $$ \|A\|_* = \sum_{i=1}^{r} \sigma_i, $$ 其中 $r$ 是矩阵 $A$ 的秩。 核范数的主要特点 凸性 核范数是一个凸函数,因此在优化问题中常用作替代矩阵秩的惩罚项(因为直接最小化矩阵秩是一个NP困难的问题)。 低秩逼近 在矩阵补全、低秩矩阵恢复等应用中,核范数被用来鼓励矩阵解具有低秩性质,因其是矩阵秩的凸松弛。 与SVD的关系 核范数直接依赖于矩阵的奇异值,计算时通常需要奇异值分解(SVD)。 Frobenius 范数 对于一个矩阵 $A \in \mathbb{R}^{m \times n}$,其 Frobenius 范数定义为 $$ \|A\|_F = \sqrt{\sum_{i=1}^{m}\sum_{j=1}^{n} a_{ij}^2} $$ 这个定义与向量 $L2$ 范数类似,只不过是对矩阵中所有元素取平方和后再开平方。 对于归一化的向量$\mathbf _m$ ,其外积矩阵 $\mathbf _m \mathbf _m^T$,其元素为 $(\mathbf _m \mathbf m^T){ij} = x_i x_j$,因此: $$ \|\mathbf _m \mathbf _m^T\|_F = \sqrt{\sum_{i=1}^n \sum_{j=1}^n |x_i x_j|^2 } = \sqrt{\left( \sum_{i=1}^n x_i^2 \right) \left( \sum_{j=1}^n x_j^2 \right) } = \|\mathbf _m\|_2 \cdot \|\mathbf _m\|_2 = 1. $$ 例: 设归一化向量 $\mathbf = \begin{bmatrix} \frac{1}{\sqrt{2}} \ \frac{1}{\sqrt{2}} \end{bmatrix}$,其外积矩阵为: $$ \mathbf \mathbf ^T = \begin{bmatrix} \frac{1}{\sqrt{2}} \\ \frac{1}{\sqrt{2}} \end{bmatrix} \begin{bmatrix} \frac{1}{\sqrt{2}} & \frac{1}{\sqrt{2}} \end{bmatrix} = \begin{bmatrix} \frac{1}{2} & \frac{1}{2} \\ \frac{1}{2} & \frac{1}{2} \end{bmatrix} $$ 计算 Frobenius 范数: $$ \|\mathbf \mathbf ^T\|_F = \sqrt{ \left( \frac{1}{2} \right)^2 + \left( \frac{1}{2} \right)^2 + \left( \frac{1}{2} \right)^2 + \left( \frac{1}{2} \right)^2 } = \sqrt{4 \cdot \frac{1}{4}} = 1. $$ 如果矩阵 $A$ 的奇异值为 $\sigma_1, \sigma_2, \ldots, \sigma_n$,则: $$ \|A\|_F = \sqrt{\sum_{i=1}^n \sigma_i^2} $$ 这使得 Frobenius 范数在低秩近似和矩阵分解(如 SVD)中非常有用。 设矩阵 $A$ 为: $$ A = \begin{bmatrix} 1 & 0 \\ 0 & 2 \\ 1 & 1 \end{bmatrix} $$ 定义: $$ \|A\|_F = \sqrt{1^2 + 0^2 + 0^2 + 2^2 + 1^2 + 1^2 } = \sqrt{1 + 0 + 0 + 4 + 1 + 1} = \sqrt{7} $$ 验证: 计算 $A^T A$: $$ A^T A = \begin{bmatrix} 1 & 0 & 1 \ 0 & 2 & 1 \end{bmatrix} \begin{bmatrix} 1 & 0 \ 0 & 2 \ 1 & 1 \end{bmatrix} = \begin{bmatrix} 2 & 1 \ 1 & 5 \end{bmatrix} $$ 求 $A^T A$ 的特征值(即奇异值的平方): $$ \det(A^T A - \lambda I) = \lambda^2 - 7\lambda + 9 = 0 \implies \lambda = \frac{7 \pm \sqrt{13}}{2} $$ 因此: $$ \sigma_1 = \sqrt{\frac{7 + \sqrt{13}}{2}}, \quad \sigma_2 = \sqrt{\frac{7 - \sqrt{13}}{2}} $$ 验证 Frobenius范数: $$ \sigma_1^2 + \sigma_2^2 = \frac{7 + \sqrt{13}}{2} + \frac{7 - \sqrt{13}}{2} = 7 $$ 所以: $$ |A|_F = \sqrt{7} $$ 公式正确! 迹和 Frobenius 范数的关系: $$ \|A\|_F^2 = \text{tr}(A^* A) $$ 这表明 Frobenius 范数的平方就是 $A^* A$ 所有特征值之和。而 $A^* A$ 的特征值开方就是A的奇异值。 最大范数 矩阵的最大范数(也称为 元素级无穷范数 或 一致范数)定义为矩阵所有元素绝对值的最大值: $$ \|A\|_{\max} = \max_{i,j} |A_{ij}| $$ 它衡量的是矩阵中绝对值最大的元素,适用于逐元素(element-wise)分析。 如果比较两个矩阵 $A$ 和 $B$,它们的误差矩阵 $E = A - B$ 的最大范数为: $$ \|A - B\|_{\max} = \max_{i,j} |A_{ij} - B_{ij}| $$ 意义: 如果 $|A - B|_{\max} \leq \epsilon$,说明 $A$ 和 $B$ 的所有对应元素的误差都不超过 $\epsilon$。 对于任意 $m \times n$ 的矩阵 $A$,以下不等式成立: $$ \|A\|_{\max} \leq \|A\|_F \leq \sqrt{mn} \cdot \|A\|_{\max} $$ 矩阵的迹 迹的定义 对于一个 $n \times n$ 的矩阵 $B$,其迹(trace)定义为矩阵对角线元素之和: $$ \text{tr}(B) = \sum_{i=1}^n B_{ii} $$ 迹与特征值的关系 对于一个 $n \times n$ 的矩阵 $B$,其迹等于其特征值之和。即: $$ \text{tr}(B) = \sum_{i=1}^n \lambda_i $$ 其中 $\lambda_1, \lambda_2, \ldots, \lambda_n$ 是矩阵 $B$ 的特征值。 应用到 $A^ A$* 对于矩阵 $A^* A$(如果 $A$ 是实矩阵,则 $A^* = A^T$),它是一个半正定矩阵,其特征值是非负实数。 $A^* A$ 的迹还与矩阵 $A$ 的 Frobenius 范数有直接关系。具体来说: $$ \|A\|_F^2 = \text{tr}(A^* A) $$ 迹的基本性质 迹是一个线性运算,即对于任意标量 $c_1, c_2$ 和矩阵 $A, B$,有: $$ \text{tr}(c_1 A + c_2 B) = c_1 \text{tr}(A) + c_2 \text{tr}(B) $$ 对于任意矩阵 $A, B, C$,迹满足循环置换性质: $$ \text{tr}(ABC) = \text{tr}(CAB) = \text{tr}(BCA) $$ 注意:迹的循环置换性不意味着 $\text{tr}(ABC) = \text{tr}(BAC)$,除非矩阵 $A, B, C$ 满足某些特殊条件(如对称性)。 酉矩阵 酉矩阵是一种复矩阵,其满足下面的条件:对于一个 $n \times n$ 的复矩阵 $U$,如果有 $$ U^* U = U U^* = I, $$ 其中 $U^*$ 表示 $U$ 的共轭转置(先转置再取复共轭),而 $I$ 是 $n \times n$ 的单位矩阵,那么 $U$ 就被称为酉矩阵。简单来说,酉矩阵在复内积空间中保持内积不变,相当于在该空间中的“旋转”或“反射”。 如果矩阵的元素都是实数,那么 $U^*$ 就等于 $U^T$(转置),这时酉矩阵就退化为正交矩阵。 考虑二维旋转矩阵 $$ U = \begin{bmatrix} \cos\theta & -\sin\theta \\ \sin\theta & \cos\theta \end{bmatrix}. $$ 当 $\theta$ 为任意实数时,这个矩阵满足 $$ U^T U = I, $$ 所以它是一个正交矩阵,同时也属于酉矩阵的范畴。 例如,当 $\theta = \frac{\pi}{4}$(45°)时, $$ U = \begin{bmatrix} \frac{\sqrt{2}}{2} & -\frac{\sqrt{2}}{2} \\ \frac{\sqrt{2}}{2} & \frac{\sqrt{2}}{2} \end{bmatrix}. $$ 正定\正半定矩阵 正定矩阵(PD) $$ A \text{ 正定} \iff \forall, x \in \mathbb{R}^n \setminus {0}, \quad x^T A x > 0. $$ 正半定矩阵(PSD) $$ A \text{ 正半定} \iff \forall, x \in \mathbb{R}^n, \quad x^T A x \ge 0. $$ PD:所有特征值都严格大于零。 $\lambda_i(A)>0,;i=1,\dots,n$。 PSD:所有特征值都非负。 $\lambda_i(A)\ge0,;i=1,\dots,n$。 拉普拉斯矩阵是正半定矩阵! 对于任意实矩阵 $A$(大小为 $m\times n$),矩阵 $B = A^T A\quad(\text{大小为 }n\times n).$是半正定矩阵 显然 $$ B^T = (A^T A)^T = A^T (A^T)^T = A^T A = B, $$ 所以 $B$ 是对称矩阵。 对任意向量 $x\in\mathbb R^n$,有 $$ x^T B,x = x^T (A^T A) x = (Ax)^T (Ax) = |Ax|^2 ;\ge;0. $$ 因此 $B$ 总是 正半定(PSD) 的。 对称非负矩阵分解 $$ A≈HH^T $$ 1. 问题回顾 给定一个对称非负矩阵 $A\in\mathbb{R}^{n\times n}$,我们希望找到一个非负矩阵 $H\in\mathbb{R}^{n\times k}$ 使得 $$ A \approx HH^T. $$ 为此,我们可以**最小化目标函数(损失函数)** $$ f(H)=\frac{1}{2}\|A-HH^T\|_F^2, $$ 其中 $\|\cdot\|_F$ 表示 Frobenius 范数,定义为矩阵所有元素的平方和的平方根。 $| A - H H^T |_F^2$ 表示矩阵 $A - H H^T$ 的所有元素的平方和。 2. 梯度下降方法 2.1 计算梯度 目标函数(损失函数)是 $$ f(H)=\frac{1}{2}\|A-HH^T\|_F^2. $$ $$ \|M\|_F^2 = \operatorname{trace}(M^T M), $$ 因此,目标函数可以写成: $$ f(H)=\frac{1}{2}\operatorname{trace}\Bigl[\bigl(A-HH^T\bigr)^T\bigl(A-HH^T\bigr)\Bigr]. $$ 注意到 $A$ 和$HH^T$ 都是对称矩阵,可以简化为: $$ f(H)=\frac{1}{2}\operatorname{trace}\Bigl[\bigl(A-HH^T\bigr)^2\Bigr]. $$ 展开后得到 $$ f(H)=\frac{1}{2}\operatorname{trace}\Bigl[A^2 - 2AHH^T + (HH^T)^2\Bigr]. $$ 其中 $\operatorname{trace}(A^2)$ 与 $H$ 无关,可以看作常数,不影响梯度计算。 计算 $\nabla_H \operatorname{trace}(-2 A H H^T)$ $$ \nabla_H \operatorname{trace}(-2 A H H^T) = -4 A H $$ 计算 $\nabla_H \operatorname{trace}((H H^T)^2)$ $$ \nabla_H \operatorname{trace}((H H^T)^2) = 4 H H^T H $$ 将两部分梯度合并: $$ \nabla_H f(H) = \frac{1}{2}(4 H H^T H - 4 A H )= 2(H H^T H - A H) $$ 2.2 梯度下降更新 设学习率为 $\eta>0$,则梯度下降的基本更新公式为: $$ H \leftarrow H - \eta\, \nabla_H f(H) = H - 2\eta\Bigl(HH^T H - A H\Bigr). $$ 由于我们要求 $H$ 中的元素保持非负,所以每次更新之后通常需要进行投影: $$ H_{ij} \leftarrow \max\{0,\,H_{ij}\}. $$ 这种方法称为投影梯度下降,保证每一步更新后 $H$ 满足非负约束。 3. 举例说明 设对称非负矩阵: $$ A = \begin{bmatrix} 2 & 1 \\ 1 & 2 \end{bmatrix}, \quad k=1, \quad H \in \mathbb{R}^{2 \times 1} $$ 初始化 $H^{(0)} = \begin{bmatrix} 1 \\ 1 \end{bmatrix}$,学习率 $\eta = 0.01$。 迭代步骤: 初始 ( H^{(0)} ): $$ H^{(0)} = \begin{bmatrix} 1 \\ 1 \end{bmatrix}, \quad H^{(0)}(H^{(0)})^T = \begin{bmatrix} 1 & 1 \\ 1 & 1 \end{bmatrix}. $$ 目标函数值: $$ f(H^{(0)}) = \frac{1}{2} \left( (2-1)^2 + 2(1-1)^2 + (2-1)^2 \right) = 1. $$ 计算梯度: $$ HH^T H = \begin{bmatrix} 2 \\ 2 \end{bmatrix}, \quad AH = \begin{bmatrix} 3 \\ 3 \end{bmatrix}, $$ $$ \nabla_H f(H^{(0)}) = 2 \left( \begin{bmatrix} 2 \\ 2 \end{bmatrix} - \begin{bmatrix} 3 \\ 3 \end{bmatrix} \right) = \begin{bmatrix} -2 \\ -2 \end{bmatrix}. $$ 更新 ( H ): $$ H^{(1)} = H^{(0)} - 2 \cdot 0.01 \cdot \begin{bmatrix} -2 \\ -2 \end{bmatrix} = \begin{bmatrix} 1.04 \\ 1.04 \end{bmatrix}. $$ 更新后目标函数: $$ H^{(1)}(H^{(1)})^T = \begin{bmatrix} 1.0816 & 1.0816 \\ 1.0816 & 1.0816 \end{bmatrix}, $$ $$ f(H^{(1)}) = \frac{1}{2} \left( (2-1.0816)^2 + 2(1-1.0816)^2 + (2-1.0816)^2 \right) \approx 0.8464. $$ 一次迭代后目标函数值从 $1.0$ 下降至 $0.8464$
科研
zy123
3月23日
0
8
0
2025-03-22
同步本地Markdown至Typecho站点
同步本地Markdown至Typecho站点 本项目基于https://github.com/Sundae97/typecho-markdown-file-publisher 实现效果: 将markdown发布到typecho 发布前将markdown中的公式块和代码块进行格式化,确保能适配md解析器。 发布前将markdown的图片资源上传到自己搭建的图床Easyimage中(自行替换成阿里云OSS等), 并替换markdown中的图片链接。 将md所在的文件夹名称作为post的category(mysql发布可以插入category, xmlrpc接口暂时不支持category操作)。 以title和category作为文章的唯一标识,如果数据库中已有该数据,将会更新现有文章,否则新增文章。 环境:Typecho1.2.1 php8.1.0 项目目录 typecho_markdown_upload/main.py是上传md文件到站点的核心脚本 transfer_md/transfer.py是对md文件进行预处理的脚本。 核心思路 一、预先准备 图床服务器 本人自己在服务器上搭建了私人图床——easyimage,该服务能够实现图片上传并返回公网 URL,这对于在博客中正常显示 Markdown 文件中的图片至关重要。 当然,也可以选择使用公共图床服务,如阿里云 OSS,但这里不做详细介绍。 需手动修改transfer_md/upload_img.py,配置url、token等信息。 参考博客:【好玩儿的Docker项目】10分钟搭建一个简单图床——Easyimage-我不是咕咕鸽 github地址:icret/EasyImages2.0: 简单图床 - 一款功能强大无数据库的图床 2.0版 picgo安装: 使用 Typora + PicGo + Easyimage 组合,可以实现将本地图片直接粘贴到 Markdown 文件中,并自动上传至图床。 下载地址:Releases · Molunerfinn/PicGo 操作步骤如下: 打开 PicGo,点击右下角的小窗口。 进入插件设置,搜索并安装 web-uploader 1.1.1 插件(注意:旧版本可能无法搜索到,建议直接安装最新版本)。 配置插件:在设置中填写 API 地址,该地址可在 Easyimage 的“设置-API设置”中获取。 配置完成后,即可实现图片自动上传,提升 Markdown 编辑体验。 Typora 设置 为了确保在博客中图片能正常显示,编辑 Markdown 文档时必须将图片上传至图床,而不是保存在本地。请按以下步骤进行配置: 在 Typora 中,打开 文件 → 偏好设置 → 图像 选项。 在 “插入图片时” 选项中,选择 上传图片。 在 “上传服务设定” 中选择 PicGo,并指定 PicGo 的安装路径。 文件结构统一: md_files ├── category1 │ ├── file1.md │ └── file2.md ├── category2 │ ├── file3.md │ └── file4.md └── output ├── assets_type ├── pics └── updated_files 注意:category对应上传到typecho中的文章所属的分类。 如果你现有的图片分散在系统中,可以使用 transfer_md/transfer.py 脚本来统一处理。该脚本需要传入三个参数: input_path: 指定包含 Markdown 文件的根目录(例如上例中的 md_files)。 output_path: 输出文件夹(例如上例中的 output)。 type_value: 1:扫描 input_path 下所有 Markdown 文件,将其中引用的本地图片复制到 output_path 中,同时更新 Markdown 文件中的图片 URL 为 output_path 内的路径; 2:为每个 Markdown 文件建立单独的文件夹(以文件名命名),图片存放在文件夹下的 assets 子目录中,整体存入assets_type文件夹中,; 3:扫描 Markdown 文件中的本地图片,将其上传到图床(获取公网 URL),并将 Markdown 文件中对应的图片 URL 替换为公网地址。 4:预处理Markdown 文件,将公式块和代码块格式化,以便于Markdown解析器解析(本地typora编辑器对于md格式比较宽容,但博客中使用的md解析器插件不一定能正确渲染!) 二、使用Git进行版本控制 假设你在服务器上已经搭建了 Gitea (Github、Gitee都行)并创建了一个名为 md_files 的仓库,那么你可以在 md_files 文件夹下通过 Git Bash 执行以下步骤将本地文件提交到远程仓库: 初始化本地仓库: git init 添加远程仓库: 将远程仓库地址添加为 origin(请将 http://xxx 替换为你的实际仓库地址): git remote add origin http://xxx 添加文件并提交: 注意,写一个.gitignore文件将output排除版本控制 git add . git commit -m "Initial commit" 推送到远程仓库: git push -u origin master 后续更新(可写个.bat批量执行): git add . git commit -m "更新了xxx内容" git push 三、在服务器上部署该脚本 1. 确保脚本能够连接到 Typecho 使用的数据库 本博客使用 docker-compose 部署 Typecho(参考:【好玩儿的Docker项目】10分钟搭建一个Typecho博客|太破口!念念不忘,必有回响!-我不是咕咕鸽)。为了让脚本能访问 Typecho 的数据库,我将 Python 应用pyapp也通过 docker-compose 部署,这样所有服务均在同一网络中,互相之间可以直接通信。 参考docker-compose.yml如下: services: nginx: image: nginx ports: - "4000:80" # 左边可以改成任意没使用的端口 restart: always environment: - TZ=Asia/Shanghai volumes: - ./typecho:/var/www/html - ./nginx:/etc/nginx/conf.d - ./logs:/var/log/nginx depends_on: - php networks: - web php: build: php restart: always expose: - "9000" # 不暴露公网,故没有写9000:9000 volumes: - ./typecho:/var/www/html environment: - TZ=Asia/Shanghai depends_on: - mysql networks: - web pyapp: build: ./markdown_operation # Dockerfile所在的目录 restart: "no" volumes: - /home/zy123/md_files:/markdown_operation/md_files networks: - web env_file: - .env depends_on: - mysql mysql: image: mysql:5.7 restart: always environment: - TZ=Asia/Shanghai expose: - "3306" # 不暴露公网,故没有写3306:3306 volumes: - ./mysql/data:/var/lib/mysql - ./mysql/logs:/var/log/mysql - ./mysql/conf:/etc/mysql/conf.d env_file: - mysql.env networks: - web networks: web: 注意:如果你不是用docker部署的typecho,只要保证脚本能连上typecho所使用的数据库并操纵里面的表就行! 2. 将 md_files 挂载到容器中,保持最新内容同步 这样有几个优势: 不需要每次构建镜像或进入容器手动拉取; 本地更新 md_files 后,容器内自动同步,无需额外操作; 保持了宿主机上的 Git 版本控制和容器内的数据一致性。 3.仅针对 pyapp 服务进行重构和启动,不影响其他服务的运行: pyapp是本Python应用在容器内的名称。 1.构建镜像: docker-compose build pyapp 2.启动容器并进入 Bash: docker-compose run --rm -it pyapp /bin/bash 3.在容器内运行脚本: python typecho_markdown_upload/main.py 2、3两步可合并为: docker-compose run --rm pyapp python typecho_markdown_upload/main.py 此时可以打开博客验证一下是否成功发布文章了! 如果失败,可以验证mysql数据库: 1️⃣ 进入 MySQL 容器: docker-compose exec mysql mysql -uroot -p # 输入你的 root 密码 2️⃣ 切换到 Typecho 数据库并列出表: USE typecho; SHOW TABLES; 3️⃣ 查看 typecho_contents 表结构(文章表): DESCRIBE typecho_contents; mysql> DESCRIBE typecho_contents; +--------------+------------------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +--------------+------------------+------+-----+---------+----------------+ | cid | int(10) unsigned | NO | PRI | NULL | auto_increment | | title | varchar(150) | YES | | NULL | | | slug | varchar(150) | YES | UNI | NULL | | | created | int(10) unsigned | YES | MUL | 0 | | | modified | int(10) unsigned | YES | | 0 | | | text | longtext | YES | | NULL | | | order | int(10) unsigned | YES | | 0 | | | authorId | int(10) unsigned | YES | | 0 | | | template | varchar(32) | YES | | NULL | | | type | varchar(16) | YES | | post | | | status | varchar(16) | YES | | publish | | | password | varchar(32) | YES | | NULL | | | commentsNum | int(10) unsigned | YES | | 0 | | | allowComment | char(1) | YES | | 0 | | | allowPing | char(1) | YES | | 0 | | | allowFeed | char(1) | YES | | 0 | | | parent | int(10) unsigned | YES | | 0 | | | views | int(11) | YES | | 0 | | | agree | int(11) | YES | | 0 | | +--------------+------------------+------+-----+---------+----------------+ 4️⃣ 查询当前文章数量(确认执行前后有无变化): SELECT COUNT(*) AS cnt FROM typecho_contents; 自动化 1.windows下写脚本自动/手动提交每日更新 2.在 Linux 服务器上配置一个定时任务,定时执行 git pull 命令和启动脚本更新博客的命令。 创建脚本/home/zy123/typecho/deploy.sh #!/bin/bash cd /home/zy123/md_files || exit git pull cd /home/zy123/typecho || exit docker compose run --rm pyapp python typecho_markdown_upload/main.py 赋予可执行权限chmod +x /home/zy123/deploy.sh 编辑 Crontab 安排任务(每天0点10分执行) 打开 crontab 编辑器:$crontab -e$ 10 0 * * * /home/zy123/typecho/deploy.sh >> /home/zy123/typecho/deploy.log 2>&1 3.注意md_files文件夹所属者和deploy.sh的所属者需要保持一致。否则会报: fatal: detected dubious ownership in repository at '/home/zy123/md_files' To add an exception for this directory, call: git config --global --add safe.directory /home/zy123/md_files TODO typecho_contents表中的slug字段代表链接中的日志缩略名,如wordpress风格 /archives/{slug}.html,目前是默认int自增,有需要的话可以在插入文章时手动设置该字段。
自学
zy123
3月22日
0
7
0
上一页
1
...
3
4
5
...
11
下一页