<rss xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title>还是要学习一个 - 分類 - Isaac's Blog</title><link>https://neutralmilkzzz.github.io/blog/zh-tw/categories/%E8%BF%98%E6%98%AF%E8%A6%81%E5%AD%A6%E4%B9%A0%E4%B8%80%E4%B8%AA/</link><description>还是要学习一个 - 分類 - Isaac's Blog</description><generator>Hugo -- gohugo.io</generator><language>zh-TW</language><lastBuildDate>Sat, 01 Aug 2026 00:00:00 +0000</lastBuildDate><atom:link href="https://neutralmilkzzz.github.io/blog/zh-tw/categories/%E8%BF%98%E6%98%AF%E8%A6%81%E5%AD%A6%E4%B9%A0%E4%B8%80%E4%B8%AA/" rel="self" type="application/rss+xml"/><item><title>线性回归误差为什么用平方</title><link>https://neutralmilkzzz.github.io/blog/zh-tw/%E7%BA%BF%E6%80%A7%E5%9B%9E%E5%BD%92%E8%AF%AF%E5%B7%AE%E4%B8%BA%E4%BB%80%E4%B9%88%E7%94%A8%E5%B9%B3%E6%96%B9/</link><pubDate>Sat, 01 Aug 2026 00:00:00 +0000</pubDate><author>isaac</author><guid>https://neutralmilkzzz.github.io/blog/zh-tw/%E7%BA%BF%E6%80%A7%E5%9B%9E%E5%BD%92%E8%AF%AF%E5%B7%AE%E4%B8%BA%E4%BB%80%E4%B9%88%E7%94%A8%E5%B9%B3%E6%96%B9/</guid><description><![CDATA[<h1 id="线性回归误差为什么用平方">线性回归误差为什么用平方</h1>
<h2 id="0-从已经理解的内容出发">0. 从已经理解的内容出发</h2>
<p>我们用一条直线预测 <code>y</code>：</p>
<p>$$
\hat y=\theta_0+\theta_1x
$$</p>
<p>真实值和预测值之间的误差是：</p>
<p>$$
\epsilon=y-\hat y
$$</p>
<p>我们希望选择一组参数，使所有样本的误差尽可能小。于是有一个问题：</p>
<blockquote>
<p>应该用什么方式衡量误差的大小？</p></blockquote>
<p>吴恩达在线性回归中选择了平方误差：</p>
<p>$$
J(\theta)=\frac{1}{2m}\sum_{i=1}^{m}
\left(y^{(i)}-\hat y^{(i)}\right)^2
$$</p>
<p>下面解释为什么是平方，而不是一次方或四次方。</p>
<h2 id="1-为什么不能直接把误差相加">1. 为什么不能直接把误差相加</h2>
<p>假设有两个样本，误差分别是：</p>
<p>$$
\epsilon_1=2,\qquad \epsilon_2=-2
$$</p>
<p>如果直接相加：</p>
<p>$$
\epsilon_1+\epsilon_2=2+(-2)=0
$$</p>
<p>但实际上两个样本都预测错了，所以结果为零不能表示“没有误差”。</p>
<p>原因是误差有正负：</p>
<ul>
<li>正误差：预测值偏小；</li>
<li>负误差：预测值偏大。</li>
</ul>
<p>所以正负误差会互相抵消。</p>
<h2 id="2-一次方绝对值和平方的区别">2. 一次方、绝对值和平方的区别</h2>
<h3 id="带符号的一次方">带符号的一次方</h3>
<p>如果使用：</p>
<p>$$
\sum_{i=1}^{m}\epsilon_i
$$</p>
<p>就会发生正负抵消，因此不适合作为总误差。</p>
<h3 id="绝对值的一次方">绝对值的一次方</h3>
<p>如果使用：</p>
<p>$$
\sum_{i=1}^{m}|\epsilon_i|
$$</p>
<p>就不会发生正负抵消。这其实是合理的损失函数，叫绝对误差损失。</p>
<p>它的缺点是：在 <code>ε=0</code> 处有一个尖角，导数不连续；同时它对大误差的惩罚没有平方误差那么强。</p>
<h3 id="平方误差">平方误差</h3>
<p>平方误差是：</p>
<p>$$
\sum_{i=1}^{m}\epsilon_i^2
$$</p>
<p>它有三个优点：</p>
<ol>
<li>正误差和负误差都会变成正数；</li>
<li>大误差会被更强烈地惩罚；</li>
<li>函数连续且可导，方便使用梯度下降。</li>
</ol>
<p>例如：</p>
<p>$$
2^2=4,\qquad 5^2=25
$$</p>
<p>误差从 <code>2</code> 增加到 <code>5</code>，平方损失增加得非常明显。</p>
<h2 id="3-高斯分布是怎么出现的">3. 高斯分布是怎么出现的</h2>
<p>吴恩达不是随意规定“误差要平方”，而是做了一个关于误差的假设：</p>
<blockquote>
<p>大多数误差应该接近零，较大的误差比较少见，并且正误差和负误差大致对称。</p></blockquote>
<p>这种误差形状可以用均值为 <code>0</code> 的高斯分布表示：</p>
<p>$$
\epsilon\sim\mathcal{N}(0,\sigma^2)
$$</p>
<p>它的概率密度函数是：</p>
<p>$$
p(\epsilon)
=\frac{1}{\sqrt{2\pi}\sigma}
\exp\left(-\frac{\epsilon^2}{2\sigma^2}\right)
$$</p>
<p>先只看最重要的部分：</p>
<p>$$
p(\epsilon)\propto\exp\left(-\frac{\epsilon^2}{2\sigma^2}\right)
$$</p>
<p>因为指数上面出现了 <code>-ε²</code>，所以误差越大，出现的概率密度越小。</p>
<h2 id="4-从高斯误差推出平方误差">4. 从高斯误差推出平方误差</h2>
<p>对于一个样本：</p>
<p>$$
\epsilon^{(i)}=y^{(i)}-\theta^Tx^{(i)}
$$</p>
<p>高斯假设意味着：</p>
<p>$$
p\left(y^{(i)}\mid x^{(i)};\theta\right)
=\frac{1}{\sqrt{2\pi}\sigma}
\exp\left(
-\frac{\left(y^{(i)}-\theta^Tx^{(i)}\right)^2}{2\sigma^2}
\right)
$$</p>
<p>这个式子表示：给定输入 <code>x</code> 和参数 <code>θ</code> 后，真实输出 <code>y</code> 在预测值附近出现的可能性。</p>
<p>如果模型的预测很好，那么误差较小，概率密度较大；如果预测很差，那么误差较大，概率密度较小。</p>
<p>假设不同样本之间相互独立，那么所有样本同时出现的可能性等于各个样本概率密度的乘积：</p>
<p>$$
\mathcal{L}(\theta)
=\prod_{i=1}^{m}
p\left(y^{(i)}\mid x^{(i)};\theta\right)
$$</p>
<p>这个 <code>𝓛(θ)</code> 叫似然函数。我们希望找到一组参数，使观察到的训练数据最可能出现，因此希望最大化似然函数。</p>
<p>直接最大化很多乘法不方便，所以取对数：</p>
<p>$$
\log\mathcal{L}(\theta)
=\sum_{i=1}^{m}
\log p\left(y^{(i)}\mid x^{(i)};\theta\right)
$$</p>
<p>代入高斯密度后：</p>
<p>$$
\log\mathcal{L}(\theta)
=-m\log(\sqrt{2\pi}\sigma)
-\frac{1}{2\sigma^2}
\sum_{i=1}^{m}
\left(y^{(i)}-\theta^Tx^{(i)}\right)^2
$$</p>
<p>其中第一项与 <code>θ</code> 无关，只有第二项会随着模型参数变化。</p>
<p>因此，最大化对数似然等价于最小化：</p>
<p>$$
\sum_{i=1}^{m}
\left(y^{(i)}-\theta^Tx^{(i)}\right)^2
$$</p>
<p>这就是最小二乘法。</p>
<p>所以核心逻辑是：</p>
<p>$$
\text{高斯误差假设}
\Longrightarrow
\text{最大似然估计}
\Longrightarrow
\text{最小化平方误差}
$$</p>
<p>换句话说，这个逻辑是：最大化预测结果，也就是让真实结果出现在预测值附近的可能性最大化。这里“可能性”的量化标准是概率密度；概率密度越大，说明在相同的小区间内观察到真实值越合理。</p>
]]></description></item><item><title>Github指南:2(终)</title><link>https://neutralmilkzzz.github.io/blog/zh-tw/contents/posts/newfile/</link><pubDate>Tue, 09 Dec 2025 19:44:47 +0800</pubDate><author>isaac</author><guid>https://neutralmilkzzz.github.io/blog/zh-tw/contents/posts/newfile/</guid><description><![CDATA[<p>这一章足够我们搞定90%的东西了，剩下的10%也没必要现在学。
<code>git fetch</code>就是拷贝远程仓库，但是对现在现有的仓库没有任何影响，单纯是抄过来。
<code>git pull</code> = <code>git fetch</code> + <code>git merge</code>
<code>git pull --rebase</code> = <code>git fetch</code> + <code>git rebase</code>
<code>git push</code>就是传过去。
差不多了 收工。
<a href="https://learngitbranching.js.org" target="_blank" rel="noopener noreffer ">https://learngitbranching.js.org</a>是最最最好的git可视化学习网站，如果你想一小时学完，用它就行。</p>
]]></description></item><item><title>Github指南:1</title><link>https://neutralmilkzzz.github.io/blog/zh-tw/github1/</link><pubDate>Tue, 09 Dec 2025 17:01:28 +0800</pubDate><author>isaac</author><guid>https://neutralmilkzzz.github.io/blog/zh-tw/github1/</guid><description><![CDATA[<p>在学习github的使用前，我们得先掌握git。</p>
<h3 id="11-git与-git-commit">1.1 git与 git commit</h3>
<p>git仓库的提交记录保存的是你的目录下所有文件的快照。就像复制了整个目录，再黏贴。
有几个特点</p>
<ul>
<li>git希望提交记录轻量，因此每次提交后，他只会打包所有更新的部分作为一个提交记录。</li>
<li>git会保存每一次历史记录。因此可以维护提交历史，对大家都有好处。
使用<code>git commit</code>即可提交。</li>
</ul>
<h3 id="12-git-branch">1.2 git branch</h3>
<blockquote>
<p>当你搭建炒股bot的时候，你可能会尝试100种策略，但最终你只会使用最赚钱的那个。因此你得回到历史某一个提交节点上。</p></blockquote>
<p>Git 的分支也非常轻量。它们只是简单地指向某个提交记录.
<code>git branch {随便起个名字。比如说 richbot}</code>
这样就创建好了一个指向当前状态的节点了！</p>
<hr>
<p>为了回到我们想要的节点，我们需要使用
<code>git checkout (你取的那个名字）</code></p>
<h3 id="13-git-merge">1.3 git merge</h3>
<blockquote>
<p>我一个trading bot出问题了！我要修复这个bug，但是我的同事正在进一步开发bot，因此我需要在分支上写一个bugfix，再回到main，让主线也包含这个修复bug的插件。</p></blockquote>
<div class="code-block code-line-numbers open" style="counter-reset: code-block 0">
    <div class="code-header language-git">
        <span class="code-title"><i class="arrow fas fa-angle-right fa-fw" aria-hidden="true"></i></span>
        <span class="ellipses"><i class="fas fa-ellipsis-h fa-fw" aria-hidden="true"></i></span>
        <span class="copy" title="複製到剪貼簿"><i class="far fa-copy fa-fw" aria-hidden="true"></i></span>
    </div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">git checkout main
</span></span><span class="line"><span class="cl">git pull origin main
</span></span><span class="line"><span class="cl">git merge bugFix ###这个是在main主线上把bugfix的内容merge进去。
</span></span><span class="line"><span class="cl">git push origin main</span></span></code></pre></div></div>
<h3 id="14-rebase">1.4 rebase</h3>
<p>merge虽然好，但是我们有时候想要线性的维护记录，我们希望在主线上这就是一个修复bug的更新，而不是什么莫名其妙的branch，这个时候就可以用rebase。</p>
<div class="code-block code-line-numbers open" style="counter-reset: code-block 0">
    <div class="code-header language-git">
        <span class="code-title"><i class="arrow fas fa-angle-right fa-fw" aria-hidden="true"></i></span>
        <span class="ellipses"><i class="fas fa-ellipsis-h fa-fw" aria-hidden="true"></i></span>
        <span class="copy" title="複製到剪貼簿"><i class="far fa-copy fa-fw" aria-hidden="true"></i></span>
    </div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">git branch bugFix | git checkout bugFix
</span></span><span class="line"><span class="cl">git commit
</span></span><span class="line"><span class="cl">git rebase main
</span></span><span class="line"><span class="cl">git checkout main
</span></span><span class="line"><span class="cl">git rebase bugFix</span></span></code></pre></div></div>
<hr>
<p>2.0: HEAD</p>
<blockquote>
<p>当然，给每一个节点一个branch，可以随时回归，很不错，但是这个设计哲学也太烂了吧！
所以说，我们得掌握在提交树上移动的办法。</p></blockquote>
<p>HEAD 是一个对当前所在分支的符号引用 —— 也就是指向你正在其基础上进行工作的提交记录。</p>
<p>HEAD 总是指向当前分支上最近一次提交记录。大多数修改提交树的 Git 命令都是从改变 HEAD 的指向开始的。</p>
<p>HEAD 通常情况下是指向分支名的（如 bugFix）。在你提交时，改变了 bugFix 的状态，这一变化通过 HEAD 变得可见。</p>
<hr>
<p>好在哪怕你不给每一个节点起名，节点自己也有一个40位的哈希值<code>fed2da64c0efc5293610bdd892f82a58e8cbc5d8</code>像这样，你只要输入<code>git checkout fed2</code>然后tab自动补全就好啦！</p>
<hr>
<p>其实不好。
这tm谁记得住哈希值
还好我们有<strong>相对引用</strong>
使用<code>git checkout HEAD^</code>即可回到上一条。
<code>^</code>表示上一条。系统的讲，你可以选中一个已有的好记的节点，然后移动到附近。
一条一条返回也有点慢，不如用<code>~</code>批量返回。
还可以用<code>git branch -f (branch名) （位置）</code>来改变分支的指向。</p>
<h3 id="21-撤回">2.1 撤回！</h3>
<blockquote>
<p>不是Ctrl Z
两套方法。</p></blockquote>
<ol>
<li>用git reset,直接在本地取消一次提交，回到上一个节点。不过在远端没人知道。</li>
<li>用git revert，同样是取消，但是是以新的节点的形式，<em>我的母节点的母节点是我</em>这样方便提交到远端。</li>
</ol>
]]></description></item><item><title>Github指南：0</title><link>https://neutralmilkzzz.github.io/blog/zh-tw/github%E6%8C%87%E5%8D%97/</link><pubDate>Tue, 02 Dec 2025 19:19:16 +0800</pubDate><author>isaac</author><guid>https://neutralmilkzzz.github.io/blog/zh-tw/github%E6%8C%87%E5%8D%97/</guid><description><![CDATA[<p>虽然HKU CS大一用到github的机会不多，但是早点掌握肯定不是个坏事。
MIT大名鼎鼎的Missing Semester里就有一节课讲了git和版本控制
<div class="bilibili"><iframe src="//player.bilibili.com/player.html?bvid=BV1Wh4y1s7Lj&page=1" scrolling="no" border="0" frameborder="no" framespacing="0" allowfullscreen="true"></iframe></div>

但是根据我对本篇博客的受众的推测(假定真的有受众)，多半是还没搞明白git和版本控制到底有啥用，所以我要开始碎碎念了。</p>
<h1 id="碎碎念">碎碎念</h1>
<p>我真正意识到需要版本控制的经历来自于玩polymarket。
我从github上clone了一个跟单bot，调好了api，用自己电脑跑了一个晚上赚了7美刀。
我爽飞了。开始设置止盈止损，这个时候还能赚一点钱。
然后我开始排列组合各种alpha因子，反弹率，订单簿。抢尾盘。
然后我跑了一个晚上亏了50美元。
这个悲剧告诉了我两个道理：</p>
<ul>
<li>别用自己电脑跑bot，用服务器</li>
<li>放心修改bot的前提是，你得再爆亏之后，随时回到赚钱版本的老bot
That&rsquo;s why we need version control.</li>
</ul>
<h1 id="github指北">Github指北</h1>
<p>鉴于我会的也不多，我只教最最简单的操作。</p>
<p>如你所见，我有一个账号，上面有很多东西。以<strong>CS61A</strong>为例，我给你示范一下<strong>如何下载</strong>。</p>
<p>我们发现这个项目的网址，于是在linux的命令行中输入</p>
<p><code>git clone https://github.com/Neutralmilkzzz/CS61A-2025-Fall</code></p>
<p>我就把他克隆了下来。</p>
<h2 id="2-修改">2 修改</h2>
<p><code>touch change.py</code>之后，我成功地做到了在原文件夹捏造了一个python文件。
你也可以干别的坏事。</p>
<h2 id="3-同步更新">3 同步更新</h2>
<p><code>git pull --rebase origin main</code>
其实pull就行了，&ndash;rebase是处理冲突的</p>
<h2 id="4-上传新文件">4 上传新文件</h2>
<p><code>git add sth</code>
一般来说我们也不在意上传哪部分，一股脑全扔上去得了，那么就用
<code>git add .</code>就行</p>
<h2 id="5-提交说明">5 提交说明</h2>
<p>解释一下你为啥要更新
<code>git commit -m &quot;upload IntList.java&quot;</code></p>
<h2 id="6-认证身份">6 认证身份</h2>
<p><del>臭名昭著</del>大名鼎鼎的cc好课CCST9017教会了我们RSA，也告诉了我们：一对私钥与公钥可以用于鉴别身份，因为只有私钥的拥有者能生成一个数字签名（Digital Signature）。任何拥有公钥的人，都无法通过公钥推算出私钥，但可以使用公钥来验证该数字签名是否确实由匹配的私钥所创建。因此，公钥的使用者可以确认签名者（即私钥拥有者）的身份是真实的。
github为了保证绝对安全，在2021年之后不再能用账号密码登录，而是转为ssh key
首先你需要在本地生成一对ed25519的密钥，把公钥上传到github/settings/ssh key，加入一个新的key。
这串代码我忘了，keygen什么的，问问ai，他肯定知道。
然后登录
<code>ssh -T git@github.com</code>
收到这个
<code>Hi XXXXXX! You've successfully authenticated, but GitHub does not provide shell access.</code>
就说明你成功了</p>
<h2 id="7-设置远程仓库为ssh模式">7 设置远程仓库为ssh模式</h2>
<p><code>git remote set-url origin git@github.com:Neutralmilkzzz/XXXXXXXXX.git</code></p>
<h2 id="8-推送">8 推送</h2>
<p><code>git push origin main</code></p>
<p>这就是github基本操作了。下次我们仔细讲讲git</p>
]]></description></item></channel></rss>