<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>二三事</title><link>https://iharee.github.io/</link><description>Recent content on 二三事</description><generator>Hugo</generator><language>zh-CN</language><lastBuildDate>Wed, 27 May 2026 10:01:26 +0000</lastBuildDate><atom:link href="https://iharee.github.io/index.xml" rel="self" type="application/rss+xml"/><item><title>泛函分析与测度论视角下的方差缩减技术</title><link>https://iharee.github.io/math-statistics/vrt/</link><pubDate>Wed, 27 May 2026 10:01:26 +0000</pubDate><guid>https://iharee.github.io/math-statistics/vrt/</guid><description>&lt;h1 id="引言"&gt;引言&lt;/h1&gt;
&lt;p&gt;方差缩减技术（VRT, Variance Reduction Techniques）是应用在蒙特卡洛方法（MC, Monte Carlo Method）中的一系列技术，旨在不单纯增大样本量而是通过统计技巧以降低估计量的方差，从而在相同计算量下提高估计精度。&lt;/p&gt;
&lt;p&gt;设随机向量 $\boldsymbol{x}$ 的概率分布为 $p(\boldsymbol{x})$、被估计期望值等于 $\mu$ 的目标函数为 $f(\boldsymbol{x})$、样本总数为 $N$、$\boldsymbol{X}_i$ 为从总体 $\boldsymbol{X}$ 中独立抽取的第 $i$ 份样本，则蒙特卡洛模拟为
&lt;/p&gt;
$$
\mu=\int f(\boldsymbol{x})p(\boldsymbol{x})\mathrm{d}\boldsymbol{x}\approx\frac1{N}\sum^N_{i=1}f(\boldsymbol{X}_i)=\hat{\mu}_{\text{MC}}
$$&lt;p&gt;
蒙特卡洛方法的成立是由辛钦大数定律（Khinchin&amp;rsquo;s Law）、科尔莫戈罗夫强大数定律（Kolmogorov&amp;rsquo;s Strong Law）与遍历定理（Ergodic Theorem）等大数定律所严格保证的。蒙特卡洛方法的本质思想十分朴素：用随机样本的平均值逼近总体的期望。&lt;/p&gt;
&lt;p&gt;然而，许多情况下，或许是因为样本难以获得，或许是因为样本的采集成本昂贵，加之估计量的标准误 $\varepsilon\propto\frac1{\sqrt{N}}$ 的数学规律决定了单纯增加样本量对精度改进的效率低下，迫使我们考虑通过方差缩减技术以获得更精确的估计。&lt;/p&gt;
&lt;p&gt;作为一系列诞生于统计计算领域的方法，方差缩减技术在供应链管理、期权定价与强化学习等诸多场景下被广泛使用。&lt;/p&gt;
&lt;p&gt;对于蒙特卡洛方法而言，误差源于 $f(\boldsymbol{X})$ 的波动，而这种波动可被分解为函数值本身的随机性与采样测度、积分贡献区域的不匹配两种来源。站在更高的观点（泛函分析与测度论）下看，方差缩减机制可被归结为两类：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;利用子空间中的向量抵消原向量中的一部分残差波动，降低不可解释的随机性；&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;测度变换，降低采样机制带来的随机性（重要性采样）。&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;第一种方差缩减机制可以按丢弃还是保留子空间的投影被进一步区分为两种：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;丢弃子空间的投影（控制变量、对偶变量、分层抽样）；&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;保留子空间的投影（Rao-Blackwellization）。&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;第一种方差缩减机制还可以按如何生成子空间分类：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;利用条件期望（分层抽样、Rao-Blackwellization）&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;其他（控制变量、对偶变量）&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;blockquote&gt;
&lt;p&gt;撰写本文的动机，是发现 PPO 中大量使用了重要性采样。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;此外，若无特别说明，本文允许 $\boldsymbol{X}$ 为多维随机向量，但默认目标函数 $f(\boldsymbol{X})$ 为实值函数。&lt;/p&gt;
&lt;h1 id="1-控制变量-control-variates"&gt;1. 控制变量 Control Variates&lt;/h1&gt;
&lt;p&gt;如果我们事先知道一个与 $f(\boldsymbol{X})$ 相关且期望 $\mu_g$ 已知的变量 $g(\boldsymbol{X})$，那么就可以从 $f(\boldsymbol{X})$ 估计量的波动中剔除能被 $g$ 解释的部分。&lt;/p&gt;
&lt;p&gt;设 $\beta\in\mathbb{R}$ 为人为设定的系数，则修正估计量为
&lt;/p&gt;</description></item><item><title>Mixture of Experts 的数学原理（~2026 文献综述）</title><link>https://iharee.github.io/algorithms/moe/</link><pubDate>Tue, 12 May 2026 13:23:57 +0000</pubDate><guid>https://iharee.github.io/algorithms/moe/</guid><description>&lt;h1 id="引言"&gt;引言&lt;/h1&gt;
&lt;p&gt;在第一篇文章 &lt;a href="https://iharee.github.io/2024/12/08/computational_graphs_and_mlp" style="color:#7799bb; font-weight: bold; &amp;:active{color:#0066cc;} &amp;:focus{color:#0066cc;}"&gt;MLP 与 BP 算法的数学原理&lt;/a&gt; 中，我们简单地推导并实践了神经网络的基础——BP 算法。&lt;/p&gt;
&lt;p&gt;在第二篇文章 &lt;a href="https://iharee.github.io/algorithms/attention_and_transformer" style="color:#7799bb; font-weight: bold; &amp;:active{color:#0066cc;} &amp;:focus{color:#0066cc;}"&gt;经典注意力与经典 Transformer 的数学原理&lt;/a&gt; 中，我们梳理了从 RNN &amp;amp; BPTT、Seq2Seq、注意力机制再到经典 Transformer 的时间线，并详细地在其底层数学原理的层次上进行了推导与分析。&lt;/p&gt;
&lt;p&gt;本文将在前两篇文章的基础上，借助多篇或经典或前沿的文献梳理 MoE（Mixture of Experts，混合专家模型）的基础理论。如果说，BP 算法使得我们能够构造可训练的前馈神经网络，注意力与 Transformer 使得我们拥有了一种强大的序列模型范式，那么 MoE 就是 Transformer 从「小模型」真正迈向「大模型」的关键一招。&lt;/p&gt;
&lt;h1 id="dense-scaling-的瓶颈"&gt;Dense Scaling 的瓶颈&lt;/h1&gt;
&lt;p&gt;在大模型领域，有一条被称为 Scaling Law（缩放定律，参见 2020 年 Kaplan 等人的研究 &lt;a href="https://arxiv.org/abs/2001.08361"&gt;Scaling Laws for Neural Language Models&lt;/a&gt;）的经验定律：模型性能（例如训练损失）随投入资源（例如参数量）的增加而平滑提升，且遵循幂律关系。这是在众多大型实验室的实践中得出的经验总结。
&lt;/p&gt;
$$
Loss(C) \approx \left( \frac{C_{\text{min}}}{C} \right)^{\alpha}
\tag{1}
$$&lt;p&gt;
其中 $C$ 表示训练计算量（FLOPs），$\alpha$ 为缩放指数（通常取值 $0.05\sim0.1$），$C_{\text{min}}$ 则为一个常数。Scaling Law 表明，要提升模型的性能，一个可行的方案就是提高模型的参数规模。但同时 Scaling Law 也为我们估计了一个残酷的代价：要使损失降低 $n$ 倍，需要付出 $n^{\frac1{\alpha}}$ 倍的计算开销。即，参数规模的边际收益是递减的，但我们又不得不面对这个现实。&lt;/p&gt;</description></item><item><title>Deep quantile and deep composite triplet regression</title><link>https://iharee.github.io/others/deep_quantile_and_deep_composite_triplet_regression/</link><pubDate>Thu, 07 May 2026 16:20:46 +0000</pubDate><guid>https://iharee.github.io/others/deep_quantile_and_deep_composite_triplet_regression/</guid><description>&lt;h1 id="文献解读背景"&gt;文献解读背景&lt;/h1&gt;
&lt;p&gt;Tobias Fissler、Michael Merz 与 Mario V. Wüthrich 于 2021 年首先在 arXiv 发布预印本论文 &lt;a href="https://arxiv.org/abs/2112.03075"&gt;Deep Quantile and Deep Composite Model Regression&lt;/a&gt;。随后于 2023 年正式发表于期刊 Insurance: Mathematics and Economics 第 109 卷（2023 年 3 月，Pages 94–112），论文标题调整为 &lt;a href="https://www.sciencedirect.com/science/article/pii/S0167668723000070"&gt;Deep quantile and deep composite triplet regression&lt;/a&gt;。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;带有 “补充” 的标题，是本文额外补充的内容；反之，则属于原文献中的内容。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h1 id="其他方法的局限"&gt;其他方法的局限&lt;/h1&gt;
&lt;p&gt;OLS 以最小二乘函数作为损失函数，即 MSE，最优解为&lt;mark&gt;&lt;strong&gt;条件均值&lt;/strong&gt;&lt;/mark&gt;。&lt;/p&gt;
&lt;p&gt;但金融和保险数据往往是重尾且偏态的，均值的代表性不足。&lt;/p&gt;
&lt;p&gt;且最小二乘回归（OLS）假定上下误差对称，在该类数据场景下同样适用性有限。&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;对于 GLM，通常假设 $y$ 服从某个指数族分布（或 tweedie），相当于预先给定了条件分布的函数形式。&lt;/p&gt;
&lt;p&gt;文献提到，真实保险理赔数据中，&lt;mark&gt;&lt;strong&gt;bulk 和 tail 从机制上有根本不同&lt;/strong&gt;&lt;/mark&gt;，以单一参数分布统一刻画二者并不恰当，比如没有考虑到协变量对 bulk 与 tail 的不同影响。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;例如，保单持有人的年龄变量也许是解释小额赔案系统性影响的重要变量，但在解释大额赔案时却可能无关紧要。这种现象可能由从小额赔案到大额赔案时伤害类型的变化所隐含（事故保险），也可能由从小额保额到大额保额时行业细分的变化所隐含（工业火灾保险）；一个明确的例子见 &lt;a href="https://www.sciencedirect.com/science/article/pii/S0167668723000070#br0180"&gt;Fung et al. (2022)&lt;/a&gt; 第 5.3 节。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;而且 GLM 能直接指导的也是均值。&lt;/p&gt;</description></item><item><title>经典注意力与经典 Transformer 的数学原理</title><link>https://iharee.github.io/algorithms/attention_and_transformer/</link><pubDate>Sun, 22 Mar 2026 22:55:00 +0000</pubDate><guid>https://iharee.github.io/algorithms/attention_and_transformer/</guid><description>&lt;p&gt;* 本文的部分示意图使用了 AI 辅助创作，其余有明确标注的示意图则引用自参考文献。&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;若无特别说明，本文中的单个向量默认视为列向量。比如，在 RNN、BPTT 与 Bahdanau Attention 部分，$\boldsymbol{x}_t,\boldsymbol{h}_t,\boldsymbol{s}_t,\boldsymbol{a}_t$ 等单个向量都按列向量书写。&lt;/p&gt;
&lt;p&gt;而在 attention 与 Transformer 章节的矩阵记号中，为便于书写整段序列的矩阵乘法，序列矩阵统一按行堆叠：若第 $i$ 个 token 的表示向量为列向量 $\boldsymbol{x}_i$，则矩阵 $\boldsymbol{X}$ 的第 $i$ 行为 $\boldsymbol{x}_i^T$。相应地，$\boldsymbol{Q},\boldsymbol{K},\boldsymbol{V}$ 的第 $i$ 行分别记为 $\boldsymbol{q}_i^T,\boldsymbol{k}_i^T,\boldsymbol{v}_i^T$。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Token 指模型处理数据的最小单位。在 CV（Computer Vision，计算机视觉）中常指图像切分后的 patch，在音频中指离散化的特征片段，而在 NLP（Natural Language Processing，自然语言处理）中则是指文本分词（字、词或子词）。本文后续所指的 token 均可以被理解为 NLP 范畴下的文本单元，token embedding 则是通过嵌入层将 token ID 映射至连续向量空间中的稠密语义表示。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h1 id="rnn"&gt;RNN&lt;/h1&gt;
&lt;h2 id="背景引入"&gt;背景引入&lt;/h2&gt;
&lt;p&gt;在前文 &lt;a href="https://iharee.github.io/2024/12/08/computational_graphs_and_mlp" style="color:#7799bb; font-weight: bold; &amp;:active{color:#0066cc;} &amp;:focus{color:#0066cc;}"&gt;MLP 与 BP 算法的数学原理&lt;/a&gt; 中，我们从数学上推导了普通 FFN（Feed-Forward Network，前馈神经网络）的误差反向传播算法，并最终编码实现了一个能够训练并完成分类任务的 MLP。&lt;/p&gt;
&lt;p&gt;MLP（Multi-Layer Perceptron，多层感知机）是最经典、最基础的一种前馈神经网络，它只接受固定维度的张量 $\boldsymbol{x}$，并在经过内部若干层全连接层的非线性变换 $f(\boldsymbol{x})=\varphi(\boldsymbol{Wx}+\boldsymbol{b})$ 后，最终输出固定维度的张量 $\boldsymbol{y}$。对于能够确定输入与输出张量维度的任务，例如图像识别、缺陷检测等，输入输出张量维度固定是能够接受的。但是，对于序列数据，特别是那些具有强时间相关性的序列数据，譬如股票指数的时间序列、自然语言等，MLP 便显得力不从心了，主要体现在：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;输入维度固定，意味着无法处理可变长序列；&lt;/li&gt;
&lt;li&gt;固定维度与无记忆性的假设，使得模型更难捕捉到序列元素间的依赖关系。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;一个简单的改进就是 RNN（Recurrent Neural Network，循环神经网络）。RNN 是一种基本的序列模型，下面介绍 RNN，并做简要的数学推导。&lt;/p&gt;</description></item><item><title>昨夜闲潭梦落花</title><link>https://iharee.github.io/essays/%E6%98%A8%E5%A4%9C%E9%97%B2%E6%BD%AD%E6%A2%A6%E8%90%BD%E8%8A%B1/</link><pubDate>Wed, 07 Jan 2026 23:33:55 +0000</pubDate><guid>https://iharee.github.io/essays/%E6%98%A8%E5%A4%9C%E9%97%B2%E6%BD%AD%E6%A2%A6%E8%90%BD%E8%8A%B1/</guid><description>&lt;hr&gt;
&lt;p&gt;　　过去一年也发生了许多事。&lt;/p&gt;
&lt;p&gt;　　去年相当长一部分时间我都在疗养，所以并没有复学。由于治疗基本上每月只会经历一次，一次治疗过程又只占用两天时间，因此上半年的主旋律就是窝在家里想办法给自己找事情做，好让自己不要胡思乱想。&lt;/p&gt;
&lt;p&gt;　　一直在家的日子，我在经常在很长一段时间内都不会出门，似乎身体都要因为长期晒不到太阳而生霉。与学校和社会都脱节太久，这种感觉真令人不安。那些无聊的时间里，我通过网课自学了数据结构、计算机网络和操作系统。同时也学习了一些 Java 知识，比如 Spring 开发。&lt;/p&gt;
&lt;p&gt;　　从五月一号开始，大概是看着空间和朋友圈大家充实的五一假期活动而我却无处可去（这份情绪其实每次长假都会有），于是就开始通过做力扣算法题转移自己注意力。一整个五月份，我从起床开始直到进入梦乡，都在电脑面前坐着写力扣。像着魔似的，我想可能是没有人陪我打发时间的缘故，恰好转码也对数据结构算法有要求（来自刻板印象），那么我就做做算法题好了。一方面通过做算法题学习新知识的感受很棒，另一方面每当终于独立解决或是彻底弄清一道算法题也能带来十分及时的正反馈——这是在休学生活中相当匮乏的，于是我便一度“沉迷”于力扣，热情持续不减，这一下子就是整整五个月度。&lt;/p&gt;
&lt;img src="https://iharee.github.io/images/昨夜闲潭梦落花/lc.jpg" alt="2025力扣记录" style="zoom: 30%;" /&gt;
&lt;p&gt;　　在那几个月里，我做了一段时间的 PJSK bot。有时连着做了几天力扣，想暂时干干别的事，我就会用 Java 写写 bot。有出于实践 Java 的考量，但更多的还是“没事找事”。&lt;/p&gt;
&lt;p&gt;　　时间一下就来到了十月。是的，去年的前九个月并没有什么好回忆的，每天像一具行尸走肉一样空有大把时间却不知如何使用，也没有人陪着我，想尽办法地打磨时光。很空虚，每天都在和自己情绪内耗，这么长的时间里我只有在法定长假才会和光、卜约着出门逛街，因为他俩只有此时才都有空。也就是这少得可怜的几次，就几乎是我在成都全部主动出门见光的机会了。&lt;/p&gt;
&lt;p&gt;　　十月份开始我有点焦虑。那时 2025 年安排的疗程全部告一段落（是否康复直到今天都不知道，不过春节前后就是下一次做检查的时间了），我迫切地想要找份实习。起草简历、陆陆续续开始投递，我投递的目标基本上都是 Java 后端开发。结果可以用无人在意来形容，投递了大大小小的公司约 160 家，如果不算现在正就职的得物，只有星环和字节给了我面试机会。其中字节在一面就把我快速挂掉了，星环则问了些很基础的 Java 知识便让我去报道上班。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;这投遍了简历却几乎没有面试机会的经历，真让人感到无助。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;　　随后的十一月我来到了上海，入职了星环。匆匆忙忙签了三个月的租房合同，在松江与人合租，2500 / 月，光是中介费就一次性花掉了一千来块，现在想来真的很亏，因为不论是距离星环还是距离现在的得物都很远很远，价格还没多便宜。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;来上海也有一个重要原因，就是在上海也有一些互联网社畜朋友，比如清水。见见活人，至少比家里继续蹲着无所事事好得多。&lt;/p&gt;
&lt;p&gt;当然，也是因为我此前没有来过上海——如果不算转机。在家待得太久了，时不时换一个地方、同时也换一种生活方式吧，为生活制造一些新鲜感。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;　　当然我更无法接受的是星环把我当外包整。再怎么说我也是在读 985 硕士生吧？入职那天我才知道我的工作不是在星环本部研发产品，而是被外派到浦发银行去做很低级的信创改造。在浦发做外包工作的每一天我都十分煎熬，处处都让我感到极度恶心，本身就是很没有价值的工作内容，银行内还有太多莫名其妙的条规制度，感受不到任何尊重。于是干了二十来天，我就愤然辞职了。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;就连差不多时间入职的真正的外包同事在我跑路后也很快跑路了，她也受不了。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;　　接着就进入了十二月。我大概是十二月第二周的星期三辞职的，恰好那段时间陈哥的组拿到了两个实习生名额，于是我就托陈哥帮我内推了一下简历。最后是在第四周星期一面试我的。虽然从一开始我就把这场面试的期待值降到了最低，但面试完后其实我还是十分在意结果的，因为万一没能拿到这份 offer，我真的会自我怀疑我是否走错了道路。&lt;/p&gt;
&lt;p&gt;　　但其实——我在前一周（第三周）就预定了（第四周）星期二回重庆的机票！因为周末要回去参加重大 EF 社组织的「轻音二六」，算是冬日社团祭吧！活动组织者、EF 现社长，也是我的朋友，汐水，十一月时就问我到时候要不要回重庆来、要不要出 cos。由于那会我还没狠下心来辞职跑路，所以一直没有计划。直到这会已经决绝地辞掉了那个令我讨厌的工作，于是我就赶快在闲鱼收了毛，抓紧订了美瞳、约了妆娘，打算就在周末的活动上出我人生的第一次 cos。虽然我真的很担心到底能不能拿到这份 offer，但其实我更加期待周末我的第一次 cos 会是什么样子。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;那时我心想：我眼下最希望三件事成真，一是收到得物的 offer，二是 cos 初体验希望能出得好看一点，三是身体永远健康。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;　　到了轻音二六活动的那天，cos 出得比较顺利，玩的也很开心。而且，就在星期四的时候，我收到了确认 offer 的电话。这算是“双喜临门”吧？因此，在星期日幸福了一整天后，第二天我就从重庆又飞回了上海，在得物办了入职。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;希望在 2026，当初的第三个愿望也能实现吧。我不想再回到医院了。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;　　在这里放一张我最满意的场照吧，我真的好喜欢这张。不枉我来上海后严格控制饮食减肥的努力……&lt;/p&gt;
&lt;img src="https://iharee.github.io/images/昨夜闲潭梦落花/Image_1767804335128.jpg" alt="星乃一歌场照" style="zoom: 22%;" /&gt;
&lt;blockquote&gt;
&lt;p&gt;这里就要说明一下，我大一大二时有着顶级建模，入学时室友李见我第一面就跟我说 “你好好看！”。然而考研那半年给我考成了肥🐖，直到近几个月、来上海后通过刻意控制饮食才终于减了一些回去，虽然离当初的身材差得依然还多。&lt;/p&gt;
&lt;p&gt;而我会在 2025 年末出 cos 这一点，可能主要是被江波害的。不过，我本就很愿意尝试一下未曾尝试的事物。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;　　现在，我正在得物工作，主要内容是做 AI 中台的建设。虽然目前只入职了一周，但没有了在上家的那种让人窒息的压抑感。这是我的第一段互联网研发实习，我会认真对待的。更重要的是，在这里做的也不再是低级无趣的工作，能真切感受到成长，也不会再有被整个环境所轻视的感觉。&lt;/p&gt;</description></item><item><title>PJSK 证书抓包教程</title><link>https://iharee.github.io/essays/pjskcapture/</link><pubDate>Wed, 23 Jul 2025 06:03:18 +0000</pubDate><guid>https://iharee.github.io/essays/pjskcapture/</guid><description>&lt;h1&gt;&lt;div style="color: #B22222;"&gt;25 / 10 / 4 更：本文不再更新&lt;/div&gt;&lt;/h1&gt;
&lt;div style="color: #DC143C;"&gt;&lt;strong&gt;本文不再更新。&lt;/strong&gt;&lt;/div&gt;
&lt;br&gt;
&lt;div style="color: #DC143C;"&gt;&lt;strong&gt;这篇文章将被保留并归档，但不会再进行任何更新。如果你看到这篇文章时本文仍对你有所帮助，那么我此刻选择将本文保留而不是删除，大概就是有意义的吧？&lt;/strong&gt;&lt;/div&gt;
&lt;h1&gt;25 / 8 / 31 更：请先阅读！&lt;/h1&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;i&gt;国服安卓并非无解~&lt;/i&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;br&gt;
本文的模拟器抓包部分流程是基于新版本 MuMu 模拟器撰写的，但国服安卓（包括官服与 b 服）会检测 Windows 上的新版本 MuMu 模拟器，若坚持使用本文方法与最新版 MuMu 模拟器则需要通过逆向手段绕过。这非常麻烦，但我们可以避免这一问题。
&lt;br&gt;
国服安卓抓包最简单的方式是考虑老版本 MuMu 模拟器或一些小众模拟器，因为国服安卓的检测手段不会针对这些模拟器。例如，可以参考 &lt;a href="https://docs.qq.com/doc/DVnNJdU1RU2JqRVJJ" style="color: #1E90FF;"&gt;官服、B服安卓手机抓包教程&lt;/a&gt;，这篇文档提供了使用其他模拟器以简单但有效地绕过国服主流模拟器检测的解决方案。
&lt;br&gt;
本文的方案总体上是通用的，但可能会因为后续版本的模拟器检测、SSL Pinning 等问题需要进行一些额外的操作。对于国服安卓，我建议可以先阅读上文所给出的引用链接的文档。
&lt;h1 id="安卓模拟器证书抓包"&gt;安卓模拟器证书抓包&lt;/h1&gt;
&lt;h2 id="前言"&gt;前言&lt;/h2&gt;
&lt;p&gt;考虑到台服、韩服不支持引继，加之不少实体安卓设备 root 困难（无论是否经过自定义证书，至少需要 root 才能解密 SSL 流量），因此台服、韩服的安卓设备用户抓包需要借助模拟器。在 root 的模拟器中可以使用证书解密流量，也可以考虑 eCapture（但依赖内核版本），本部分将一步一步介绍在模拟器上证书抓包的详细流程。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;国服安卓版本存在针对主流模拟器特征检测和代理检测，其中
&lt;ul&gt;
&lt;li&gt;主流模拟器检测使得本方法的示例不直接适用于国服安卓版本，可以考虑逆向 hook 或更换其他模拟器，更换模拟器的方案即为文章 &lt;a href="https://docs.qq.com/doc/DVnNJdU1RU2JqRVJJ"&gt;官服、B服安卓手机抓包教程&lt;/a&gt; 所介绍的方案；&lt;/li&gt;
&lt;li&gt;代理检测可以考虑支持 MITM 的代理客户端绕过；&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;日服、国际服安卓用户可以考虑引继抓包，但也可以模拟器抓包；&lt;/li&gt;
&lt;li&gt;对于苹果用户，建议使用模块抓包，更加自动化。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;注：截止至 2025 年 7 月，主流安卓模拟器内核版本均低于 5.5，eCapture 在这些设备上无法正常工作。经研究，可能是在低于 5.5 版本的内核上 &lt;code&gt;bpf_probe_read_user&lt;/code&gt; 无法读取用户态数据导致的，因此本文主要介绍证书抓包的方法。持有实体安卓设备的用户可以考虑 eCapture。&lt;/p&gt;
&lt;h2 id="准备工作"&gt;准备工作&lt;/h2&gt;
&lt;p&gt;软件：&lt;/p&gt;</description></item><item><title>Spring 框架学习研究札记</title><link>https://iharee.github.io/others/spring-%E6%A1%86%E6%9E%B6%E5%AD%A6%E4%B9%A0%E7%A0%94%E7%A9%B6%E6%9C%AD%E8%AE%B0/</link><pubDate>Wed, 28 May 2025 03:29:00 +0000</pubDate><guid>https://iharee.github.io/others/spring-%E6%A1%86%E6%9E%B6%E5%AD%A6%E4%B9%A0%E7%A0%94%E7%A9%B6%E6%9C%AD%E8%AE%B0/</guid><description>&lt;!--

学习视频：&lt;a href="https://www.bilibili.com/video/BV14WtLeDEit"&gt;尚硅谷最新版SSM教程，基于AI的全新ssm框架实战&lt;/a&gt;，强烈推荐！

--&gt;
&lt;p&gt;这篇文档仅仅是我自己的笔记。比如，我会整理 Spring 框架常见的容器相关注解，但不会对容器注解本身做进一步解释，也不会解释 IoC 的概念，只起目录与导航的作用——因为这些内容的详情要么在官方文档中可以很轻松地查到，要么十分基础。但对于 Bean 的生命周期这类比较重要的关键点，我将重点分析并记录。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Spring Boot 3.3.3&lt;/p&gt;
&lt;p&gt;Spring Framework 6.1.6&lt;/p&gt;
&lt;p&gt;JDK 17&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h1 id="spring-core--aop"&gt;Spring Core &amp;amp; AOP&lt;/h1&gt;
&lt;h2 id="ioc--di"&gt;IoC &amp;amp; DI&lt;/h2&gt;
&lt;p&gt;控制反转（Inversion of Control）是一种设计原则，指对象的创建、销毁与依赖关系不再由用户负责，而是将对象的生命周期交由容器统一管理。&lt;/p&gt;
&lt;p&gt;依赖注入（Dependency Injection）是控制反转的最常见实现方式。&lt;/p&gt;
&lt;h3 id="spring-bean-接口与注解"&gt;Spring Bean 接口与注解&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;@Configuration&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;@ComponentScan&lt;/code&gt;、&lt;code&gt;@Import&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;@Bean&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;@Component&lt;/code&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;@Controller&lt;/code&gt;（&lt;code&gt;@RestController&lt;/code&gt;），&lt;code&gt;@Service&lt;/code&gt;，&lt;code&gt;@Repository&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;@Scope&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;@Lazy&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;接口 &lt;code&gt;FactoryBean&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;@Conditional&lt;/code&gt;、接口 &lt;code&gt;Conditional&lt;/code&gt; 及一系列派生注解&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;@Profile&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Spring Boot 如此强大，最主要的原因就是其在底层广泛而灵活地使用了 &lt;code&gt;@Conditional&lt;/code&gt;。如果说最初基于 XML 配置的 Spring 设计哲学是配置优于代码，那么后来基于注解的 Spring 为我们大幅减少甚至几乎完全消灭了冗长繁琐的 XML 配置，而 Spring Boot 在这基础上更进一步，通过让约定优于配置，让一个刚入门的开发者也能够轻松上手。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;@Autowired&lt;/code&gt;，&lt;code&gt;@Resource&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;在源码中，&lt;code&gt;@Autowired&lt;/code&gt; 实际上是由 &lt;code&gt;AutowiredAnnotationBeanPostProcessor&lt;/code&gt; 实现的，这是一个专门用于处理 &lt;code&gt;@Autowired&lt;/code&gt; 的一种特殊的 &lt;code&gt;BeanPostProcessor&lt;/code&gt;，在每个 Bean 或组件被创建后调用其特殊的 &lt;code&gt;postProcessProperties&lt;/code&gt; 方法或 &lt;code&gt;postProcessBeforeInitialization&lt;/code&gt; 方法，通过反射分析目标 Bean 的全部注解、字段、方法、构造器等等，然后对具有 &lt;code&gt;@Autowired&lt;/code&gt; 注解修饰的对象尝试在容器中进行匹配，如果匹配成功则注入依赖。&lt;/p&gt;</description></item><item><title>MLP 与 BP 算法的数学原理</title><link>https://iharee.github.io/algorithms/computational_graphs_and_mlp/</link><pubDate>Sun, 08 Dec 2024 06:10:23 +0000</pubDate><guid>https://iharee.github.io/algorithms/computational_graphs_and_mlp/</guid><description>&lt;p&gt;关于自动微分机制的数学证明放在文末，首先给出自动微分的程序实现。因为是我笔算进行推导的，可能存在谬误。&lt;/p&gt;
&lt;pre&gt;&lt;div style="font-family: Consolas, 'Courier New', monospace;"&gt;Python version: 3.12.4
numpy version: 1.26.4
sklearn version: 1.3.0&lt;/div&gt;&lt;/pre&gt;
&lt;h2 id="计算图定义"&gt;计算图定义&lt;/h2&gt;
&lt;p&gt;计算图（computational graph）是一种被用于&lt;code&gt;pytorch&lt;/code&gt;与&lt;code&gt;tensorflow&lt;/code&gt;中进行自动微分以实现误差的反向传播、进而计算各参数梯度的技术，这使得我们可以方便地使用梯度更新神经网络的参数。其中，&lt;code&gt;pytorch&lt;/code&gt;使用动态计算图设计，&lt;code&gt;tensorflow&lt;/code&gt;使用静态计算图设计。&lt;/p&gt;
&lt;p&gt;我们的实现中，计算图与自动微分系统被“嵌入”在了层的定义。&lt;code&gt;pytorch&lt;/code&gt;在源码中定义了计算图基类，通过重载运算符等方法实现计算图的生成。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;import&lt;/span&gt; numpy &lt;span style="color:#66d9ef"&gt;as&lt;/span&gt; np
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;from&lt;/span&gt; sklearn.datasets &lt;span style="color:#f92672"&gt;import&lt;/span&gt; make_moons
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;class&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;Linear&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;def&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;__init__&lt;/span&gt;(self, inputFeatures, outputFeatures, bias&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;True&lt;/span&gt;):
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; self&lt;span style="color:#f92672"&gt;.&lt;/span&gt;weights &lt;span style="color:#f92672"&gt;=&lt;/span&gt; np&lt;span style="color:#f92672"&gt;.&lt;/span&gt;random&lt;span style="color:#f92672"&gt;.&lt;/span&gt;rand(inputFeatures, outputFeatures)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; self&lt;span style="color:#f92672"&gt;.&lt;/span&gt;bias &lt;span style="color:#f92672"&gt;=&lt;/span&gt; np&lt;span style="color:#f92672"&gt;.&lt;/span&gt;random&lt;span style="color:#f92672"&gt;.&lt;/span&gt;rand(outputFeatures)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;def&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;__call__&lt;/span&gt;(self, x):
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; self&lt;span style="color:#f92672"&gt;.&lt;/span&gt;input &lt;span style="color:#f92672"&gt;=&lt;/span&gt; x
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; self&lt;span style="color:#f92672"&gt;.&lt;/span&gt;output &lt;span style="color:#f92672"&gt;=&lt;/span&gt; x &lt;span style="color:#f92672"&gt;@&lt;/span&gt; self&lt;span style="color:#f92672"&gt;.&lt;/span&gt;weights
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; self&lt;span style="color:#f92672"&gt;.&lt;/span&gt;bias &lt;span style="color:#f92672"&gt;is&lt;/span&gt; &lt;span style="color:#f92672"&gt;not&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;False&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; self&lt;span style="color:#f92672"&gt;.&lt;/span&gt;output &lt;span style="color:#f92672"&gt;+=&lt;/span&gt; self&lt;span style="color:#f92672"&gt;.&lt;/span&gt;bias
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; self&lt;span style="color:#f92672"&gt;.&lt;/span&gt;output
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;def&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;paramenters&lt;/span&gt;(self):
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; self&lt;span style="color:#f92672"&gt;.&lt;/span&gt;bias &lt;span style="color:#f92672"&gt;is&lt;/span&gt; &lt;span style="color:#f92672"&gt;not&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;False&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; [self&lt;span style="color:#f92672"&gt;.&lt;/span&gt;output, self&lt;span style="color:#f92672"&gt;.&lt;/span&gt;bias]
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; [self&lt;span style="color:#f92672"&gt;.&lt;/span&gt;output]
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;def&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;backward&lt;/span&gt;(self, grad_output, learning_rate):
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; grad_input &lt;span style="color:#f92672"&gt;=&lt;/span&gt; grad_output &lt;span style="color:#f92672"&gt;@&lt;/span&gt; self&lt;span style="color:#f92672"&gt;.&lt;/span&gt;weights&lt;span style="color:#f92672"&gt;.&lt;/span&gt;T
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; grad_weights &lt;span style="color:#f92672"&gt;=&lt;/span&gt; self&lt;span style="color:#f92672"&gt;.&lt;/span&gt;input&lt;span style="color:#f92672"&gt;.&lt;/span&gt;T &lt;span style="color:#f92672"&gt;@&lt;/span&gt; grad_output
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; grad_bias &lt;span style="color:#f92672"&gt;=&lt;/span&gt; np&lt;span style="color:#f92672"&gt;.&lt;/span&gt;sum(grad_output, axis&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;) &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; self&lt;span style="color:#f92672"&gt;.&lt;/span&gt;bias &lt;span style="color:#f92672"&gt;is&lt;/span&gt; &lt;span style="color:#f92672"&gt;not&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;None&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;else&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;None&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; self&lt;span style="color:#f92672"&gt;.&lt;/span&gt;weights &lt;span style="color:#f92672"&gt;-=&lt;/span&gt; learning_rate &lt;span style="color:#f92672"&gt;*&lt;/span&gt; grad_weights
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; self&lt;span style="color:#f92672"&gt;.&lt;/span&gt;bias &lt;span style="color:#f92672"&gt;is&lt;/span&gt; &lt;span style="color:#f92672"&gt;not&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;None&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; self&lt;span style="color:#f92672"&gt;.&lt;/span&gt;bias &lt;span style="color:#f92672"&gt;-=&lt;/span&gt; learning_rate &lt;span style="color:#f92672"&gt;*&lt;/span&gt; grad_bias
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; grad_input
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;class&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;Sigmoid&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;def&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;__call__&lt;/span&gt;(self, x):
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; self&lt;span style="color:#f92672"&gt;.&lt;/span&gt;output &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt; &lt;span style="color:#f92672"&gt;/&lt;/span&gt; (&lt;span style="color:#ae81ff"&gt;1&lt;/span&gt; &lt;span style="color:#f92672"&gt;+&lt;/span&gt; np&lt;span style="color:#f92672"&gt;.&lt;/span&gt;exp(&lt;span style="color:#f92672"&gt;-&lt;/span&gt;x))
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; self&lt;span style="color:#f92672"&gt;.&lt;/span&gt;output
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;def&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;backward&lt;/span&gt;(self, grad_output, learning_rate):
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; grad_input &lt;span style="color:#f92672"&gt;=&lt;/span&gt; grad_output &lt;span style="color:#f92672"&gt;*&lt;/span&gt; self&lt;span style="color:#f92672"&gt;.&lt;/span&gt;output &lt;span style="color:#f92672"&gt;*&lt;/span&gt; (&lt;span style="color:#ae81ff"&gt;1&lt;/span&gt; &lt;span style="color:#f92672"&gt;-&lt;/span&gt; self&lt;span style="color:#f92672"&gt;.&lt;/span&gt;output)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; grad_input
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;class&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;Softmax&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;def&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;__call__&lt;/span&gt;(self, x):
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; self&lt;span style="color:#f92672"&gt;.&lt;/span&gt;output &lt;span style="color:#f92672"&gt;=&lt;/span&gt; np&lt;span style="color:#f92672"&gt;.&lt;/span&gt;exp(x &lt;span style="color:#f92672"&gt;-&lt;/span&gt; np&lt;span style="color:#f92672"&gt;.&lt;/span&gt;max(x, axis&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;, keepdims&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;True&lt;/span&gt;))
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; self&lt;span style="color:#f92672"&gt;.&lt;/span&gt;output &lt;span style="color:#f92672"&gt;/=&lt;/span&gt; np&lt;span style="color:#f92672"&gt;.&lt;/span&gt;sum(self&lt;span style="color:#f92672"&gt;.&lt;/span&gt;output, axis&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;, keepdims&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;True&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; self&lt;span style="color:#f92672"&gt;.&lt;/span&gt;output
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;# def backward(self, grad_output, learning_rate):&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;# grad_input = grad_output.copy()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;# batch_size = grad_output.shape[0]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;# for i in range(batch_size):&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;# y = self.output[i][:, None]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;# jacobian = np.diag(y) - np.outer(y, y)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;# grad_input[i] = jacobian @ grad_output[i]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;# return grad_input&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;class&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;Sequential&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;def&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;__init__&lt;/span&gt;(self, layers):
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; self&lt;span style="color:#f92672"&gt;.&lt;/span&gt;layers &lt;span style="color:#f92672"&gt;=&lt;/span&gt; layers
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;def&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;__call__&lt;/span&gt;(self, x):
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;for&lt;/span&gt; layer &lt;span style="color:#f92672"&gt;in&lt;/span&gt; self&lt;span style="color:#f92672"&gt;.&lt;/span&gt;layers:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; x &lt;span style="color:#f92672"&gt;=&lt;/span&gt; layer(x)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; self&lt;span style="color:#f92672"&gt;.&lt;/span&gt;output &lt;span style="color:#f92672"&gt;=&lt;/span&gt; x
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; self&lt;span style="color:#f92672"&gt;.&lt;/span&gt;output
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;def&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;predict_proba&lt;/span&gt;(self, x):
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; logits &lt;span style="color:#f92672"&gt;=&lt;/span&gt; self(x)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; e_x &lt;span style="color:#f92672"&gt;=&lt;/span&gt; np&lt;span style="color:#f92672"&gt;.&lt;/span&gt;exp(logits &lt;span style="color:#f92672"&gt;-&lt;/span&gt; np&lt;span style="color:#f92672"&gt;.&lt;/span&gt;max(logits))
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; e_x &lt;span style="color:#f92672"&gt;/&lt;/span&gt; e_x&lt;span style="color:#f92672"&gt;.&lt;/span&gt;sum(axis&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;, keepdims&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;True&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;def&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;paramenters&lt;/span&gt;(self):
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; [p &lt;span style="color:#66d9ef"&gt;for&lt;/span&gt; layer &lt;span style="color:#f92672"&gt;in&lt;/span&gt; self&lt;span style="color:#f92672"&gt;.&lt;/span&gt;layers &lt;span style="color:#66d9ef"&gt;for&lt;/span&gt; p &lt;span style="color:#f92672"&gt;in&lt;/span&gt; layer&lt;span style="color:#f92672"&gt;.&lt;/span&gt;paramenters()]
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="基于计算图的mlp定义"&gt;基于计算图的MLP定义&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;class&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;MLP&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;def&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;__init__&lt;/span&gt;(self):
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; self&lt;span style="color:#f92672"&gt;.&lt;/span&gt;model &lt;span style="color:#f92672"&gt;=&lt;/span&gt; Sequential([
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; Linear(&lt;span style="color:#ae81ff"&gt;2&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;4&lt;/span&gt;), Sigmoid(),
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; Linear(&lt;span style="color:#ae81ff"&gt;4&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;4&lt;/span&gt;), Sigmoid(),
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; Linear(&lt;span style="color:#ae81ff"&gt;4&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;2&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; ])
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; self&lt;span style="color:#f92672"&gt;.&lt;/span&gt;softmax &lt;span style="color:#f92672"&gt;=&lt;/span&gt; Softmax()
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;def&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;__call__&lt;/span&gt;(self, x):
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; self&lt;span style="color:#f92672"&gt;.&lt;/span&gt;model(x)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;def&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;forward&lt;/span&gt;(self, x):
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; self&lt;span style="color:#f92672"&gt;.&lt;/span&gt;model(x)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;def&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;backwardAndGradientDescent&lt;/span&gt;(self, x, y, learning_rate):
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;&amp;#39;&amp;#39;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt; x: input darta vector, like [[0.5, -1.2], [0.7, 0.3], [-0.2, 0.8]]
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt; y: labels vector, like [0, 1, 0]
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt; &amp;#39;&amp;#39;&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; batch_size &lt;span style="color:#f92672"&gt;=&lt;/span&gt; x&lt;span style="color:#f92672"&gt;.&lt;/span&gt;shape[&lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;]
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; logits &lt;span style="color:#f92672"&gt;=&lt;/span&gt; self&lt;span style="color:#f92672"&gt;.&lt;/span&gt;forward(x)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; grad_output &lt;span style="color:#f92672"&gt;=&lt;/span&gt; logits&lt;span style="color:#f92672"&gt;.&lt;/span&gt;copy()
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; grad_output[range(batch_size), y] &lt;span style="color:#f92672"&gt;-=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt; &lt;span style="color:#75715e"&gt;# cross entropy gradient&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; grad_output &lt;span style="color:#f92672"&gt;/=&lt;/span&gt; batch_size
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;for&lt;/span&gt; layer &lt;span style="color:#f92672"&gt;in&lt;/span&gt; reversed(self&lt;span style="color:#f92672"&gt;.&lt;/span&gt;model&lt;span style="color:#f92672"&gt;.&lt;/span&gt;layers):
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; grad_output &lt;span style="color:#f92672"&gt;=&lt;/span&gt; layer&lt;span style="color:#f92672"&gt;.&lt;/span&gt;backward(grad_output, learning_rate)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;def&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;probability&lt;/span&gt;(self, x):
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;&amp;#39;&amp;#39;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt; x: input darta vector, like [[0.5, -1.2], [0.7, 0.3], [-0.2, 0.8]]
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt; return: probability vector, like [[0.88, 0.12], [0.45, 0.55], [0.31, 0.69]]
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt; &amp;#39;&amp;#39;&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; batch_size &lt;span style="color:#f92672"&gt;=&lt;/span&gt; x&lt;span style="color:#f92672"&gt;.&lt;/span&gt;shape[&lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;]
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; logits &lt;span style="color:#f92672"&gt;=&lt;/span&gt; self&lt;span style="color:#f92672"&gt;.&lt;/span&gt;forward(x)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; self&lt;span style="color:#f92672"&gt;.&lt;/span&gt;softmax(logits)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;def&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;classify&lt;/span&gt;(self, x):
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; np&lt;span style="color:#f92672"&gt;.&lt;/span&gt;argmax(self&lt;span style="color:#f92672"&gt;.&lt;/span&gt;probability(x), axis&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="训练过程"&gt;训练过程&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;X, y &lt;span style="color:#f92672"&gt;=&lt;/span&gt; make_moons(n_samples&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;1000&lt;/span&gt;, noise&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;0.1&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;batch_size&lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;50&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;max_steps &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;50000&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;learning_rate &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;0.05&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;mlp &lt;span style="color:#f92672"&gt;=&lt;/span&gt; MLP()
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;lossRecord &lt;span style="color:#f92672"&gt;=&lt;/span&gt; []
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;for&lt;/span&gt; step &lt;span style="color:#f92672"&gt;in&lt;/span&gt; range(max_steps):
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; indices &lt;span style="color:#f92672"&gt;=&lt;/span&gt; np&lt;span style="color:#f92672"&gt;.&lt;/span&gt;arange(X&lt;span style="color:#f92672"&gt;.&lt;/span&gt;shape[&lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;])
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; np&lt;span style="color:#f92672"&gt;.&lt;/span&gt;random&lt;span style="color:#f92672"&gt;.&lt;/span&gt;shuffle(indices)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; X, y &lt;span style="color:#f92672"&gt;=&lt;/span&gt; X[indices], y[indices]
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;for&lt;/span&gt; i &lt;span style="color:#f92672"&gt;in&lt;/span&gt; range(&lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;, X&lt;span style="color:#f92672"&gt;.&lt;/span&gt;shape[&lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;], batch_size):
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; X_batch &lt;span style="color:#f92672"&gt;=&lt;/span&gt; X[i:i&lt;span style="color:#f92672"&gt;+&lt;/span&gt;batch_size]
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; y_batch &lt;span style="color:#f92672"&gt;=&lt;/span&gt; y[i:i&lt;span style="color:#f92672"&gt;+&lt;/span&gt;batch_size]
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; mlp&lt;span style="color:#f92672"&gt;.&lt;/span&gt;backwardAndGradientDescent(X_batch, y_batch, learning_rate)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; step &lt;span style="color:#f92672"&gt;%&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;10000&lt;/span&gt; &lt;span style="color:#f92672"&gt;==&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; output_batch &lt;span style="color:#f92672"&gt;=&lt;/span&gt; mlp&lt;span style="color:#f92672"&gt;.&lt;/span&gt;forward(X_batch)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; epsilon &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;1e-12&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; loss &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#f92672"&gt;-&lt;/span&gt;np&lt;span style="color:#f92672"&gt;.&lt;/span&gt;mean(np&lt;span style="color:#f92672"&gt;.&lt;/span&gt;log(output_batch[range(batch_size), y_batch] &lt;span style="color:#f92672"&gt;+&lt;/span&gt; epsilon))
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; lossRecord&lt;span style="color:#f92672"&gt;.&lt;/span&gt;append(loss)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; print(&lt;span style="color:#e6db74"&gt;f&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;Step &lt;/span&gt;&lt;span style="color:#e6db74"&gt;{&lt;/span&gt;step&lt;span style="color:#e6db74"&gt;}&lt;/span&gt;&lt;span style="color:#e6db74"&gt;, Loss: &lt;/span&gt;&lt;span style="color:#e6db74"&gt;{&lt;/span&gt;loss&lt;span style="color:#e6db74"&gt;}&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;打印：&lt;/p&gt;</description></item><item><title>考研感想</title><link>https://iharee.github.io/essays/%E8%80%83%E7%A0%94%E6%84%9F%E6%83%B3/</link><pubDate>Mon, 25 Dec 2023 00:23:45 +0000</pubDate><guid>https://iharee.github.io/essays/%E8%80%83%E7%A0%94%E6%84%9F%E6%83%B3/</guid><description>&lt;h1 id="考后感想"&gt;考后感想&lt;/h1&gt;
&lt;p&gt;  走出考场、回到宿舍，对着手机发了一会呆，恍恍惚惚，若有所失。毕竟是为之努力了半年的目标，一时间不知道接下来做什么好。虽然，好像我并不怎么努力。&lt;/p&gt;
&lt;p&gt;  我觉得我不算一个勤奋努力的考生，用这个词用形容我显然是不合适的；身边一些朋友都觉得我很努力在准备，然而他们距离我毕竟还是太遥远了。哪个考研的人会在备考时玩手机刷视频到凌晨五六点呢？我也没有用功到卸载所有游戏、所有社交软件，甚至在考研的前几周买了一部东方ip的模拟经营游戏《东方夜雀食堂》，短短两天时间内足足玩了15小时——我平常学习两天下来的时间都没这么多。&lt;/p&gt;
&lt;p&gt;  再者，十月底时，我连着几天把EVA旧TV版26话全看完了，最后一晚甚至通宵看了好几集；十一月的时候我的iPhone日均屏幕时间是十一个小时，连我都觉得不可思议：我是怎么做到的？以上已经能说明我是以一个什么状态在复习了。&lt;/p&gt;
&lt;p&gt;  要说考研这段时间的收获，大概有三点。&lt;/p&gt;
&lt;p&gt;  一是大大巩固了本人的数理基础。借助考研复习的机会，把许多当初未求甚解的基础概念弄明白了，收获颇丰。&lt;/p&gt;
&lt;p&gt;  二是收获了二十多斤的肉。由于选择了回家全职备考，整个大四上学期只有考研的那两天待在学校。大概家里伙食太好了吧，怀念半年前清瘦的自己，我恨这臃肿的我。毕竟，从早上起床到晚上睡觉，我几乎都在电脑椅上坐着（要么研究题目，要么玩手机），几乎不出门，所以运动量基本为零，在相当多的日子我的微信步数都在200到1000间浮动；同时，家里又随处都是小零食，于是我就以肉眼可见的速度膨胀了。实际上不止我，上届回家备考的学姐和西财凯子在考研这段时间也都胖了不少，即便是凯子这样曾天天去健身房打卡的，又何况于我呢。所以，如果学弟学妹有计划考研，一定要管住自己的嘴，并且每天保持一定的运动量。&lt;/p&gt;
&lt;p&gt;  三是在开考的前几天悟到了，无论是这半年来漫长的准备，还是考试的那三小时，时间都是公平的。每一分钟，都是同样地流逝着；因此，我们不能只强调于关键的几小时，在平常的时日里，也要多多做一做自己想做的事、见一见想见的人。总有一天会走进考场的，也总有一天会离开考场，我眼睁睁看着苍盾小程序上的倒计时从两百多天，到一百多天，到三十几天，最后到个位数。时间只会向前走，无论是痛苦的还是快乐的，都很快就会成为历史，不必过度悲伤或是留恋。&lt;/p&gt;
&lt;p&gt;  考研这半年诞生了许多想法，将他们一一列下排成了一幅待做清单，也不知道明天的我会不会付诸行动。比如，我确实很想学会画漫画，但最后或许多半也会因为嫌麻烦而放弃吧。这个清单列举的也许不是待办事项，可能只是备考时的一种愿想。毕竟，虽然考研的半年里我的手机就没怎么离开过手，但直到考研结束的时候，才体会到不用因玩手机而感到负罪是怎样的体验。&lt;/p&gt;
&lt;h1 id="复习时间线"&gt;复习时间线&lt;/h1&gt;
&lt;p&gt;  个人经历，仅供参考。这里略去细节，只写大体上的准备历程。&lt;/p&gt;
&lt;p&gt;  在开始以前，不得不说，纵然学院安排的全部课程对找工作均没有丝毫帮助，但前系主任彭老师对我们课业的安排还是蛮合理的。大三下我们只有一半的时间在实习（甚至是线上的），按计划，在大三下学期结束时全部种类学分就已然达到了毕业标准，而整个大四更是没有任何必修课程，这使得我们可以自由安排考研、考公，或是实习、准备招聘。对比之下，重邮软件的老刘不仅大三大四全程有课，甚至在考研的前一天还有随堂考试……&lt;/p&gt;
&lt;h2 id="数学"&gt;数学&lt;/h2&gt;
&lt;p&gt;  由于我算半个数学系出身，有一定的数学基础（虽然很烂），所以没有进行所谓的一轮复习，也就是听课并做配套题集。事实上我根本没有按照轮次来复习，颇有随心随意的做派。&lt;/p&gt;
&lt;p&gt;  数学是我除了背单词外唯一长期坚持学习的内容。大概从五六月起吧，我买了一套《辅导讲义》，包括高等数学和线性代数两本，当天有心复习数学的话就做上几页十几页，但总是断断续续，今天和学弟去图书馆、自习室坐上一晚，明天又一整天没有半点进度，也就是三天打鱼两天晒网的状态。这段时间要集中线上实习，每天都需要去计信大楼十四层的机房打卡。个人感觉这套书还是很不错的，严格按照考点排列，而且每道题目都有详细的过程讲解，非常适合用于补全基础、总览知识架构。&lt;/p&gt;
&lt;p&gt;  七月份回了家以后，就开始做“660”了（全称《数学基础过关660题》）。每天做个一星半点，这时我的数学基础还不够全面和牢固，只是形成了基本的知识体系，后来又做了“严选题”，“严选题”是比较难的，做起来有点吃力。这段时间我在数学上还是十分懒散的，经常连着好几天也没有动笔。&lt;/p&gt;
&lt;p&gt;  除了“660”外，适合前期复习的题集还有“880”、“1000”和“1600”等等，这些我就都没写过了，不过大概我算开始得较晚的一个吧，凯子从去年十二月左右就开始做数学了，他几乎把这些题集全部做过。有时间的话，数学还是尽早开始，前期复习时多做几本练习题，巩固数学基础。&lt;/p&gt;
&lt;p&gt;  到了九月份，我就开始做真题了，基本上坚持了每天一套，再如何没动力、再如何无心学习，我也会先写一套数学。从1987年的真题到2023年近四十年的真题，我通通做了一遍。现在来看，做2000年以后甚至2008年以后的真题即可，不过在时间充裕的情况下都做也没有关系。&lt;/p&gt;
&lt;p&gt;  这期间我用凯子的账号选了部分“张宇十八讲”的课来听，感觉讲得挺棒的，不过似乎这些课程本应该在上半年时听吧。如果基础不稳，建议听课，不要一上来就试图靠做题来查漏补缺，这样效率太低。&lt;/p&gt;
&lt;p&gt;  十月中旬时，结束了真题的部分，我开始了做近四年的合工大超越系列合集。“合工大超越系列”难度相对其他模拟题是要大一些的，也是一天一套。最后剩了一年的几套没写，这时2024年的模拟卷陆陆续续出来了，我就开始做2024的模拟卷了。还是一天一套，我做过的模拟卷有：李永乐6套，余丙森5套，张宇8套，李林6套，合工大超越5+5套，李永乐3套，李林4套，张宇4套。做完了这些，也就到上考场的时候了。&lt;/p&gt;
&lt;p&gt;  我的数学复习顺序可能参考价值不大，建议按部就班进行。数学上我有黄哥助阵，就没有他不懂的考研数学题，两秒就能解决我两天的困惑，大概这就是保研中科院、数学类数竞重庆第一人的实力吧。如果没有这样高手相助，可以找几个研友组一个学习小队，互相解惑答疑。在帮助别人解决问题的过程中，也替自己做了查漏补缺。&lt;/p&gt;
&lt;p&gt;  数学，我虽然做得不多，但也肯定不算少了。即便如此，我到了考试的前几天还在查漏补缺、还有的方法技巧是我闻所未闻的，数学确实是需要重视的一个学科，占比分值巨大且难度较高。此外，通常而言在进行了一二轮复习后做真题会感觉较为顺畅，这并不意味着你已经完全掌握考研数学了，只是因为今年老师们给出的复习课程和题册必然是涵盖过去真题的所有考点和出题方式的，甚至你早就在不同的练习题集中间间断断做了相当一部分真题题目。当年的真题一定是较为创新的，所以“压力训练”是有必要的，即模拟考场环境，禁止翻书翻笔记，定时做模拟卷。今年的模拟卷难度排序，我认为是：&lt;/p&gt;
&lt;center&gt;李艳芳 &gt; 合工大超越 ≈ 张宇4套 &gt; 余丙森5套 &gt; 李林4套&lt;/center&gt;
&lt;p&gt;  考虑到考场上的紧张和真题的创新性，真题的难度大概在合工大超越的层级，甚至介于李艳芳与合工大超越，至少从今年看是这样的，部分年份真题会比较简单。&lt;/p&gt;
&lt;h2 id="英语"&gt;英语&lt;/h2&gt;
&lt;p&gt;  我大概自七月底、八月初起开始每天坚持背单词，这是我除了每天一套数学以外唯一一直坚持着的事。现在看开始得太晚了，凯子也是去年十二月就开始背了，英语毕竟是基于词汇积累的。英语可以早一点开始背单词，并不需要额外买什么题册，日积月累下来，总能取得不错的成绩。我所使用的英语app有“不背单词”和“朗文当代高级英语词典”，以下是这半年来前者的数据统计：&lt;/p&gt;
&lt;p&gt;   1. 七月学习190词，复习193词&lt;/p&gt;
&lt;p&gt;   2. 八月学习1368词，复习3105词&lt;/p&gt;
&lt;p&gt;   3. 九月学习2052词，复习6899词&lt;/p&gt;
&lt;p&gt;   4. 十月学习1976词，复习10309词&lt;/p&gt;
&lt;p&gt;   5. 十一月学习116词，复习5655词&lt;/p&gt;
&lt;p&gt;   6. 十二月学习5词，复习2953词&lt;/p&gt;
&lt;p&gt;  英语我只做过英语一、英语二历年真题，其中英语二的阅读题全部写过一遍，英语一写了部分年份的阅读题。&lt;/p&gt;
&lt;p&gt;  我从十一月才开始准备作文，直到考试前夕都不敢保证写作时足够流畅、不会卡壳，时间上也算晚的了，毕竟到后面肖4出版后需要花时间背政治大题，不可能再有很多时间留给英语。这里推荐章晋林老师的网课，他的大作文模板挺适合我这样并不擅长英语写作的人。&lt;/p&gt;
&lt;p&gt;  英语的学习，最重要的、也是唯一重要的就是词汇量。高中物理老师曾说，“物理可以不学、单词不能不背”，是有一定道理的，单词与阅读能力远比任何技巧重要。我从未研究过考研英语阅读题有几种考法、有几种题型，如果读不懂问题，任何技巧都是苍白无力的；如果能彻底读懂文章，无论题干问什么问题都不在话下。至于作文——小作文多多积累句子、大作文背背模板即可，再加以练习，起码能拿到中等分数。&lt;/p&gt;
&lt;p&gt;  我的四六级都是近乎裸考的，其中六级在考前试着背了几百个所谓核心词汇，最后四级550分左右，六级437分，其中听力101分、阅读215分、作文121分。读者可以参考我的英语水平，判断自己从几月份开始坚持背单词合适，但当然是越早越好。&lt;/p&gt;
&lt;h2 id="政治"&gt;政治&lt;/h2&gt;
&lt;p&gt;  从八月底开始边看徐涛的强化班网课边做肖1000，肖1000只做了一遍，后来没太重视政治。&lt;/p&gt;
&lt;p&gt;  等到十一月底的时候，随着肖8出世，各个老师的模拟题也都渐渐出版了。不少小程序、app，比如苍盾政治，都提供有市面上大部分有名气有声望的考研政治老师出的模拟卷，只需要几块钱就能全部买下，随时随地打开手机就能练手。这些小程序与app都配套有评论区，评论区里有不少记忆的好点子，比如一些口诀，也能看看大家是如何思考的。&lt;/p&gt;
&lt;p&gt;  再后来，肖4就发货了。几乎所有政治分析题的所谓整理与带背均出自肖4，虽然肖4在12月中旬前后就已出版，这时就应该把大部分精力转移到政治大题的背诵上了，但我直到考政治的前一天晚上还在拼命记肖4的分析题答案。我实在不喜欢背这些东西。&lt;/p&gt;
&lt;p&gt;  整体而言，政治不需要太早准备，毕竟这是唯一一门随时在变化、具有极强时效性的科目。政治分析题等肖4出版再开始背诵就好，而选择题我是靠各个老师的模拟题进行“题海战术”学习的——其实就是太懒，不愿去背知识点。厚厚一本、大几百页的背诵手册像砖块一样，我真的不喜欢这样硬背。似乎学校图书馆与教学楼楼道里每天都有不少拿着背诵手册边念叨着记忆的同学，我做不到这样，但如果有条件、有能力，还是尽量多翻一翻、记一记的。我模拟卷选择题只能考三十几分的话，背得很牢的同学一般能考到四十多。靠多刷模拟题来补强也不是不可以的，但做起来全是陌生考点最后得到一个低分，挺挫伤人的。&lt;/p&gt;
&lt;h2 id="专业课"&gt;专业课&lt;/h2&gt;
&lt;p&gt;  我的专业课比较简单，起码是于我而言。九月十月时找了个网络机构花了千把块报了个定向班，感觉还算挺值，因为确实提供了不少网上找不到的信息和资料，最主要是知道了真题的考试风格，学长的一些帮助也十分必要。&lt;/p&gt;
&lt;p&gt;  可直接参考&lt;a href="https://iharee.github.io/docs/简答题整理.pdf"&gt;贾俊平《统计学》简答题考点全整理.pdf&lt;/a&gt;，这是我三个月来对简答题考点的整理笔记。&lt;/p&gt;
&lt;h1 id="考试时有什么要注意的吗"&gt;考试时有什么要注意的吗？&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;准备一瓶褪黑素，考前晚上十一点半还没睡着就嗑一粒，对于长期准备的考试，考前睡好觉远比考试前几天熬夜突击复习更有效。&lt;/li&gt;
&lt;li&gt;每天考后、晚上和早上，如果感觉肠胃不适，务必去厕所解决，不要影响后来的考试。&lt;/li&gt;
&lt;li&gt;考前饮食不需要过分清淡，但切忌刺激性事物。我在考试的前一晚还买了个两块的蜜雪冰城甜筒雪糕吃，当晚就拉肚子了，还好第二天就恢复了。&lt;/li&gt;
&lt;li&gt;考后对答案没关系，我在考完英语的一小时后、答案一经机构公布就火速核对了阅读的答案，但千万不要因为对答案而影响了后续考试的心态，如果做不到，还是不要对了为好。&lt;/li&gt;
&lt;/ul&gt;
&lt;h1 id="后记"&gt;后记&lt;/h1&gt;
&lt;p&gt;&lt;b&gt;2024 年 2 月 26 日  上午 9:00&lt;/b&gt;：查到初试分数了，412，结果还算不错。政治、英语、数学和专业课分别为75、81、118和138。&lt;/p&gt;
&lt;p&gt;2024的初试体验，总的来说是：&lt;/p&gt;</description></item><item><title>矩阵基础</title><link>https://iharee.github.io/math-statistics/matrix/</link><pubDate>Mon, 10 Jul 2023 13:17:56 +0000</pubDate><guid>https://iharee.github.io/math-statistics/matrix/</guid><description>&lt;p&gt;&lt;font color='red'&gt;&lt;b&gt;本文主要是一些关于矩阵的相对初等的内容，是考研期间做的完整考研线性代数归纳总结，目的是方便查阅。&lt;/b&gt;&lt;/font&gt;现在来看，这篇文章的主要任务是收纳若干关于矩阵的初级线性代数知识与技巧，对于线性空间、线性变换等内容，暂不涉及。在作者看来，这一部分的知识里理论的成分居多，读者如有需求，还是直接参考专业的线性代数或高等代数教材为好。&lt;/p&gt;
&lt;p&gt;作者本科专业是数学与应用数学，后在学院内转去了统计学 (数理方向)，有一定的数学基础，所以最基本的概念等本文就不再赘述了😊例如矩阵转置及其性质、矩阵逆的定义等等。&lt;/p&gt;
&lt;p&gt;本文集作者所学同时参考了大量的文献和网络资料，在整理和归纳时难免有所纰漏，如果发现有错误的内容可以邮件联系我以订正。&lt;/p&gt;
&lt;p&gt;本文中凡是没有特别指明的，都限制在实数域上讨论。如果需要在线做一些矩阵运算，个人推荐 &lt;a href="https://www.wolframalpha.com/"&gt;&lt;b&gt;WolframApha&lt;/b&gt;&lt;/a&gt;；如果需要做一系列复杂矩阵运算，个人推荐 Mathematica。&lt;/p&gt;
&lt;h1 id="矩阵"&gt;矩阵&lt;/h1&gt;
&lt;p&gt;(数字) 矩阵只是一个数表，作者看来没有所谓本质：他只是一张表，我们要往里面装什么东西，比如实数、复数、矩阵甚至随机变量，或是定义某种“奇形怪状”的新运算，都是可行的——“矩阵是什么”这个问题，取决于“我们希望用矩阵做什么”；如果一定要问出个“本质”来，那可能是线性变换吧；尽管矩阵也可以代表一个线性方程组（的系数），(数字) 矩阵的某些性质从该角度看更为直观。如果把矩阵看成向量组，那么一些向量组问题的答案瞬间便水落石出。矩阵还有许多其他作用，在不同的场景下有不同的任务，这里就不一一列举了。&lt;/p&gt;
&lt;img src="https://iharee.github.io/images/矩阵基础/the_matrix.webp" alt="矩阵的关系" style="zoom: 50%;" /&gt;
&lt;p&gt;众所周知，左乘初等矩阵等于做相应的行变换，右乘初等矩阵等于做相应的列变换，那么什么时候只能做行变换，什么时候只能做列变换呢？&lt;/p&gt;
&lt;p&gt;一般而言：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;当把矩阵视为列向量的排列后，如果要直接确定线性相关的列向量之间的数量关系（例如已知某向量可以同时被两组向量线性表出，求该向量的值），则只能做初等列变换，因为只有列变换才是列向量间而不是其分量间的线性组合，保持了列向量的代数结构（但是可能会改变线性相关式$\sum k_i\alpha_i=0$的系数$\{k_i\}$）；&lt;/li&gt;
&lt;li&gt;当把矩阵视为列向量的排列后，如果要确定列向量的极大线性无关组（也可以是判断线性相关性），则只能做初等行变换，因为就线性相关性而言，矩阵的行秩等于列秩，但如果做初等列变换就会改变列向量的位置，从而无法确定本来的列向量组中到底谁和谁线性相关；&lt;/li&gt;
&lt;li&gt;当把矩阵视为线性方程的系数表时，如果要通过高斯消元法解方程，则只能做初等行变换，因为线性方程整体相加减不改变解的值，但如果做列变换则相当于把一个未知数的系数加到了另一个未知数上，破坏了线性方程的结构；&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;到底该行变换还是列变换，只是取决于目的是什么。例如第一个例子“已知某向量可以同时被两组向量线性表出，求该向量的值”，既可以将两个向量组视为列向量的排列而做初等列变换，也可以等价地认为两组向量依次列成的矩阵$A$与那个可以被同时表出的向量$b$构成的方程组$Ax=b$有解，从而利用高斯消元法对$A$做初等行变换。&lt;/p&gt;
&lt;h2 id="矩阵等价"&gt;矩阵等价&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;矩阵等价：如果矩阵$A$可以经有限次初等变换得到$B$，则$A\cong B$（矩阵等价）&lt;/p&gt;
&lt;p&gt;上述条件等价于存在一系列初等矩阵$P_1,P_2,\cdots,P_n,Q_1,Q_2,\cdots,Q_m$，使得$A=P_1P_2\cdots P_nBQ_1Q_2\cdots Q_m$&lt;/p&gt;
&lt;p&gt;注：矩阵乘法按“左行右列”规则计算，表现为做乘时是用左边的行向量点乘右边的列向量得到新矩阵的一个元素，也表现为左乘初等矩阵则对原矩阵做相应行变换、右乘初等矩阵则对原矩阵做相应列变换&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;同型矩阵等价的充要条件是秩相等（判断方法，矩阵等价的充要条件）&lt;/p&gt;
&lt;p&gt;联系到定义：初等矩阵总是满秩而可逆的&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;若矩阵可逆则一定与$E$等价，从特征值角度看是特征值均非零，因此行列式不为$0$，故矩阵可逆；从初等矩阵角度看，他可以被视作为有限个代表初等行列变换的初等矩阵的复合（矩阵乘法），即可以由$E$经过有限次初等变换得到；也可以说该矩阵的对角矩阵一定为$E$&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;如果实矩阵$A$与$B$等价，那么$A^2$与$B^2$不一定等价，除非$A,B$中有一个矩阵为可逆矩阵&lt;/p&gt;
&lt;p&gt;如果实矩阵$A$与$B$等价，那么$AB$与$AB$也不一定等价，除非$A,B$中有一个矩阵为可逆矩阵&lt;/p&gt;
&lt;p&gt;如果实对称阵$A$与$B$合同，那么$A^2$与$B^2$合同&lt;/p&gt;
&lt;p&gt;如果实对称阵$A$与$B$相似，那么$A^2$与$B^2$相似&lt;/p&gt;
&lt;p&gt;之所以对两个等价的矩阵$A,B$不一定有$A^2$与$B^2$等价，是因为尽管$A^2$与$B^2$的特征值相等，但二者的秩却不一定相等。进一步讲，更本质的原因是二者零特征值的几何重数不一定相等。也就是说，即使$A,B$相似，从而$A,B$的零特征值有相同的代数重数与几何重数，则只能得出$A^2$与$B^2$的零特征值有相同的代数重数，但其几何重数可能是不相等的。对于命题“$AB$与$AB$也不一定等价”，原因同理；&lt;/p&gt;
&lt;p&gt;最经典的例子是：
&lt;/p&gt;
$$
 \left\{\begin{aligned}&amp;A=\left(\begin{matrix}1&amp;1&amp;\cdots&amp;1\\0&amp;0&amp;\cdots&amp;0\\\vdots&amp;\vdots&amp;&amp;\vdots\\0&amp;0&amp;\cdots&amp;0\end{matrix}\right)_{n\times n}&amp;&amp;B=\left(\begin{matrix}1&amp;1&amp;\cdots&amp;1\\-1&amp;-1&amp;\cdots&amp;-1\\\vdots&amp;\vdots&amp;&amp;\vdots\\0&amp;0&amp;\cdots&amp;0\end{matrix}\right)_{n\times n}\\&amp;A^2=A&amp;&amp;B^2=O\\&amp;BA=A&amp;&amp;AB=O\end{aligned}\right.
 $$&lt;p&gt;
其中
&lt;/p&gt;
$$
 r(A)=r(B)=1
 $$$$
 r(A^2)=1,\ \ \ \ r(B^2)=0
 $$$$
 r(BA)=1,\ \ \ \ r(AB)=0
 $$&lt;p&gt;这个例子十分经典，务必了解&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="矩阵合同"&gt;矩阵合同&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;矩阵合同：合同一定等价&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;矩阵合同：若存在可逆阵$C$，使得$C^TAC=B$，则$A\simeq B$（矩阵合同）&lt;/p&gt;
&lt;p&gt;其中$C^TAC$称为$A$的合同变换，实对称矩阵经合同变换还是实对称矩阵&lt;/p&gt;
&lt;p&gt;合同变换不要求$A,B$都是对称阵，但对称阵经合同变换只能是对称阵，非对称阵经合同变换只能是非对称阵&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;对称矩阵合同：对称矩阵若相似则一定合同&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;对称矩阵合同的充要条件：正负惯性指数相等；规范型相同&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;实对称矩阵$A$与他的逆$A^{-1}$合同，即二者具有相同的规范型，这是因为$A=AA^{-1}A=A^TA^{-1}A$&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;合同变换不改变正负惯性指数&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;等价关系：矩阵等价、相似与合同都是广义上的&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;等价关系（所以也有人认为矩阵等价应该译作相抵，以免与逻辑关系上的等价冲突），均满足自反性、对称性与传递性&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;相似必然合同，但合同不一定相似&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;在欧氏空间中，合同变换体现为在平面到自身的一一变换下，任意线段的长和它的像的长总相等&lt;/p&gt;</description></item><item><title>考研数学（微积分）（下）</title><link>https://iharee.github.io/math-statistics/calculus-b/</link><pubDate>Tue, 16 May 2023 13:17:56 +0000</pubDate><guid>https://iharee.github.io/math-statistics/calculus-b/</guid><description>&lt;p&gt;  part Ⅱ主要内容为 &lt;b&gt;不等式&lt;/b&gt;、&lt;b&gt;常微分方程 (ODE)&lt;/b&gt;、&lt;b&gt;级数理论&lt;/b&gt; 和 &lt;b&gt;多元函数微积分&lt;/b&gt;，包括工具定理、计算方法与部分证明，以例题辅助解释。&lt;/p&gt;
&lt;!-- more --&gt;
&lt;hr&gt;
&lt;h1 id="常用常数"&gt;常用常数&lt;/h1&gt;
&lt;p&gt;任何正数的任意根次之值$\sqrt[k]{a}=x_0\Leftrightarrow f(x_0)=x^k_0-a=0$都可以用牛顿-辛普森优化算法计算：$x_{n+1}=x_n-\frac{f(x_n)}{f'(x_n)}=\frac1k\left((k-1)x_n+\frac a{x^{k-1}_n}\right)$，特别的对于二次根式$\sqrt{a}=x$有$x_{n+1}=\frac12\left(x_n+\frac a{x_n}\right)$；非多项式函数不方便笔算，也可以类似地考虑切线法、不动点法等其他优化算法计算其数值解（要是有计算机，利用已有的库现写一个BFGS算法也不是难事）。不过简便起见，本文提供一些常见的常数以供查阅，略去计算的步骤。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;$\pi\approx3.141593$；&lt;/li&gt;
&lt;/ul&gt;
&lt;details&gt;&lt;summary&gt;&lt;font color="#0099ff"&gt;展开/收起&amp;nbsp;π&amp;nbsp;的一些极限/级数式&lt;/font&gt;&lt;/summary&gt;
$$
\pi=\lim\limits_{\,n\to\infty}n\sin\frac{180\degree}{n}
$$$$
\pi=\lim\limits_{n\to\infty}2^n\underbrace{\sqrt{2-\sqrt{2+\sqrt{2+\sqrt{2+\cdots+\sqrt2}}}}}_{n-1\text{ squre roots}}
$$&lt;img src="https://iharee.github.io/images/考研数学（微积分）（下）/Pi1.jpg" alt="Pi1" style="zoom: 40%;" /&gt;
&lt;img src="https://iharee.github.io/images/考研数学（微积分）（下）/Pi2.jpg" alt="Pi2" style="zoom: 40%;" /&gt;
&lt;/details&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;$e=\lim\limits_{n\to\infty}\left(1+\frac1n\right)^n\approx2.718282$；&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;$\gamma=\lim\limits_{n\to\infty}\left(\sum\limits^n_{k=1}\frac1k-\ln n\right)=\lim\limits_{n\to\infty}\left(\displaystyle{\int^1_0\frac{1-x^n}{1-x}\mathrm{d}x-\ln n}\right)\approx0.577216$；&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;$\pi^2\approx8.824978$；&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;$e^2=7.389056$；&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;$\sqrt2\approx1.414214$；&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;$\sqrt{e}=1.648721$；&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;$\sqrt3\approx1.732051$；&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;$\sqrt{\pi}=\displaystyle{\int_{\mathbb{R}}e^{-x^2}\mathrm{d}x=2\,\Gamma\big(\frac12\big)\approx1.772454}$；&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;$\sqrt5\approx2.236068$；&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;$\sqrt7\approx2.645751$；&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;$\sqrt{11}\approx3.316625$；&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;$\sqrt{13}\approx3.605551$；&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;$\ln2\approx0.693147$；&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;$\ln3\approx1.098612$；&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;$\ln5\approx1.609438$；&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;$\ln7\approx1.945910$；&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h1 id="不等式综述"&gt;不等式综述&lt;/h1&gt;
&lt;p&gt;不等式在分析学中是极其重要的，某种意义上，数学分析和实分析是玩弄不等式的艺术。&lt;/p&gt;
&lt;h2 id="多元不等式"&gt;多元不等式&lt;/h2&gt;
&lt;p&gt;多元不等式更“普适”、更“普通”，例如柯西不等式和$x&gt;0$时$\sin x\lt x$的区别。&lt;/p&gt;
&lt;h3 id="排序不等式"&gt;排序不等式&lt;/h3&gt;
$$
\text{倒序和 }\leqslant\text{ 乱序和 }\leqslant\text{ 顺序和}
$$&lt;p&gt;设长度为$n$的有限数列$\{a_i\}$与$\{b_i\}$单调递增，即$a_1\leqslant a_2\leqslant\cdots\leqslant a_n$、$b_1\leqslant b_2\leqslant\cdots\leqslant b_n$，则
&lt;/p&gt;
$$
\sum^n_{i=1}a_ib_{n-i+1}\leqslant\sum^n_{i=1}a_ib_{k_i}\leqslant\sum^n_{i=1}a_ib_i
$$&lt;p&gt;
其中$\{b_{k_i}\}$是$\{b_i\}$中元素的任意乱序排列。&lt;/p&gt;
&lt;p&gt;&lt;a href="https://zhuanlan.zhihu.com/p/296227985"&gt;&lt;font color="#EEAEEE"&gt;排序不等式的证明（配合Abel变换）&lt;/font&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h3 id="切比雪夫的和不等式"&gt;切比雪夫的和不等式&lt;/h3&gt;
&lt;p&gt;切比雪夫不等式的离散形式是排序不等式的推广。&lt;/p&gt;</description></item><item><title>The James-Stein Estimator</title><link>https://iharee.github.io/math-statistics/james-stein_estimator/</link><pubDate>Wed, 26 Apr 2023 16:15:23 +0000</pubDate><guid>https://iharee.github.io/math-statistics/james-stein_estimator/</guid><description>&lt;p&gt;  本人没有能力开拓什么，只能综合前辈们的观点尽量感悟；没有打算、更没有能力深入研究收缩估计，不过是对Stein&amp;rsquo;s paradox的奇怪现象感到诧异，来了兴趣，所以查阅多手资料后写下了本文。&lt;/p&gt;
&lt;hr&gt;
&lt;center&gt;&lt;font size="5.5"&gt;本文主要参考文献&lt;/font&gt;&lt;/center&gt;&lt;br&gt;&lt;center&gt;把他们列在文首，只因为我看来这些文章比本文更有价值，推荐参考&lt;/center&gt;
&lt;p&gt;&lt;a href="https://projecteuclid.org/proceedings/berkeley-symposium-on-mathematical-statistics-and-probability/Proceedings-of-the-Fourth-Berkeley-Symposium-on-Mathematical-Statistics-and/Chapter/Estimation-with-Quadratic-Loss/bsmsp/1200512173"&gt;Estimation with Quadratic Loss&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.stat.yale.edu/~hz68/619/Stein-1961.pdf"&gt;ESTIMATION WITH QUADRATIC LOSS - Yale University&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;1961年Willard James与Charles Stein的文章，在这里James-Stein估计被首次提出，&lt;a href="https://projecteuclid.org/download/pdf_1/euclid.bsmsp/1200512173"&gt;&lt;strong&gt;点击此处下载论文&lt;/strong&gt;&lt;/a&gt;。&lt;/p&gt;
&lt;p&gt;&lt;a href="http://bayes-stat.github.io/download/chapte1.pdf"&gt;大规模推断讨论班：经验贝叶斯与 James-Stein 估计量 - GitHub&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;这篇文章非常系统地从经验Bayes观点引出了Stein理论与Robbins理论，读完后收获颇丰，本文也有所参考。也说明了，所谓“频率学派”、“贝叶斯学派”的对立，“贝叶斯世界观”等描述并不准确，频率方法和Bayes方法不是水火不容的，统计学发展到今天，他们本身的界限就比较模糊。&lt;/p&gt;
&lt;p&gt;&lt;a href="https://kns.cnki.net/kcms2/article/abstract?v=3uoqIhG8C447WN1SO36whBaOoOkzJ23ELn_-3AAgJ5enmUaXDTPHrIcIlNbh3Sl6oanm3Ad1bmCfNH2zv_XmZ-BUCKN-oEs7&amp;amp;uniplatform=NZKPT"&gt;赵世舜. 矩阵加权估计及James-Stein估计的再研究 [D]. 吉林：吉林大学，2006.&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;感谢这篇博士论文为我提供的帮助，第二章定理证明的思路是源自于这份文献的；好像在2017年赵已经在吉林大学数学学院升任教授职务了。&lt;/p&gt;
&lt;p&gt;~~本文不是正经的论文，懒得划出具体的引用😊~~以上文献本身亦引用了较多文献，如果有兴趣，不妨也读一读。&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;本文用到了一些缩写：MLE指极大似然估计，UMVUE指一致最小方差无偏估计，MSE指均方误差，G-M定理指高斯-马尔可夫定理。&lt;/p&gt;
&lt;h2 id="the-james-stein-estimator"&gt;the James-Stein Estimator&lt;/h2&gt;
&lt;p&gt;众所周知，$p$元正态分布总体$N_p(\boldsymbol{\mu},\sigma^2\boldsymbol{I}_p)$数学期望的MLE是样本均值，即$\hat{\boldsymbol{\mu}}^{(MLE)}=\bar{\boldsymbol{X}}=\sum\limits^n_{i=1}\frac{\boldsymbol{X}_i}{n}$，是一个十分符合直觉且自然的统计量，由于他的简单直接，通常多数人也会采取他为总体期望的估计。事实上，由于正态分布族系指数族，并且$\bar{\boldsymbol{X}}$是$\boldsymbol{\mu}$是充分完备统计量，故根据Lehmann–Scheffé定理，样本均值是总体期望的UMVUE——这意味着，在无偏估计中样本均值的方差是最小的，可见样本均值是一个性质优良的估计。进一步地，$\mathrm{Var}(\bar{\boldsymbol{X}})$达到了Cramer-Rao下界。&lt;/p&gt;
&lt;p&gt;但是，这并不意味着样本均值在任何意义下都是最“好”的！1961年由Willard James和Charles Stein基于1956年Charles Stein提出的早期版本所改进得到的James-Stein estimator（下简称JSE）就是这样一个例子，当用$\mathrm{SE}$表示的样本均值的标准误时，有
&lt;/p&gt;
$$
\hat{\boldsymbol{\mu}}^{(JSE)}=\left(1-\frac{(p-2)\cdot\mathrm{SE}}{\bar{\boldsymbol{X}}^T\bar{\boldsymbol{X}}}\right)\cdot\bar{\boldsymbol{X}}\tag{1}
$$&lt;p&gt;
$(1)$式可视为样本量$n=1$的推广，如果只有一个样本，则$(1)$退化为
&lt;/p&gt;
$$
\hat{\boldsymbol{\mu}}^{(JSE)}_{n=1}=\left(1-\frac{(p-2)\cdot\sigma^2}{\Vert \boldsymbol{X}\Vert^2}\right)\cdot\boldsymbol{X}\tag{2}
$$&lt;p&gt;
相较于样本均值，JSE的方差显著减小了；尽管失去了无偏性，但渐进无偏，最重要的是在$p\geqslant3$情况下其MSE严格小于样本均值，这时JSE严格一致优于样本均值，这一现象也被称为Stein&amp;rsquo;s paradox。&lt;del&gt;当p=2时显然JSE等价于样本均值。&lt;/del&gt;&lt;/p&gt;
&lt;p&gt;这个结论第一眼看起来真的出人意料！这似乎违背经验，毕竟在我们的印象中，寻找、构造UMVUE一直都是统计学家的“毕生追求”，然而JSE的出现却表明，在非无偏估计家族中、在某些情况下，我们或许有比UMVUE更好的选择（这具体取决于我们在特定情境下如何定义“损失”标准）。&lt;/p&gt;
&lt;p&gt;这也深刻地说明了，UMVUE其实并没有设想的那般“绝对的好”，当我们把眼光放宽到无偏估计，可能还有更“好”的估计在等着我们发掘。JSE就揭示了，**当维数大于2，样本均值作为UMVUE就未必还是最好的估计！**换句话说，在低维可容许的样本均值，在高维是不可容许的，这侧面印证了低维直觉放在高维中很可能是错误的，高维统计中还有很多这样的例子。&lt;/p&gt;
&lt;p&gt;Tip: 由于正态分布的样本均值仍服从正态分布，为简便起见，后文中如若未做特别说明，则只考虑$n=1$的情况，不再区分$\bar{\boldsymbol{X}}$与$\boldsymbol{X}$。&lt;/p&gt;
&lt;h2 id="james-stein型估计的风险"&gt;James-Stein型估计的风险&lt;/h2&gt;
&lt;p&gt;这里将按照赵世舜在其&lt;a href="https://kns.cnki.net/kcms2/article/abstract?v=8kKd7LBMH3xSSIdWhiWufGGufLtiCY9_i6PAIy8YMJi9mj6z-4S-MOuoWjC2hhtf7728Texzwk9TsPJ3u0exI2NEXEHOP1rNLe4XZuuh9Aad-4qjZHUpLc-CXUyV3UyY8djmVWIY6pWTdQnEq_aypoCrslrtUk8gc-c1rw5uBQ_LX7XPYaWURA==&amp;amp;uniplatform=NZKPT&amp;amp;language=CHS"&gt;博士学位论文&lt;/a&gt;中所给出的，仿照1981年Stein、1990年Brandwein与Strawderman给出的较为简单的证明，证明当$0&lt;a&lt;2(p-2)$、$p&gt;2$且$b\geqslant0$时，&lt;strong&gt;James-Stein型估计&lt;/strong&gt;$\left(1-\frac{a\sigma^2}{b+\boldsymbol{X}^T\boldsymbol{X}}\right)\boldsymbol{X}$的风险一致小于$\boldsymbol{X}$的；并且，当$a=p-2$时，估计的风险达到最小，若进一步$b=0$，这时估计正是JSE，即$\hat{\delta}_{p-2,0}=\hat{\boldsymbol{\mu}}^{(JSE)}$。&lt;/p&gt;
&lt;p&gt;&lt;del&gt;看过1961年Willard James与Charles Stein的论文原文，这部分没有看懂，所以不按那最古老的方法证明风险一致地小了。&lt;/del&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;&lt;font size="5"&gt;引理 1    &lt;/font&gt;&lt;/b&gt;(成平 等，1985) 当$X\sim N(\mu,\sigma^2)$，$h(x)$可微且$\lim\limits_{x\to\infty}\frac{h(x)}{e^{\frac12(x-\mu)^2}}$，有
&lt;/p&gt;
$$
\mathbb{E}\big[(h(X)(X-\mu)\big]=\mathrm{Cov}\big(X,h(Y)\big)=\sigma^2\mathbb{E}\big[h'(X)\big]\tag{3}
$$&lt;p&gt;
在后文的证明中只会用到$\sigma^2=1$的情形。&lt;/p&gt;
&lt;p&gt;&lt;b&gt;&lt;font size="5"&gt;定理 1    &lt;/font&gt;&lt;/b&gt;以二次损失定义风险，设$\boldsymbol{X}\sim N_p(\boldsymbol{\mu},\sigma^2\boldsymbol{I}_p)$，则当$0&lt;a&lt;2(p-2)$、$p\geqslant3$且$b\geqslant0$时，估计$\hat{\delta}_{a,b}=\left(1-\frac{a\sigma^2}{b+\boldsymbol{X}^T\boldsymbol{X}}\right)\boldsymbol{X}$的风险均小于$\boldsymbol{X}$的风险，且$\hat{\delta}_{a,b}$的风险为
&lt;/p&gt;</description></item><item><title>考研数学（微积分）（上）</title><link>https://iharee.github.io/math-statistics/calculus-a/</link><pubDate>Thu, 06 Apr 2023 18:23:33 +0000</pubDate><guid>https://iharee.github.io/math-statistics/calculus-a/</guid><description>&lt;p&gt;  想了想，还是写Markdown更容易保存；作为考研高数的完整笔记，内容多了以后电子文档增删查改起来容易些。&lt;/p&gt;
&lt;p&gt;  part Ⅰ主要内容为 &lt;b&gt;极限&lt;/b&gt; 与 &lt;b&gt;一元微积分&lt;/b&gt;，涉及较多方面。&lt;/p&gt;
&lt;!-- more --&gt;
&lt;hr&gt;
&lt;p&gt;  只要数学家名称与定理名称较为常见、有广为接受的中文翻译，就都用中文表示了；两篇文章都主要限定在$\mathbb{R}$上讨论，后文不再强调了。&lt;strong&gt;&lt;font color="#CD0000"&gt;移动端阅读体验可能比较糟糕，尤其是用手机浏览长公式时&lt;/font&gt;&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;  如有纰漏，可以邮件联系我以订正。为了不影响主干内容的连贯，部分例题被折叠了起来。&lt;/p&gt;
&lt;h1 id="注意"&gt;注意&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;可证明，对$f(x)^{g(x)}$形式的式子，是可以直接对$f(x)$与$g(x)$运用泰勒公式的（只要运用正确，精度足够），自然对所谓的“等价无穷小”也是成立的，这在求极限中非常实用、方便；&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;第一、第二数学归纳法是极其好用的工具，需要熟练掌握并学会灵活运用（实为严格的演绎法）。归纳法不仅能运用在定理证明中，甚至可以配合单调有界定理证明数列极限的存在性。&lt;/p&gt;
&lt;p&gt;例如设$1\lt a\leqslant e^{\frac1e}$，$x_1=a$，且当$n&gt;1$时有$x_n=a^{x_{n-1}}$，试证极限$\lim\limits_{n\to\infty}x_n$存在。&lt;/p&gt;
&lt;p&gt;观察到$x_2=a^{x_1}=a^a&gt;a=x_1$，于是猜想$\{x_n\}$可能单调递增；做归纳假设$x_n&gt;x_{n-1}$成立，则有$x_{n+1}=a^{x_n}&gt;a^{x_{n-1}}=x_n$，因此由第一归纳法，数列$\{x_n\}$确为单调递增。下证数列有界，首先有$x_1=a\leqslant e^{\frac1e}\lt e$，再次运用归纳法，假设$\forall n\lt k,\ x_n\lt e$，则$x_{n+1}=a^{x_n}\lt a^e\leqslant e$，同时容易知道$\forall n,\ x_n&gt;1$，因此数列有界；最后，根据单调有界定理可知，该数列极限存在。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;font color='red'&gt;在点$x_0$处使用泰勒公式的条件：$f(x)$在含点$x_0$的某个开区间$(a,b)$内有$n+1$阶导数，则$f(x)$可以按$(x-x_0)$展开到$n$阶；&lt;/font&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;font color='red'&gt;求极限$\lim\limits_{x\to a}\frac{f(x)}{g(x)}$时使用洛必达法则的条件：&lt;/font&gt;除了要求分子分母满足不定式条件，&lt;font color='red'&gt;$f(x)$与$g(x)$的导数在$a$的某个邻域内应均存在，且导数比值的极限为一广义常数$A$时&lt;/font&gt;，才有$\lim\limits_{x\to a}\frac{f(x)}{g(x)}=\lim\limits_{x\to a}\frac{f'(x)}{g'(x)}=A$成立；其中$A$可以是无穷大。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;不要混淆了记号。$\lim\limits_{x\to {x_0}^+}f(x)$与$f(x_0+0)$均为右极限的记号，定义为：$\forall \varepsilon&gt;0$，$\exists\delta&gt;0$，$s.t.\,\,$当$0\lt x-x_0&lt;\delta$时，有$|f(x)-A|&lt;\varepsilon$，则称$A$为$f(x)$在点$x_0$处的右极限。从实数轴上看，右极限是“从数轴的右侧逼近”、“从数轴的正侧逼近”的单侧极限，与之对应的是左极限。&lt;/p&gt;
&lt;p&gt;但是一般而言，&lt;font color='red'&gt;导数的右极限$\lim\limits_{x\to {x_0}^+}f(x)$存在不等价于右导数$f'_+(x)$存在！！！导数的左极限与左导数的关系同理。&lt;/font&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;数学辅助工具上，个人十分推荐 &lt;a href="https://www.wolfram.com/mathematica/"&gt;Mathematica&lt;/a&gt;：无论是优化问题、矩阵求逆等数值计算，还是不定积分、微分方程、泰勒 / 洛朗级数等符号计算，Mathematica都能处理自如；此外，微软用Python语言开发的 &lt;a href="https://github.com/Z3Prover/z3"&gt;Z3&lt;/a&gt; 也是一个强大的工具。&lt;a href="https://www.wolframalpha.com/calculators/integral-calculator"&gt;Wolfram|Alpha&lt;/a&gt; 是基于Mathematica的，提供了图形化的在线网页界面，可以十分方便地进行常见的运算，让初学者不需要任何代码也可以借助计算机完成一些数学计算。&lt;/p&gt;
&lt;p&gt;对于函数图像，可以通过 &lt;a href="https://www.desmos.com/calculator"&gt;Desmos&lt;/a&gt; 简单绘制，Desmos同样提供了在线网站，可以便捷得画出简单或复杂函数的图像。如果对一些简单函数如$\arccos x$的图像不熟悉，可以通过Desmos直接画出其图像；对一些相对复杂的函数Desmos也能胜任，甚至还能从中看出函数在间断点的极限。&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h1 id="初等数学简记"&gt;初等数学简记&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;二项式定理：$\forall n\in\mathbb{N}^+$，$(a+b)^n=\sum\limits^n_{k=0}\binom{n}{k}a^{n-k}b^k$；&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;$n$次方的差公式：$\forall n\in\mathbb{N}^+$，$a^n-b^n=(a-b)\sum\limits^{n-1}_{k=1}a^{n-k}b^k$&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;特别地，平方差公式的一个有趣应用是对根式差极限的处理：$\sqrt{f(x)}-g(x)=\frac{f(x)-g^2(x)}{\sqrt{f(x)}+g(x)}$；&lt;/li&gt;
&lt;li&gt;当$b=1$时，有：$(x-1)^n=(x-1)(x^{n-1}+x^{n-2}+\cdots+x+1)$&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;令上式$b:=-b$则得到$n$次方和公式，注意当$n$为正偶数时$a^n+b^n=0$没有实数根，自然也不能在$\mathbb{R}$内分解因式。当$n$为奇数时，有：$a^n+b^n=(a+b)(a^{n-1}-a^{n-2}b+\cdots-ab^{n-2}+b^{n-1})$；&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;特别地，当$b=1$且$n$为奇数时，有：$(x+1)^n=(x+1)(x^{n-1}-x^{n-2}+\cdots+a^2-a+1)$；&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;中学数列通项求法大全：&lt;a href="https://zhuanlan.zhihu.com/p/73032201"&gt;&lt;b&gt;&lt;font color="#1E90FF"&gt;高中数学：求数列通项公式的十一种方法（方法全，例子全，归纳细）&lt;/font&gt;&lt;/b&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;一般$2$元$2$次方程解法：对于一般的$2$元$2$次方程组，可以将其改写为二次型的形式，
&lt;/p&gt;
$$
 \left\{\begin{aligned}
 &amp;\ \ \ \ (x,y,1)\boldsymbol{A}\left(\begin{array}{c}x\\y\\1\end{array}\right)=0\\
 &amp;\ \ \ \ (x,y,1)\boldsymbol{B}\left(\begin{array}{c}x\\y\\1\end{array}\right)=0
 \end{aligned}\right.
 $$&lt;p&gt;
其中$\boldsymbol{A},\boldsymbol{B}$是三阶实对称矩阵，&lt;/p&gt;</description></item><item><title>回归分析</title><link>https://iharee.github.io/math-statistics/regression/</link><pubDate>Sun, 08 Jan 2023 18:11:25 +0000</pubDate><guid>https://iharee.github.io/math-statistics/regression/</guid><description>&lt;p&gt;方便起见，本文用$\Vert\cdot\Vert^2$代表$\Vert\cdot\Vert_2^2$，其中$\Vert\cdot\Vert_2$是$l^2$或$L^2$范数，用RSS或SSE表示残差平方和，用SSR表示回归平方和，用SST表示总平方和，用OLS表示最小二乘法，用MLE表示极大似然估计，并采用下分位数的记号。&lt;/p&gt;
&lt;p&gt;本文最初是作为本科阶段期末考试的复习总结，★代表考试中重要程度，●代表不会刻意作为考点，◆代表只考察解读或名词解释，不考察理论推导与证明，最后▲代表虽然是复习课上明确提到的必考内容，但会做变形或考察类似题目。由于本文作于作者大三时期，且原先的目的也只是系统地总结回归分析考试考点，所以本文不会十分深入地探究太多涉及底层理论的内容；文章侧重点更多的还是线性回归本身的理论，所以一些应用中的处理方法和可能遇到的问题并没有太多诠释。&lt;/p&gt;
&lt;p&gt;&lt;u&gt;不过，后来断断续续扩写补充了相当一部分本科课程以外的内容，如果读者仅仅希望将本文作为（西南大学统计系）期末考试的复习笔记，则没有任何记号标记的标题下的内容，均可以忽略。&lt;/u&gt;&lt;/p&gt;
&lt;p&gt;参考书目有：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;学院的本科授课教材，即王松桂等人所编著的《线性统计模型：线性回归与方差分析》&lt;/li&gt;
&lt;li&gt;同时也参考了茆诗松等编著的《概率论与数理统计教程 (第三版)》与贾俊平等编著的《统计学 (第8版)》&lt;/li&gt;
&lt;li&gt;若干网络资源与Wiki百科&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;在此感谢我的回归分析任课教师&lt;a href="http://math.swu.edu.cn/info/1017/2422.htm"&gt;徐文昕&lt;/a&gt;老师。&lt;/p&gt;
&lt;hr&gt;
&lt;h1 id="前言"&gt;前言&lt;/h1&gt;
&lt;p&gt;最小二乘法有着极为广泛的运用，他的优良性质由高斯-马尔可夫定理所保证；除此之外，如果残差还独立同分布于正态分布，则此时OLS等价于MLE。即便残差并不服从正态分布，只要满足高斯-马尔可夫定理的基本条件，那么OLS就是最优的无偏估计，这说明了线性回归的强大之处。&lt;/p&gt;
&lt;p&gt;然而在许多情形下，相对于一些其他的方法（尤其是非参数方法），OLS在稳健性方面略显疲态。考虑到最小二乘法的损失函数为RSS，一旦样本数据中出现了严重偏离总体的异常点，误差将会在被平方后大幅增加。这种情况下，如果依然希望最小化RSS，可能导致OLS的值因此而发生较大的变化，使得回归曲线偏向于异常点，换句话说：OLS是对异常值十分敏感。&lt;/p&gt;
&lt;p&gt;让我们把目光转向最小一乘法。最小二乘法的损失函数为$\text{RSS}=\Vert y-\hat{y}\Vert^2_2$，而最小一乘法的损失函数为$\Vert y-\hat{y}\Vert_1=\sum\limits^n_{i=1}\vert y_i-\hat{y}_i\vert$，从损失函数的形式上看，如果出现异常值，显然RSS产生的惩罚更严重，而最小一乘法的惩罚则较轻（毕竟，在$\triangle y_i&gt;1$时，$(\triangle y)^2\gg y$），受到的影响相对更小。当然，这也是个比较粗浅的观点，实质上最小一乘回归对应中位数回归，而最小二乘回归对应均值回归——最小一乘回归是一种特殊的分位数回归，分位数取二分位数，即中位数。鉴于本文并不是非参数统计的详解文章，这里就不再赘述最小一乘法的更多性质。写下这些文字，我想表达的是：最小一乘法与最小二乘法之间，本身并无绝对的优劣之分，至于哪种方法表现更好，视情况与需求而定。&lt;/p&gt;
&lt;p&gt;另外，最小二乘线性回归出现较早、结构简单，是一种经典而传统的回归方法，预测能力较差，远远不及SVM等一众现代方法，这是他结构太过简易导致的，尤其是站在大模型正值风口的今天。但是，也正因如此，线性回归时至今日仍有非常广阔的运用，主要原因是其结构简单、模型解释性强，回归参数也有着非常明确的统计意义与现实背景，通常在不以精准预测为目的的数据分析任务中都会看到线性回归的身影——单单是回归系数的符号就已经能说明太多信息，譬如研究课后活动类型与花费时间对学生成绩的影响、探究某组合药物各成分的剂量对实验用小白鼠的影响。&lt;/p&gt;
&lt;p&gt;最后，大名鼎鼎的方差分析也是一种线性回归，不过是较为特殊的线性回归，自变量均为分类数据；既含有离散的分类变量又含有连续的数量变量的线性回归，称为协方差分析。&lt;/p&gt;
&lt;p&gt;方便起见，本文只讨论最基本的线性模型，且不考虑交互项。不过，读者很容易就能把本文的理论推广、扩展到这些内容上去。&lt;/p&gt;
&lt;h1 id="一元线性回归公式速查"&gt;一元线性回归公式速查&lt;/h1&gt;
&lt;p&gt;&lt;b&gt;由于一些其他的教材针对一元线性回归使用了特别的记号，而在实际的理论和应用中，相当一部分数据以这类教材所采取的记号形式给出。为方便查阅，在此直接给出这种别于本文符号体系下的一元线性回归的全部基本公式，&lt;font color="#8b0000"&gt;于下一小节再做详细证明。&lt;/font&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;$^{\ast}$ &lt;em&gt;在有的教材中，针对一元线性回归模型，规定：&lt;/em&gt;
&lt;/p&gt;
$$
\left\{\begin{aligned}
&amp;l_{xx}=\sum(x_i-\bar{x})^2=\sum x^2_i-n{\bar{x}}^2\\
&amp;l_{yy}=\sum(y_i-\bar{y})^2\ =\sum y^2_i-n{\bar{y}}^2\\
&amp;l_{xy}=\sum(x_i-\bar{x})(y_i-\bar{y})=\sum x_iy_i-n\bar{x}\bar{y}
\end{aligned}\right.
$$&lt;p&gt;
&lt;em&gt;于是&lt;/em&gt;
&lt;/p&gt;
$$
\hat{\beta}_1=(\boldsymbol X^T\boldsymbol X)^{-1}\boldsymbol X^T\boldsymbol y=\frac{\sum(x_i-\bar{x})(y_i-\bar{y})}{\sum(x_i-\bar{x})^2}=\frac{l_{xy}}{l_{xx}}
$$$$
\hat{\beta}_0=\bar{y}-\hat{\beta}_1\bar{x}
$$&lt;p&gt;&lt;em&gt;另外，在高斯-马尔可夫定理的条件下，有&lt;/em&gt;
&lt;/p&gt;
$$
\begin{align}&amp;(1)\ \ \ \hat{\beta}_0\sim N\left(\beta_0,\left(\frac1n+\frac{\bar{x}^2}{l_{xx}}\right)\sigma^2\right),\ \ \hat{\beta}_1\sim N(\beta_1,\frac{\sigma^2}{l_{xx}})\\&amp;(2)\ \ \ \mathrm{Cov}(\hat{\beta}_0,\hat{\beta}_1)=-\frac{\bar{x}}{l_{xx}}\sigma^2\\&amp;(3)\ \ \ \hat{y}_0=\hat{\beta}_0+\hat{\beta}_1x_0\sim N\left(\beta_0+\beta_1x_0,\left(\frac1n+\frac{(x_0-\bar{x})^2}{l_{xx}}\right)\sigma^2\right)\\&amp;(4)\ \ \ \hat{\sigma}^2=\frac{SSE}{n-2}\text{，这是无偏估计}\\&amp;(5)\ \ \ \mathbb{E}(SSR)=\sigma^2+\beta^2_1l_{xx},\ \ \mathbb{E}(SSE)=(n-2)\sigma^2\\&amp;(6)\ \ \ \text{当}\beta_1=0\text{，有}\frac{SST}{\sigma^2}\sim\chi^2(n-1),\ \frac{SSR}{\sigma^2}\sim\chi^2(1),\ \frac{SSE}{\sigma^2}\sim\chi^2(n-2)\end{align}
$$&lt;p&gt;
&lt;em&gt;相应的，$SST=l_{yy}$，$SSR=\hat{\beta}^2_1l_{xx}=\frac{l^2_{xy}}{l_{xx}}$，$SSE=SST-SSR$，在此一并给出参数显著性检验统计量：&lt;/em&gt;
&lt;/p&gt;</description></item><item><title>关于</title><link>https://iharee.github.io/about/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://iharee.github.io/about/</guid><description>&lt;p&gt;一只硕士生。&lt;/p&gt;
&lt;p&gt;撰写文字的主要动机是「有趣」。&lt;/p&gt;</description></item><item><title>友链</title><link>https://iharee.github.io/friends/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://iharee.github.io/friends/</guid><description/></item></channel></rss>