<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
  <title>OnO</title>
  
  <subtitle>OnO LoL is blog of Corn Mars from Ono city.</subtitle>
  <link href="/atom.xml" rel="self"/>
  
  <link href="http://ono.lol/"/>
  <updated>2025-08-21T13:28:39.288Z</updated>
  <id>http://ono.lol/</id>
  
  <author>
    <name>OnO</name>
    
  </author>
  
  <generator uri="https://hexo.io/">Hexo</generator>
  
  <entry>
    <title>电脑支持每个git提交时名称不同</title>
    <link href="http://ono.lol/2025/08/21/MacBookUsageFAQ/%E7%94%B5%E8%84%91%E6%94%AF%E6%8C%81%E6%AF%8F%E4%B8%AAgit%E6%8F%90%E4%BA%A4%E6%97%B6%E5%90%8D%E7%A7%B0%E4%B8%8D%E5%90%8C/"/>
    <id>http://ono.lol/2025/08/21/MacBookUsageFAQ/%E7%94%B5%E8%84%91%E6%94%AF%E6%8C%81%E6%AF%8F%E4%B8%AAgit%E6%8F%90%E4%BA%A4%E6%97%B6%E5%90%8D%E7%A7%B0%E4%B8%8D%E5%90%8C/</id>
    <published>2025-08-21T13:08:46.000Z</published>
    <updated>2025-08-21T13:28:39.288Z</updated>
    
    <content type="html"><![CDATA[<p>在配置 <a href="./电脑支持git多账号.md">电脑支持 git 多账号</a> 之后, 由于设置的 name 和 email 是全局的, 所以不同项目提交的时候用户名是相同的, 这严重违背了隔离的原则.</p><ol><li><p>删除全局配置, 注释掉 <code>email</code> 和 <code>name</code> 内容</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 删除全局配置 name 和 email</span></span><br><span class="line">&gt; vim ~/.gitconfig</span><br><span class="line">[user]</span><br><span class="line">  useConfigOnly = <span class="literal">true</span></span><br><span class="line">  <span class="comment"># name = admin</span></span><br><span class="line">  <span class="comment"># email = admin@gmail.com</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 查看配置是否生效</span></span><br><span class="line">&gt; git config --global user.name &amp;&amp; git config --global user.email</span><br></pre></td></tr></table></figure></li><li><p>在每个 git 项目中单独配置, 这样可以实现各个项目的提交人不同</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 配置基于项目的 name 和 email</span></span><br><span class="line">&gt; git config user.name <span class="string">"zs"</span></span><br><span class="line">&gt; git config user.email <span class="string">"zs@qq.com"</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 查看配置是否生效</span></span><br><span class="line">&gt; git config --<span class="built_in">local</span> user.name &amp;&amp; git config --<span class="built_in">local</span> user.email</span><br></pre></td></tr></table></figure></li></ol><p>而且由于删除了全局配置, 在每次提交代码的时候, 都会提示没有设置 <code>name</code> 和 <code>email</code>, 这样会提交失败, 保证提醒针对项目, 设置正确的 name 和 email.</p><h2 id="详细解析"><a href="#详细解析" class="headerlink" title="详细解析"></a>详细解析</h2><p>在使用多个 .ssh/config 配置指向不同 GitHub 账户时，为了让不同项目使用不同的 email 和 name，需要为每个 Git 仓库单独配置用户信息，同时确保 SSH 配置正确映射到对应的 GitHub 账户。以下是详细的解决方案：</p><h3 id="1-配置-ssh-config-文件"><a href="#1-配置-ssh-config-文件" class="headerlink" title="1. 配置 .ssh/config 文件"></a>1. 配置 .ssh/config 文件</h3><p>确保你的 .ssh/config 文件已经正确配置了多个 GitHub 账户的 SSH 密钥。例如：</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br></pre></td><td class="code"><pre><span class="line"># 账户 1 (例如 personal GitHub)</span><br><span class="line">Host github.com-personal</span><br><span class="line">    HostName github.com</span><br><span class="line">    User git</span><br><span class="line">    IdentityFile ~/.ssh/id_rsa_personal</span><br><span class="line"></span><br><span class="line"># 账户 2 (例如 work GitHub)</span><br><span class="line">Host github.com-work</span><br><span class="line">    HostName github.com</span><br><span class="line">    User git</span><br><span class="line">    IdentityFile ~/.ssh/id_rsa_work</span><br></pre></td></tr></table></figure><ul><li>Host 是你自定义的别名，用于区分不同的 GitHub 账户。</li><li>IdentityFile 指向对应的私钥文件（如 ~/.ssh/id_rsa_personal 和 ~/.ssh/id_rsa_work）。</li></ul><p>确保这些私钥已经添加到你的 SSH 代理 (ssh-add ~/.ssh/id_rsa_personal 和 ssh-add ~/.ssh/id_rsa_work)。</p><h3 id="2-为每个-Git-仓库设置独立的-user-name-和-user-email"><a href="#2-为每个-Git-仓库设置独立的-user-name-和-user-email" class="headerlink" title="2. 为每个 Git 仓库设置独立的 user.name 和 user.email"></a>2. 为每个 Git 仓库设置独立的 user.name 和 user.email</h3><p>Git 允许在每个仓库中设置独立的 user.name 和 user.email，这些配置会覆盖全局配置。操作步骤如下：</p><blockquote><p>进入项目目录: 假设你有两个项目，分别对应不同的 GitHub 账户：</p></blockquote><ul><li>项目 A：~/projects/personal-project（使用 github.com-personal）</li><li>项目 B：~/projects/work-project（使用 github.com-work）</li></ul><ol><li><p>为项目 A 设置用户信息</p><p>进入项目 A 的目录并运行以下命令：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">cd</span> ~/projects/personal-project</span><br><span class="line">git config user.name <span class="string">"YourPersonalName"</span></span><br><span class="line">git config user.email <span class="string">"personal@example.com"</span></span><br></pre></td></tr></table></figure></li><li><p>为项目 B 设置用户信息</p><p>进入项目 B 的目录并运行以下命令：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">cd</span> ~/projects/work-project</span><br><span class="line">git config user.name <span class="string">"YourWorkName"</span></span><br><span class="line">git config user.email <span class="string">"work@example.com"</span></span><br></pre></td></tr></table></figure></li><li><p>验证配置</p><p>在每个项目目录下运行以下命令，确认配置是否正确：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">git config --get user.name</span><br><span class="line">git config --get user.email</span><br></pre></td></tr></table></figure><p>这些配置会保存在每个项目目录下的 .git/config 文件中，适用于该项目的所有 Git 操作。</p></li></ol><h3 id="3-配置-Git-仓库的远程-URL-使用正确的-SSH-别名"><a href="#3-配置-Git-仓库的远程-URL-使用正确的-SSH-别名" class="headerlink" title="3. 配置 Git 仓库的远程 URL 使用正确的 SSH 别名"></a>3. 配置 Git 仓库的远程 URL 使用正确的 SSH 别名</h3><p>为了确保 Git 使用正确的 SSH 配置（即 .ssh/config 中的 Host），需要将每个项目的远程仓库 URL 设置为对应的 Host 别名。</p><ol><li><p>检查当前远程 URL</p><p>在项目目录下运行：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">git remote -v</span><br></pre></td></tr></table></figure><p>如果远程 URL 是标准的 <code>git@github.com:username/repo.git</code>，需要将其修改为使用 <code>.ssh/config</code> 中的别名。</p></li><li><p>修改远程 URL</p><p>对于项目 A（使用 github.com-personal）：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">git remote <span class="built_in">set</span>-url origin git@github.com-personal:username/repo.git</span><br></pre></td></tr></table></figure><p>对于项目 B（使用 github.com-work）：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">git remote <span class="built_in">set</span>-url origin git@github.com-work:username/repo.git</span><br></pre></td></tr></table></figure><p>这里 username/repo 应替换为实际的 GitHub 用户名和仓库名。</p></li><li><p>验证 SSH 连接</p><p>确保 SSH 配置正确，运行以下命令测试连接：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">ssh -T git@github.com-personal</span><br><span class="line">ssh -T git@github.com-work</span><br></pre></td></tr></table></figure><p>如果配置正确，你应该会看到类似 <code>Hi username! You&#39;ve successfully authenticated...</code> 的消息。</p></li></ol><h3 id="4-提交代码"><a href="#4-提交代码" class="headerlink" title="4. 提交代码"></a>4. 提交代码</h3><p>在每个项目目录下，提交代码时 Git 会自动使用该项目目录下配置的 <code>user.name</code> 和 <code>user.email</code>，并通过 <code>.ssh/config</code> 中定义的 SSH 别名连接到正确的 GitHub 账户。</p><p>例如，在 personal-project 目录下：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">git add .</span><br><span class="line">git commit -m <span class="string">"Commit message"</span></span><br><span class="line">git push origin main</span><br></pre></td></tr></table></figure><p>提交会使用 <code>YourPersonalName</code> 和 <code>personal@example.com</code>，并通过 <code>github.com-personal</code> 的 SSH 密钥推送。</p><h3 id="5-可选：设置条件包含（Conditional-Includes）"><a href="#5-可选：设置条件包含（Conditional-Includes）" class="headerlink" title="5. 可选：设置条件包含（Conditional Includes）"></a>5. 可选：设置条件包含（Conditional Includes）</h3><p>如果你的项目分布在不同的目录，可以使用 Git 的条件包含（Conditional Includes）来自动加载对应的全局配置，减少手动设置的麻烦。</p><p>创建单独的 Git 配置文件</p><p>在 <code>~/.gitconfig</code> 中配置条件包含。例如：</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><span class="line"># 主 Git 配置文件 (~/.gitconfig)</span><br><span class="line">[user]</span><br><span class="line">    name = DefaultName</span><br><span class="line">    email = default@example.com</span><br><span class="line"></span><br><span class="line">[includeIf "gitdir:~/projects/personal/"]</span><br><span class="line">    path = ~/.gitconfig-personal</span><br><span class="line"></span><br><span class="line">[includeIf "gitdir:~/projects/work/"]</span><br><span class="line">    path = ~/.gitconfig-work</span><br></pre></td></tr></table></figure><p>创建个人和工作配置文件</p><p><code>~/.gitconfig-personal</code>：</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">[user]</span><br><span class="line">    name = YourPersonalName</span><br><span class="line">    email = personal@example.com</span><br></pre></td></tr></table></figure><p><code>~/.gitconfig-work</code>：</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">[user]</span><br><span class="line">    name = YourWorkName</span><br><span class="line">    email = work@example.com</span><br></pre></td></tr></table></figure><p>工作原理</p><p>当你在 <code>~/projects/personal/</code> 下的仓库操作时，Git 会自动加载 <code>~/.gitconfig-personal</code> 中的配置。</p><p>当你在 <code>~/projects/work/</code> 下的仓库操作时，Git 会加载 <code>~/.gitconfig-work</code>。</p><p>注意：includeIf 仅适用于 Git 2.13 及以上版本。运行 git –version 检查你的 Git 版本。</p><h3 id="6-注意事项"><a href="#6-注意事项" class="headerlink" title="6. 注意事项"></a>6. 注意事项</h3><ul><li><p><strong>SSH 密钥管理</strong>：确保你的 SSH 密钥已正确生成并添加到 GitHub 账户（在 GitHub 的 Settings &gt; SSH and GPG keys 中添加）。</p></li><li><p><strong>全局配置</strong>：如果你没有为某个仓库设置 user.name 和 user.email，Git 会使用全局配置（~/.gitconfig）。建议检查全局配置以避免意外：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">git config --global user.name</span><br><span class="line">git config --global user.email</span><br></pre></td></tr></table></figure></li><li><p><strong>SSH 代理</strong>：确保 SSH 代理已加载所有必要的密钥：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">ssh-add -l</span><br></pre></td></tr></table></figure></li></ul><p>如果密钥未列出，添加它们：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">ssh-add ~/.ssh/id_rsa_personal</span><br><span class="line">ssh-add ~/.ssh/id_rsa_work</span><br></pre></td></tr></table></figure><p>多个远程仓库：如果一个项目需要推送到多个 GitHub 账户，可以添加多个远程 URL（例如 <code>origin-personal</code> 和 <code>origin-work</code>），并分别推送到不同的远程。</p><h3 id="7-故障排查"><a href="#7-故障排查" class="headerlink" title="7. 故障排查"></a>7. 故障排查</h3><ul><li><strong>提交显示错误的用户名</strong>：检查当前仓库的 <code>git config user.name</code> 和 <code>user.email</code>，确保它们与目标 GitHub 账户一致。</li><li><strong>SSH 连接失败</strong>：运行 <code>ssh -vT git@github.com-personal</code> 检查 SSH 连接问题，可能需要检查密钥权限（<code>chmod 600 ~/.ssh/id_rsa*</code>）。</li><li><strong>全局配置干扰</strong>：如果全局配置覆盖了本地配置，运行 <code>git config --unset user.name</code> 和 <code>git config --unset user.email</code> 清除本地配置，重新设置。</li></ul><p>通过以上步骤，你可以在不同项目中使用不同的 <code>user.name</code> 和 <code>user.email</code>，并通过 <code>.ssh/config</code> 正确映射到对应的 GitHub 账户。</p>]]></content>
    
    <summary type="html">
    
      
      
        &lt;p&gt;在配置 &lt;a href=&quot;./电脑支持git多账号.md&quot;&gt;电脑支持 git 多账号&lt;/a&gt; 之后, 由于设置的 name 和 email 是全局的, 所以不同项目提交的时候用户名是相同的, 这严重违背了隔离的原则.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;p&gt;删除全局配置, 注释掉 
      
    
    </summary>
    
    
      <category term="计算机" scheme="http://ono.lol/categories/%E8%AE%A1%E7%AE%97%E6%9C%BA/"/>
    
    
      <category term="Tools" scheme="http://ono.lol/tags/Tools/"/>
    
      <category term="Git" scheme="http://ono.lol/tags/Git/"/>
    
  </entry>
  
  <entry>
    <title>BlockChain/IPFS 地址转换规则</title>
    <link href="http://ono.lol/2024/01/11/BlockChain/IPFS%20%E5%9C%B0%E5%9D%80%E8%BD%AC%E6%8D%A2%E8%A7%84%E5%88%99/"/>
    <id>http://ono.lol/2024/01/11/BlockChain/IPFS%20%E5%9C%B0%E5%9D%80%E8%BD%AC%E6%8D%A2%E8%A7%84%E5%88%99/</id>
    <published>2024-01-11T03:59:28.809Z</published>
    <updated>2024-01-11T03:59:36.839Z</updated>
    
    <content type="html"><![CDATA[<p>IPFS 地址转换规则</p><ul><li>IPFS 地址: ipfs://${address}/${filename}</li><li>在线地址: <a href="https://ipfs.io/ipfs/${address}/${filename}" target="_blank" rel="noopener">https://ipfs.io/ipfs/${address}/${filename}</a></li><li>本地地址: <a href="http://127.0.0.1:8080/ipfs/${address}/${filename}" target="_blank" rel="noopener">http://127.0.0.1:8080/ipfs/${address}/${filename}</a></li></ul><p>后面部分是相同的, 前面部分相互转换</p><ul><li>IPFS 地址: ipfs://</li><li>在线地址: <a href="https://ipfs.io/ipfs/" target="_blank" rel="noopener">https://ipfs.io/ipfs/</a></li><li>本地地址: <a href="http://127.0.0.1:8080/ipfs/" target="_blank" rel="noopener">http://127.0.0.1:8080/ipfs/</a></li></ul>]]></content>
    
    <summary type="html">
    
      
      
        &lt;p&gt;IPFS 地址转换规则&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;IPFS 地址: ipfs://${address}/${filename}&lt;/li&gt;
&lt;li&gt;在线地址: &lt;a href=&quot;https://ipfs.io/ipfs/${address}/${filename}&quot; targ
      
    
    </summary>
    
    
    
  </entry>
  
  <entry>
    <title>MacOS nvm 使用规范</title>
    <link href="http://ono.lol/2024/01/10/ComputerScience/JavaScript/MacOS%20nvm%20%E4%BD%BF%E7%94%A8%E8%A7%84%E8%8C%83/"/>
    <id>http://ono.lol/2024/01/10/ComputerScience/JavaScript/MacOS%20nvm%20%E4%BD%BF%E7%94%A8%E8%A7%84%E8%8C%83/</id>
    <published>2024-01-10T06:25:19.000Z</published>
    <updated>2025-08-21T11:53:19.657Z</updated>
    
    <content type="html"><![CDATA[<h2 id="install-nvm"><a href="#install-nvm" class="headerlink" title="install nvm"></a>install nvm</h2><p>see: <a href="https://github.com/nvm-sh/nvm" target="_blank" rel="noopener">https://github.com/nvm-sh/nvm</a></p><ol><li>先在系统安装一个 system 版本的 nodejs 软件</li><li>执行命令 <code>curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.7/install.sh | bash</code> 安装 nvm</li><li>在 <code>~/.bash_profile</code>, <code>~/.zshrc</code>, <code>~/.profile</code>, or <code>~/.bashrc</code> 添加 配置文件</li></ol><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">export</span> NVM_DIR=<span class="string">"<span class="variable">$([ -z "$&#123;XDG_CONFIG_HOME-&#125;" ] &amp;&amp; printf %s "$&#123;HOME&#125;/.nvm" || printf %s "$&#123;XDG_CONFIG_HOME&#125;/nvm")</span>"</span></span><br><span class="line">[ -s <span class="string">"<span class="variable">$NVM_DIR</span>/nvm.sh"</span> ] &amp;&amp; \. <span class="string">"<span class="variable">$NVM_DIR</span>/nvm.sh"</span> <span class="comment"># This loads nvm</span></span><br></pre></td></tr></table></figure><h2 id="使用-nvm-的规范"><a href="#使用-nvm-的规范" class="headerlink" title="使用 nvm 的规范"></a>使用 nvm 的规范</h2><ol><li>nvm use version 之后, 使用 npm 安装的全局包会优先于 使用 yarn pnpm 安装的全局包 (use 之后安装的无效仍是 yarn 版在前, 需要重新 source ~/.zshrc)</li><li>npm 安装的全局包与 node version 关联, 但是 yarn pnpm 安装的全局包, 跨 node 版本使用 =&gt; 如果有包是对 node 版本有兼容性需求, 必须使用 npm 方式全局安装</li></ol><p>总结:</p><p>npm 全局包只在当前 version 有效, 每个 version 要用都需要单独安装, 但是兼容性好<br>yarn 全局包跨 node 版本使用, 一次安装全版本可用, 但是有兼容性需求的不建议使用</p>]]></content>
    
    <summary type="html">
    
      
      
        &lt;h2 id=&quot;install-nvm&quot;&gt;&lt;a href=&quot;#install-nvm&quot; class=&quot;headerlink&quot; title=&quot;install nvm&quot;&gt;&lt;/a&gt;install nvm&lt;/h2&gt;&lt;p&gt;see: &lt;a href=&quot;https://github.com/n
      
    
    </summary>
    
    
      <category term="计算机" scheme="http://ono.lol/categories/%E8%AE%A1%E7%AE%97%E6%9C%BA/"/>
    
      <category term="NodeJS" scheme="http://ono.lol/categories/%E8%AE%A1%E7%AE%97%E6%9C%BA/NodeJS/"/>
    
    
      <category term="NodeJS" scheme="http://ono.lol/tags/NodeJS/"/>
    
      <category term="JavaScript" scheme="http://ono.lol/tags/JavaScript/"/>
    
  </entry>
  
  <entry>
    <title>OnePlus 安装 NetHunter</title>
    <link href="http://ono.lol/2023/11/19/Security/OnePlus%20%E5%AE%89%E8%A3%85%20NetHunter/"/>
    <id>http://ono.lol/2023/11/19/Security/OnePlus%20%E5%AE%89%E8%A3%85%20NetHunter/</id>
    <published>2023-11-19T01:01:42.000Z</published>
    <updated>2023-11-19T01:10:03.702Z</updated>
    
    <content type="html"><![CDATA[<h2 id="安装-BootLoader-解锁-OEM"><a href="#安装-BootLoader-解锁-OEM" class="headerlink" title="安装 BootLoader 解锁 OEM"></a>安装 BootLoader 解锁 OEM</h2><h3 id="1-解锁-Developer-Mode"><a href="#1-解锁-Developer-Mode" class="headerlink" title="1. 解锁 Developer Mode"></a>1. 解锁 Developer Mode</h3><ol><li>手机端进入设置, 点击 <code>About Device</code></li><li>下拉找到 <code>Version</code> 点击进入, 不是 <code>Android Version</code> 哦!</li><li>点击 7 次 <code>Build Number</code> 输入手机密码激活 Developer Mode</li></ol><h3 id="2-设置-USB-Debug"><a href="#2-设置-USB-Debug" class="headerlink" title="2. 设置 USB Debug"></a>2. 设置 USB Debug</h3><ol><li>手机端进入设置, 点击 <code>Additional settings</code></li><li>下拉找到 <code>Developer options</code>, 点击进入</li><li>点击开启 <code>OEM unlocking</code></li><li>点击开启 <code>USB debugging</code></li></ol><h3 id="3-下载-amp-安装工具"><a href="#3-下载-amp-安装工具" class="headerlink" title="3. 下载&amp;安装工具"></a>3. 下载&amp;安装工具</h3><ol><li>Google Platform Tools: <a href="https://developer.android.com/tools/releases/platform-tools" target="_blank" rel="noopener">https://developer.android.com/tools/releases/platform-tools</a></li><li>Google Android USB Driver: <a href="https://developer.android.com/studio/run/win-usb" target="_blank" rel="noopener">https://developer.android.com/studio/run/win-usb</a></li></ol><p>安装方法1: 上面链接可以独立下载 Platform Tools 并且 手动安装 USB Driver.</p><p><strong>安装 Platform Tools:</strong></p><ul><li>解压 Platform Tools</li><li>在 CMD 运行 adb devices 在 <code>List of devices attached</code> 下方显示手机列表即为成功.</li></ul><p><strong>安装 USB Driver:</strong></p><ul><li>解压 usb_driver_r13-windows 到桌面 <code>usb_driver</code> 文件夹</li><li>CMD 运行 <code>devmgmt.msc</code> 打开 Device Manager</li><li>找到 Other devices 中的 Android 右键, 点击 <code>Update Driver</code> 弹出更新驱动界面<ul><li>选择 <code>Browse My compute for drivers</code></li><li>点击 <code>Let me pick from a list of available drivers on my computer</code></li><li>在 <code>Show All Devices</code> 上点击 Next 下一步</li><li>点击 <code>Have Disk...</code></li><li>Browse 选择桌面的 <code>usb_driver</code> 文件夹中的 <code>android_winusb.inf</code> 文件</li><li>依次点击 Open - OK</li><li>在选择 driver 列表中选择 <code>Android Bootloader Interface</code> 后点击 Next</li></ul></li><li>在 CMD 运行 <code>fastboot devices</code> 展示一个列表, 表示安装成功</li></ul><p>安装方法2: 下载 Android Studio 安装, 在 <code>SDK Manager</code> 中安装</p><ul><li>打开 Android Studio</li><li>找到 SDK Manager 进入 Android SDK 界面</li><li>Android SDK<ul><li>SDK Platform 中勾选 <code>Android API 34</code> 下面的 <code>Android SDK Platform 34</code></li><li>找不到记得勾选 <code>Show Package Details</code></li><li>Apply 确定生效(下载中需要等待)</li></ul></li><li>Platform Tools 和 USB Driver<ul><li>SDK Tools 中勾选 <code>Android SDK Build Tools 34</code>, <code>Android SDK Platform Tools</code>, <code>Google USB Driver</code></li><li>Apply 确定生效(下载中需要等待)</li></ul></li></ul><h3 id="4-激活-Bootloader"><a href="#4-激活-Bootloader" class="headerlink" title="4. 激活 Bootloader"></a>4. 激活 Bootloader</h3><p style="color:red">注意: 此步骤操作会格式化手机, 提前备份好数据</p><p>CMD 运行命令</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 查看设备状态</span></span><br><span class="line">adb devices</span><br><span class="line"><span class="comment">## 显示 List of devices attached</span></span><br><span class="line"><span class="comment">##      xxxxxxxx  device</span></span><br><span class="line"><span class="comment">## 显示 unauthorized 时候要在手机端确定信任电脑</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 重启进入 Bootloader 模式, 此时手机重启</span></span><br><span class="line">adb reboot bootloader</span><br><span class="line"><span class="comment">## 显示绿字 `START`,</span></span><br><span class="line"><span class="comment">## 显示提示语 Press volume key to select, and press power key to select</span></span><br><span class="line"><span class="comment">## 显示红字 `FastBoot Mode` 等选项列表</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 查看可以进行 fastboot 操作的设备列表</span></span><br><span class="line">fastboot devices</span><br><span class="line"><span class="comment">## 显示 xxxxxxxx  fastboot</span></span><br><span class="line"><span class="comment">## 列表为空表示上面安装驱动步骤未成功</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 运行命令手机进入解锁 OEM 选项</span></span><br><span class="line">fastboot oem unlock</span><br><span class="line"><span class="comment">## 在手机端用音量键选择 `UNLOCK THE BOOTLOADER`, 电源键确认选项生效</span></span><br><span class="line"><span class="comment">## 手机重启进入格式化步骤</span></span><br><span class="line"><span class="comment">## 格式化后进入初始化手机步骤</span></span><br></pre></td></tr></table></figure><h3 id="5-查看-Bootloader-激活状态"><a href="#5-查看-Bootloader-激活状态" class="headerlink" title="5. 查看 Bootloader 激活状态"></a>5. 查看 Bootloader 激活状态</h3><p>再次进入 Developer Mode</p><ol><li>手机端进入设置, 点击 <code>Additional settings</code></li><li>下拉找到 <code>Developer options</code>, 点击进入</li><li>查看 <code>OEM unlocking</code> 已经处于开启状态, 并且不可以手动关闭, 表示激活成功.</li></ol><p>参考: <a href="https://www.youtube.com/watch?v=nQatU6AilHY&amp;t=5s&amp;ab_channel=SUPERSUPATCHER" target="_blank" rel="noopener">https://www.youtube.com/watch?v=nQatU6AilHY&amp;t=5s&amp;ab_channel=SUPERSUPATCHER</a></p><h2 id="获取-ROOT-权限"><a href="#获取-ROOT-权限" class="headerlink" title="获取 ROOT 权限"></a>获取 ROOT 权限</h2><h3 id="安装-twrp-系统"><a href="#安装-twrp-系统" class="headerlink" title="安装 twrp 系统"></a>安装 twrp 系统</h3><p>在官方 twrp 页面下载的软件版本只支持 Android 11 版本, 需要在 <a href="https://xdaforums.com/t/twrp-3-7-0-13-instantnoodle-twrp-for-oneplus-8-8pro-official-beta-3.4341707/" target="_blank" rel="noopener">https://xdaforums.com/t/twrp-3-7-0-13-instantnoodle-twrp-for-oneplus-8-8pro-official-beta-3.4341707/</a> 下载支持 Android 12 的 <code>ext4</code> 或 Android 13 的 <code>erofs</code> 版本 img.</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br></pre></td><td class="code"><pre><span class="line">adb devices</span><br><span class="line">adb reboot bootloader</span><br><span class="line">fastboot devices</span><br><span class="line"></span><br><span class="line"><span class="comment"># 确定 twrp 可以在手机端正常运行</span></span><br><span class="line">fastboot boot path/to/twrp_op8_xx-xx-xx.img</span><br><span class="line"><span class="comment">## 手机端进入蓝色的 twrp 系统, 表示可以正常运行</span></span><br><span class="line"><span class="comment">## 手机端选择 `Reboot` - `Bootloader` 重新回到 Bootloader 系统界面</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 开始刷入 twrp 到手机硬盘</span></span><br><span class="line">fastboot flash recovery_a path/to/twrp_op8_xx-xx-xx.img</span><br><span class="line">fastboot flash recovery_b path/to/twrp_op8_xx-xx-xx.img</span><br><span class="line"></span><br><span class="line"><span class="comment"># 进入刷入硬盘的 twrp 系统确认 twrp 正常运行</span></span><br><span class="line">fastboot boot path/to/twrp_op8_xx-xx-xx.img</span><br><span class="line"><span class="comment">## 手机端进入蓝色的 twrp 系统, 这个是在内存的系统</span></span><br><span class="line"><span class="comment">## 手机端选择 `Reboot` - `Recovery`</span></span><br><span class="line"><span class="comment">## 手机端再次进入蓝色的 twrp 系统, 这个是刷入到系统硬盘的</span></span><br></pre></td></tr></table></figure><h3 id="刷入-Magisk-软件获取-ROOT-权限"><a href="#刷入-Magisk-软件获取-ROOT-权限" class="headerlink" title="刷入 Magisk 软件获取 ROOT 权限"></a>刷入 Magisk 软件获取 ROOT 权限</h3><p>在 GitHub <a href="https://github.com/topjohnwu/Magisk/releases" target="_blank" rel="noopener">https://github.com/topjohnwu/Magisk/releases</a> 下载 Magisk 最新版本, 将 <code>Magisk-v26.x.apk</code> 复制处一份到 <code>Magisk-v26.x.zip</code></p><p>原教程在此处将其复制到 U盘中, 并且在 twrp 中对手机进行了格式化操作, 重启 Reboot 选择 Recovery 重新进入 twrp, 我这里并没有进行.</p><p>直接将 zip 复制到手机硬盘 Download 文件夹下. 在 twrp 系统中选择 Install, 点击 Select Storage 选择刚刚的 zip 文件, 滑动安装 Magisk 到 recovery_a 系统中.</p><p>回到首页, 点击 Reboot - System 回到手机系统.</p><p>这时已经有 Magisk 京剧脸图标表示安装成功, 如果没有在手机内存找到 Msgisk-v26.x.apk 重新安装, 就会出现该图标.</p><p>首次进入 Magisk 后, 提示 <code>Requires Additional Setup</code> 选择 OK (如果重启, 重启后再进入 Magisk 后, 提示 <code>Requires Additional Setup</code>) 选择 <code>Direct Install(Recommend)</code> 完成后点击 Reboot 重启.</p><p>至此, 已经完成了 Magisk 安装, 获取到 ROOT 权限.</p><p>参考: <a href="https://www.youtube.com/watch?v=3ZD3tb6FQvY&amp;t=270s&amp;ab_channel=SUPERSUPATCHER" target="_blank" rel="noopener">https://www.youtube.com/watch?v=3ZD3tb6FQvY&amp;t=270s&amp;ab_channel=SUPERSUPATCHER</a></p><h2 id="安装-NetHunter-工具"><a href="#安装-NetHunter-工具" class="headerlink" title="安装 NetHunter 工具"></a>安装 NetHunter 工具</h2><p>到 <a href="https://www.kali.org/get-kali/#kali-mobile" target="_blank" rel="noopener">https://www.kali.org/get-kali/#kali-mobile</a> 下载 OnePlus 版本的 image 到手机 Download 文件夹.</p><p>在 Magisk 的 <code>Modules</code> 中, 点击 <code>Install from storage</code>, 选择 <code>nethunter-xx-xx-xx-kalifs-full.zip</code> 确认安装即可.</p><p>安装后出现 NetHunter, NetHunter-Terminal 等软件, 开启需要授权 ROOT 权限才可以正常运行.</p><h3 id="在-NetHunter-Store-下载需要的其他工具"><a href="#在-NetHunter-Store-下载需要的其他工具" class="headerlink" title="在 NetHunter Store 下载需要的其他工具"></a>在 NetHunter Store 下载需要的其他工具</h3><p>其他默认未安装的软件, 在 Store 中 有下载, 之后需要 ROOT 权限在 Magisk 的 <code>SuperUser</code> 进行管理.</p><h2 id="Problems"><a href="#Problems" class="headerlink" title="Problems"></a>Problems</h2><h3 id="手机链接电脑只显示充电"><a href="#手机链接电脑只显示充电" class="headerlink" title="手机链接电脑只显示充电"></a>手机链接电脑只显示充电</h3><p>如果手机链接电脑之后, 只显示充电, 没有弹窗提示 <code>Use USB for</code> 的列表, 那么有可能是因为数据线本身只支持充电, 不支持数据传输, 这一点很多网上的解决方案并没有提及.</p><p>弹窗选项一般为</p><ul><li>Charging Only</li><li>File Transfer / Android Auto</li><li>Photo Transfer</li><li>USB Tethering</li><li>MIDI</li></ul><p>这里选择 <code>File Transfer</code> 之后即可.</p><p>参考: <a href="https://www.shujuwa.net/android/cannot-detect-device" target="_blank" rel="noopener">https://www.shujuwa.net/android/cannot-detect-device</a></p><h3 id="adb-shell-运行时报错-adb-server-version-22635-doesn-39-t-match-this-client-41"><a href="#adb-shell-运行时报错-adb-server-version-22635-doesn-39-t-match-this-client-41" class="headerlink" title="adb shell 运行时报错 adb server version (22635) doesn&#39;t match this client (41)"></a>adb shell 运行时报错 <code>adb server version (22635) doesn&#39;t match this client (41)</code></h3><p>因为我电脑本身有 Android Studio 和 独立下载的 Google Platform Tools, 并且对后者升级过后, 运行两者的 adb 时都报这个错.</p><p>开始看其他文章说因为有两个 adb 环境, 版本不同引发的冲突, 于是升级了 Android Studio 里面的 adb 环境版本, 但是运行二者仍然均无效. 也尝试了删除 <code>C:\Users\xxx\.android</code> 文件夹, 无效. 后来干脆删除独立版本的 adb 工具, 只保留 Android Studio 在 <code>C:\Users\xxx\AppData\Local\Android\Sdk\platform-tools</code> 内置的版本, 尝试仍然无效.</p><p>这时想到是否因为系统内存或某个地方仍然残留了老版本的 adb 信息, 于是重启, 再次运行 <code>adb devices</code> 启动 adb server 成功, 展示 devices 列表成功.</p><p>参考: <a href="https://www.cnblogs.com/yhjoker/p/9028900.html" target="_blank" rel="noopener">https://www.cnblogs.com/yhjoker/p/9028900.html</a></p><h3 id="启动-NetHunter-提示没有-Terminal-报错-点击确定退出"><a href="#启动-NetHunter-提示没有-Terminal-报错-点击确定退出" class="headerlink" title="启动 NetHunter 提示没有 Terminal 报错, 点击确定退出"></a>启动 NetHunter 提示没有 Terminal 报错, 点击确定退出</h3><p>安装 NetHunter 后, 正常有4个软件图标, 有时 Terminal 安装失败只有3个图标, 这时需要进入 NetHunter Store (三个其中的一个) 进行手动安装 Terminal. 如果最新版本安装一直失败, 可以选择安装之前的 2020 年版本, 秒成功.</p>]]></content>
    
    <summary type="html">
    
      
      
        &lt;h2 id=&quot;安装-BootLoader-解锁-OEM&quot;&gt;&lt;a href=&quot;#安装-BootLoader-解锁-OEM&quot; class=&quot;headerlink&quot; title=&quot;安装 BootLoader 解锁 OEM&quot;&gt;&lt;/a&gt;安装 BootLoader 解锁 OEM&lt;/h2&gt;&lt;
      
    
    </summary>
    
    
      <category term="计算机" scheme="http://ono.lol/categories/%E8%AE%A1%E7%AE%97%E6%9C%BA/"/>
    
      <category term="Hacker" scheme="http://ono.lol/categories/%E8%AE%A1%E7%AE%97%E6%9C%BA/Hacker/"/>
    
    
      <category term="Hacker" scheme="http://ono.lol/tags/Hacker/"/>
    
  </entry>
  
  <entry>
    <title>Docker 日志的批量清理思路</title>
    <link href="http://ono.lol/2023/11/12/ComputerScience/Docker/Docker%20%E6%97%A5%E5%BF%97%E7%9A%84%E6%89%B9%E9%87%8F%E6%B8%85%E7%90%86%E6%80%9D%E8%B7%AF/"/>
    <id>http://ono.lol/2023/11/12/ComputerScience/Docker/Docker%20%E6%97%A5%E5%BF%97%E7%9A%84%E6%89%B9%E9%87%8F%E6%B8%85%E7%90%86%E6%80%9D%E8%B7%AF/</id>
    <published>2023-11-12T06:09:50.000Z</published>
    <updated>2023-11-19T01:10:02.847Z</updated>
    
    <content type="html"><![CDATA[<p>在做某些小项目的时候, 有时候会需要快速搭建服务, 并且依赖一些第三方服务或者以前写的其他服务. 这时候, 可能无法有效的定义日志级别, 修改第三方服务或以前写的其他服务的日志策略和内容. 而且小项目因为成本因素, 测试服务器磁盘空间一般较小, 那么就会造成磁盘因日志问题引发的不足问题.</p><p>这时可以在前期无脑的定义日志清理策略:</p><ol><li><p>查看当前被 Docker 占用的磁盘空间大小</p><blockquote><p>list-docker-logs.sh</p></blockquote> <figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#!/bin/bash</span></span><br><span class="line"></span><br><span class="line">du -sh /var/lib/docker/containers/*</span><br></pre></td></tr></table></figure><p> <code>chmod +x list-docker-logs.sh</code></p></li><li><p>无脑清理所有由 Docker 产生的日志</p><blockquote><p>clear-docker-logs.sh</p></blockquote> <figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#!/bin/bash</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">for</span> c <span class="keyword">in</span> /var/lib/docker/containers/*</span><br><span class="line"><span class="keyword">do</span></span><br><span class="line">  <span class="keyword">if</span> [ -d <span class="string">"<span class="variable">$c</span>"</span> ]; <span class="keyword">then</span></span><br><span class="line">    <span class="built_in">log</span>=`ls <span class="variable">$c</span> | grep <span class="string">'json.log'</span>`</span><br><span class="line">    <span class="literal">true</span> &gt; <span class="variable">$c</span>/<span class="variable">$log</span></span><br><span class="line">    <span class="built_in">echo</span> clear <span class="variable">$c</span>/<span class="variable">$log</span></span><br><span class="line">  <span class="keyword">fi</span></span><br><span class="line"><span class="keyword">done</span></span><br></pre></td></tr></table></figure><p> <code>chmod +x clear-docker-logs.sh</code></p></li><li><p>使用定时任务自动清除</p></li></ol><p>使用 <code>crontab -e</code> 命令添加定时任务</p><p>首先在底部添加一行 <code>0 5 * * * /path/to/clear-docker-logs.sh</code></p>]]></content>
    
    <summary type="html">
    
      
      
        &lt;p&gt;在做某些小项目的时候, 有时候会需要快速搭建服务, 并且依赖一些第三方服务或者以前写的其他服务. 这时候, 可能无法有效的定义日志级别, 修改第三方服务或以前写的其他服务的日志策略和内容. 而且小项目因为成本因素, 测试服务器磁盘空间一般较小, 那么就会造成磁盘因日志问题引
      
    
    </summary>
    
    
      <category term="计算机" scheme="http://ono.lol/categories/%E8%AE%A1%E7%AE%97%E6%9C%BA/"/>
    
      <category term="Docker" scheme="http://ono.lol/categories/%E8%AE%A1%E7%AE%97%E6%9C%BA/Docker/"/>
    
    
      <category term="Docker" scheme="http://ono.lol/tags/Docker/"/>
    
  </entry>
  
  <entry>
    <title>电脑支持 git 多账号</title>
    <link href="http://ono.lol/2023/11/06/MacBookUsageFAQ/%E7%94%B5%E8%84%91%E6%94%AF%E6%8C%81git%E5%A4%9A%E8%B4%A6%E5%8F%B7/"/>
    <id>http://ono.lol/2023/11/06/MacBookUsageFAQ/%E7%94%B5%E8%84%91%E6%94%AF%E6%8C%81git%E5%A4%9A%E8%B4%A6%E5%8F%B7/</id>
    <published>2023-11-06T12:58:56.000Z</published>
    <updated>2025-08-21T13:02:12.306Z</updated>
    
    <content type="html"><![CDATA[<p>假设我有两个 GitHub 账号, 名为 zs(张三) 和 ls(李四). 张三李四存储 ssh key 的文件夹 <code>.ssh/ssh-key-xx/</code> 的内容各自有如下结构:</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line">.ssh&#x2F;</span><br><span class="line">    id_rsa</span><br><span class="line">    id_rsa.pub</span><br><span class="line">    known_hosts</span><br><span class="line">.gitconfig</span><br><span class="line">.gitignore_global</span><br><span class="line">.lesshst</span><br><span class="line">.stCommitMsg</span><br></pre></td></tr></table></figure><p>其中 .ssh 文件夹内由 <code>ssh-keygen -t RSA -C email</code> 生成, <code>.gitconfig</code> 是配置文件, <code>.gitignore_global</code> 是全局 ignore 配置文件, <code>.stCommitMsg</code> 是 commit 信息模板.</p><p><strong>.gitconfig 文件模板:</strong></p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br></pre></td><td class="code"><pre><span class="line">[user]</span><br><span class="line">  name &#x3D; USERNAME</span><br><span class="line">  email &#x3D; EMAIL_ADDRESS</span><br><span class="line">[core]</span><br><span class="line">  excludesfile &#x3D; &#x2F;root&#x2F;.gitignore_global</span><br><span class="line">[difftool &quot;sourcetree&quot;]</span><br><span class="line">  cmd &#x3D; opendiff \&quot;$LOCAL\&quot; \&quot;$REMOTE\&quot;</span><br><span class="line">  path &#x3D;</span><br><span class="line">[commit]</span><br><span class="line">  template &#x3D; &#x2F;root&#x2F;.stCommitMsg</span><br><span class="line">[filter &quot;lfs&quot;]</span><br><span class="line">  clean &#x3D; git-lfs clean -- %f</span><br><span class="line">  smudge &#x3D; git-lfs smudge -- %f</span><br><span class="line">  process &#x3D; git-lfs filter-process</span><br><span class="line">  required &#x3D; true</span><br><span class="line">[init]</span><br><span class="line">  defaultBranch &#x3D; master</span><br><span class="line">[http]</span><br><span class="line">  proxy &#x3D; http:&#x2F;&#x2F;0.0.0.0:1080</span><br><span class="line">[https]</span><br><span class="line">  proxy &#x3D; http:&#x2F;&#x2F;0.0.0.0:1080</span><br><span class="line">[git]</span><br><span class="line">  proxy &#x3D; http:&#x2F;&#x2F;0.0.0.0:1080</span><br></pre></td></tr></table></figure><p><strong>.gitignore_global 文件模板:</strong></p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">*~</span><br><span class="line">.DS_Store</span><br><span class="line">.env</span><br></pre></td></tr></table></figure><h2 id="Windows"><a href="#Windows" class="headerlink" title="Windows"></a>Windows</h2><p>使用 ssh 自带的 config 功能</p><p>配置 <code>~/.ssh/config</code> 文件</p><p>Windows 语法</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br></pre></td><td class="code"><pre><span class="line">Host zs</span><br><span class="line">  HostName github.com</span><br><span class="line">  IdentityFile C:\\???\\.ssh\\ssh-key-zs\\.ssh\\id_rsa</span><br><span class="line">  PreferredAuthentications publickey</span><br><span class="line">  User git</span><br><span class="line"></span><br><span class="line">Host ls</span><br><span class="line">  HostName github.com</span><br><span class="line">  IdentityFile C:\\???\\.ssh\\ssh-key-ls\\.ssh\\id_rsa</span><br><span class="line">  PreferredAuthentications publickey</span><br><span class="line">  User git</span><br></pre></td></tr></table></figure><p>上面配置的意思为, 使用 <code>zs</code> 账号时将 <code>github.com</code> 替换成 <code>zs</code> 别名, 例如 <code>git clone git@zs:username/project.git</code>, 这时 <code>git@zs</code> 将对 张三账号有权限. <code>git@ls</code> 将对李四账号有权限.</p><p>在首次设置过远程地址 <code>git remote add origin git@zs:...</code> 或克隆远程地址 <code>git clone git@zs:...</code> 之后, 再使用就正常进行操作即可.</p><h2 id="MacOS"><a href="#MacOS" class="headerlink" title="MacOS"></a>MacOS</h2><p>方法 1: 参考 Windows, 只是语法略有不同</p><p>MacOS 语法</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br></pre></td><td class="code"><pre><span class="line">Host zs</span><br><span class="line">  HostName github.com</span><br><span class="line">  IdentityFile ~&#x2F;.ssh&#x2F;ssh-key-zs&#x2F;.ssh&#x2F;id_rsa</span><br><span class="line">  PreferredAuthentications publickey</span><br><span class="line">  User git</span><br><span class="line"></span><br><span class="line">Host ls</span><br><span class="line">  HostName github.com</span><br><span class="line">  IdentityFile ~&#x2F;.ssh&#x2F;ssh-key-ls&#x2F;.ssh&#x2F;id_rsa</span><br><span class="line">  PreferredAuthentications publickey</span><br><span class="line">  User git</span><br></pre></td></tr></table></figure><p>方法 2: 安装 docker, 在 <code>~/.zshrc</code> 中定义函数, 用于调用 docker 的 git 镜像, 实现多账号功能</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">function</span> <span class="function"><span class="title">gitzs</span></span> () &#123;</span><br><span class="line">    (docker run -ti --rm -v <span class="variable">$&#123;HOME&#125;</span>/.ssh/ssh-key-zs/:/root/ -v <span class="variable">$&#123;PWD&#125;</span>:/git alpine/git <span class="string">"<span class="variable">$@</span>"</span>)</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">function</span> <span class="function"><span class="title">gitls</span></span> () &#123;</span><br><span class="line">    (docker run -ti --rm -v <span class="variable">$&#123;HOME&#125;</span>/.ssh/ssh-key-ls/:/root/ -v <span class="variable">$&#123;PWD&#125;</span>:/git alpine/git <span class="string">"<span class="variable">$@</span>"</span>)</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>使用 <code>gitzs</code> 命令 替代 <code>git</code> 即 <code>gitzs clone git@github.com:username/project.git</code> 将对张三账号有权限. 同样, 使用 <code>gitls</code> 命令替代 <code>git</code> 将对李四账号有权限</p><p>之后都使用 <code>gitzs</code> 和 <code>gitls</code> 替代 <code>git</code> 命令, 实现对张三李四账号的控制.</p>]]></content>
    
    <summary type="html">
    
      
      
        &lt;p&gt;假设我有两个 GitHub 账号, 名为 zs(张三) 和 ls(李四). 张三李四存储 ssh key 的文件夹 &lt;code&gt;.ssh/ssh-key-xx/&lt;/code&gt; 的内容各自有如下结构:&lt;/p&gt;
&lt;figure class=&quot;highlight plain&quot;&gt;&lt;
      
    
    </summary>
    
    
      <category term="计算机" scheme="http://ono.lol/categories/%E8%AE%A1%E7%AE%97%E6%9C%BA/"/>
    
    
      <category term="Tools" scheme="http://ono.lol/tags/Tools/"/>
    
      <category term="Git" scheme="http://ono.lol/tags/Git/"/>
    
  </entry>
  
  <entry>
    <title>如何下载 Telegram 无法下载的视频图片</title>
    <link href="http://ono.lol/2023/11/04/Security/%E5%A6%82%E4%BD%95%E4%B8%8B%E8%BD%BD%20Telegram%20%E6%97%A0%E6%B3%95%E4%B8%8B%E8%BD%BD%E7%9A%84%E8%A7%86%E9%A2%91%E5%9B%BE%E7%89%87/"/>
    <id>http://ono.lol/2023/11/04/Security/%E5%A6%82%E4%BD%95%E4%B8%8B%E8%BD%BD%20Telegram%20%E6%97%A0%E6%B3%95%E4%B8%8B%E8%BD%BD%E7%9A%84%E8%A7%86%E9%A2%91%E5%9B%BE%E7%89%87/</id>
    <published>2023-11-04T15:57:34.000Z</published>
    <updated>2023-11-04T16:04:26.500Z</updated>
    
    <content type="html"><![CDATA[<h2 id="软件信息"><a href="#软件信息" class="headerlink" title="软件信息"></a>软件信息</h2><ul><li>Github: <a href="https://github.com/iyear/tdl" target="_blank" rel="noopener">https://github.com/iyear/tdl</a></li><li>参考教程: <a href="https://www.youtube.com/watch?v=ltBa_sV3IVU&amp;ab_channel=%E6%98%93%E4%BA%91%E5%A4%A9%E5%A0%82" target="_blank" rel="noopener">https://www.youtube.com/watch?v=ltBa_sV3IVU&amp;ab_channel=%E6%98%93%E4%BA%91%E5%A4%A9%E5%A0%82</a></li><li>参考文档: <a href="https://docs.iyear.me/tdl/more/cli/tdl_login/" target="_blank" rel="noopener">https://docs.iyear.me/tdl/more/cli/tdl_login/</a></li></ul><p>在Github 下载源代码编译, 或者直接下载 Release 中预编译的最新版本, 之后得到一个 <code>tdl</code> 或 <code>tdl.exe</code> 文件</p><h2 id="基本使用教程"><a href="#基本使用教程" class="headerlink" title="基本使用教程"></a>基本使用教程</h2><p>登录, 这里的 NAMESPACE 是自定义的一个值, 以便后门使用</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">.\tdl.exe login -n NAMESPACE -d <span class="string">"C:\bin\Telegram\tdata"</span> --debug --proxy socks5://127.0.0.1:7890 --reconnect-timeout 30s</span><br></pre></td></tr></table></figure><p style="color: red">PS: 注意, 之后的命令其他教程没有添加 `-n` 或 `--proxy`, 精测试每条命令都必须携带这两个参数, 登录时的各种参数并没有自动继承到后续的命令行中</p><p>查看群组ID, 会有 <code>ID-Type-VisibleName-Username-Topics</code> 的一个列表</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">.\tdl.exe -n NAMESPACE --proxy socks5://127.0.0.1:1080 chat ls</span><br></pre></td></tr></table></figure><p>导出群组图片/视频列表, 会有一个 <code>tdl-export.json</code> 文件</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">.\tdl.exe -n NAMESPACE --proxy socks5://127.0.0.1:1080 chat <span class="built_in">export</span> -c 1589558175</span><br></pre></td></tr></table></figure><p>批量下载</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">.\tdl.exe -n NAMESPACE --proxy socks5://127.0.0.1:1080 dl -f ./tdl-export.json</span><br></pre></td></tr></table></figure><p>单个下载: 最后的 url 在消息中右键获取</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">.\tdl.exe -n NAMESPACE --proxy socks5://127.0.0.1:1080 dl -u https://t.me/.../..</span><br></pre></td></tr></table></figure>]]></content>
    
    <summary type="html">
    
      
      
        &lt;h2 id=&quot;软件信息&quot;&gt;&lt;a href=&quot;#软件信息&quot; class=&quot;headerlink&quot; title=&quot;软件信息&quot;&gt;&lt;/a&gt;软件信息&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;Github: &lt;a href=&quot;https://github.com/iyear/tdl&quot; target=&quot;_
      
    
    </summary>
    
    
      <category term="计算机" scheme="http://ono.lol/categories/%E8%AE%A1%E7%AE%97%E6%9C%BA/"/>
    
      <category term="Hacker" scheme="http://ono.lol/categories/%E8%AE%A1%E7%AE%97%E6%9C%BA/Hacker/"/>
    
    
      <category term="Hacker" scheme="http://ono.lol/tags/Hacker/"/>
    
  </entry>
  
  <entry>
    <title>Jupyter Notebook 的使用小技巧</title>
    <link href="http://ono.lol/2023/10/29/ComputerScience/Python/Jupyter%20Notebook%20%E7%9A%84%E4%BD%BF%E7%94%A8%E5%B0%8F%E6%8A%80%E5%B7%A7/"/>
    <id>http://ono.lol/2023/10/29/ComputerScience/Python/Jupyter%20Notebook%20%E7%9A%84%E4%BD%BF%E7%94%A8%E5%B0%8F%E6%8A%80%E5%B7%A7/</id>
    <published>2023-10-29T08:32:05.000Z</published>
    <updated>2023-11-19T04:19:33.700Z</updated>
    
    <content type="html"><![CDATA[<h2 id="环境与启动"><a href="#环境与启动" class="headerlink" title="环境与启动"></a>环境与启动</h2><p>参见 <a href="../MachineLearning/人工智能学习%201%20-%20基础工具安装.md">人工智能学习 1 - 基础工具安装</a> or 参见官方文档 <a href="https://jupyter.org/install" target="_blank" rel="noopener">Installing Jupyter</a></p><p>使用 <code>jypyter notebook</code> 命令启动程序, 该程序会启动一个网页. 参见 <a href="https://docs.jupyter.org/en/latest/running.html" target="_blank" rel="noopener">Running the Notebook</a></p><h2 id="Jupyter-的基本用法"><a href="#Jupyter-的基本用法" class="headerlink" title="Jupyter 的基本用法"></a>Jupyter 的基本用法</h2><p>新建 <code>Python3 (ipykernel)</code> 保存 <code>.ipynb</code> 文件到指定位置</p><ol><li>Cell 称为单元, 一个 <code>输入框</code> 加上 输入框下面的 <code>输出区域</code></li><li>点击输入框进入输入模式<ul><li>在上面下拉菜单可以选择 Code, Markdown, Raw NBConvert, Heading 几种模式</li><li><code>ctrl+enter</code> 运行代码</li></ul></li><li>esc 退出输入框进入编辑模型<ul><li>在单元格内可以编辑内容</li><li><code>alt+enter</code> 创建新单元</li><li><code>b</code> below 创建新单元</li><li><code>a</code> ahead 创建新单元</li><li><code>dd</code> 删除单元</li></ul></li><li>代码提示<ul><li><code>func?</code> 展示方法参数返回值</li><li><code>func??</code> 展示方法源代码</li><li>在函数括号内 <code>shift+tab</code> 提示函数参数</li></ul></li></ol><h2 id="特殊符号"><a href="#特殊符号" class="headerlink" title="特殊符号"></a>特殊符号</h2><ul><li><code>!cmd</code> 创建一个子 shell 运行命令, 运行结束后子 shell 退出.</li><li><code>%cmd</code> ipython 魔法命令, 在当前 shell 中执行 cmd 命令, 其作用在后续保留上下文继续有效.</li></ul><p>参考: <a href="https://supergis.gitbooks.io/git_notebook/content/doc/jupyter_magics.html" target="_blank" rel="noopener">IPython 的魔法符号－Magics</a></p>]]></content>
    
    <summary type="html">
    
      
      
        &lt;h2 id=&quot;环境与启动&quot;&gt;&lt;a href=&quot;#环境与启动&quot; class=&quot;headerlink&quot; title=&quot;环境与启动&quot;&gt;&lt;/a&gt;环境与启动&lt;/h2&gt;&lt;p&gt;参见 &lt;a href=&quot;../MachineLearning/人工智能学习%201%20-%20基础工具安装.md&quot;
      
    
    </summary>
    
    
      <category term="计算机" scheme="http://ono.lol/categories/%E8%AE%A1%E7%AE%97%E6%9C%BA/"/>
    
      <category term="Python" scheme="http://ono.lol/categories/%E8%AE%A1%E7%AE%97%E6%9C%BA/Python/"/>
    
    
      <category term="Python" scheme="http://ono.lol/tags/Python/"/>
    
  </entry>
  
  <entry>
    <title>人工智能中英文名词对照</title>
    <link href="http://ono.lol/2023/10/25/ComputerScience/MachineLearning/%E4%B8%AD%E8%8B%B1%E6%96%87%E5%90%8D%E8%AF%8D%E5%AF%B9%E7%85%A7/"/>
    <id>http://ono.lol/2023/10/25/ComputerScience/MachineLearning/%E4%B8%AD%E8%8B%B1%E6%96%87%E5%90%8D%E8%AF%8D%E5%AF%B9%E7%85%A7/</id>
    <published>2023-10-25T09:58:07.000Z</published>
    <updated>2023-11-04T16:03:34.918Z</updated>
    
    <content type="html"><![CDATA[<h2 id="模型分类"><a href="#模型分类" class="headerlink" title="模型分类"></a>模型分类</h2><p>回归 regression<br>分类 classification</p><p>全连接网络 fully connected network <code>FC</code><br>卷积神经网络 convolutional neural network <code>CNN</code></p><h2 id="机器学习基础"><a href="#机器学习基础" class="headerlink" title="机器学习基础"></a>机器学习基础</h2><p>样本 sample<br>模型 model</p><p>输入 inputs<br>输出 outputs</p><p>特征 feature<br>特征图 feature map<br>隐藏层 hidden layer</p><p>参数 parameter: 通过学习可以优化<br>超参数 hyperparameter: 根据经验设置, 一般不在学习过程中优化</p><p>权重 weight <code>W</code><br>偏置 bias <code>b</code></p><p>迭代次数 epoch<br>批量大小 batch size <code>bs</code><br>学习率 learning rate <code>lr</code><br>迭代次数 step</p><p>卷积核 kernel<br>通道 channels<br>过滤器 filter: filter是卷积核的向量, 与输出同维度<br>填白 padding <code>p</code><br>步长 stride <code>s</code><br>池化 pooling</p><p>激活函数 activation function<br>损失函数 loss function <code>L(y&#39;,y)</code><br>代价函数 cost function <code>J(W,b)</code>: 平均损失</p><p>优化 optimize<br>优化器 optimizer<br>线性 linear<br>非线性 non-linear</p><h2 id="数学基础"><a href="#数学基础" class="headerlink" title="数学基础"></a>数学基础</h2><p>梯度 gradient<br>梯度下降 gradient decent<br>导数 derivative<br>偏导数 partial derivative</p>]]></content>
    
    <summary type="html">
    
      
      
        &lt;h2 id=&quot;模型分类&quot;&gt;&lt;a href=&quot;#模型分类&quot; class=&quot;headerlink&quot; title=&quot;模型分类&quot;&gt;&lt;/a&gt;模型分类&lt;/h2&gt;&lt;p&gt;回归 regression&lt;br&gt;分类 classification&lt;/p&gt;
&lt;p&gt;全连接网络 fully connecte
      
    
    </summary>
    
    
      <category term="计算机" scheme="http://ono.lol/categories/%E8%AE%A1%E7%AE%97%E6%9C%BA/"/>
    
      <category term="人工智能" scheme="http://ono.lol/categories/%E8%AE%A1%E7%AE%97%E6%9C%BA/%E4%BA%BA%E5%B7%A5%E6%99%BA%E8%83%BD/"/>
    
    
      <category term="人工智能" scheme="http://ono.lol/tags/%E4%BA%BA%E5%B7%A5%E6%99%BA%E8%83%BD/"/>
    
  </entry>
  
  <entry>
    <title>人工智能学习 11 - PyTorch</title>
    <link href="http://ono.lol/2023/10/21/ComputerScience/MachineLearning/%E4%BA%BA%E5%B7%A5%E6%99%BA%E8%83%BD%E5%AD%A6%E4%B9%A0%2011%20-%20Pytorch/"/>
    <id>http://ono.lol/2023/10/21/ComputerScience/MachineLearning/%E4%BA%BA%E5%B7%A5%E6%99%BA%E8%83%BD%E5%AD%A6%E4%B9%A0%2011%20-%20Pytorch/</id>
    <published>2023-10-21T02:34:20.000Z</published>
    <updated>2023-10-21T13:20:27.834Z</updated>
    
    <content type="html"><![CDATA[<p>安装: <a href="https://pytorch.org/get-started/locally/" target="_blank" rel="noopener">https://pytorch.org/get-started/locally/</a></p><p>选择 <code>系统</code>, <code>安装方法</code>, <code>语言: Python</code>, <code>计算平台</code> 之后就出现对应的安装命令了.</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">import</span> torch</span><br><span class="line"></span><br><span class="line">torch.cuda.is_available()</span><br></pre></td></tr></table></figure><h3 id="基本用法"><a href="#基本用法" class="headerlink" title="基本用法"></a>基本用法</h3><p>数据初始化</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 使用其他数据类型创建</span></span><br><span class="line">torch.tensor(array)</span><br><span class="line">torch.from_numpy(ndarray)</span><br><span class="line"></span><br><span class="line"><span class="comment"># 指定填充</span></span><br><span class="line">torch.ones(size) .ones_like(ts)</span><br><span class="line">torch.zeros(size) .zeros_like(ts)</span><br><span class="line">torch.empty(size) .empty_like(ts)</span><br><span class="line"></span><br><span class="line"><span class="comment"># 随机填充</span></span><br><span class="line">torch.rand(size) .rand_like(ts)</span><br><span class="line">torch.randn(size) .randn_like(ts) <span class="comment"># 符合正态分布随机</span></span><br></pre></td></tr></table></figure><p>数据类型转换</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># tensor 类型数据转换</span></span><br><span class="line">ts.numpy()</span><br><span class="line"></span><br><span class="line"><span class="comment"># tensor item 数据类型转换</span></span><br><span class="line">it.data <span class="comment"># tensor 类型</span></span><br><span class="line">it.data.item() 或 it.item() <span class="comment"># python 类型</span></span><br></pre></td></tr></table></figure><p>tensor 数据属性</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">ts.shape 或 ts.size() <span class="comment"># tensor 形状</span></span><br><span class="line">ts.dtype <span class="comment"># 数据类型</span></span><br><span class="line">ts.device <span class="comment"># 数据存储位置</span></span><br></pre></td></tr></table></figure><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># tensor 形状转换</span></span><br><span class="line">ts.view(<span class="number">4</span>, <span class="number">3</span>) 或 ts.view(<span class="number">-1</span>, <span class="number">3</span>) <span class="comment"># -1 表示自己推算</span></span><br><span class="line">ts.transpose(<span class="number">1</span>, <span class="number">0</span>) 或 ts.T</span><br></pre></td></tr></table></figure><p>将数据存储到 cuda 进行运算</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">print(<span class="string">f"tensor store device <span class="subst">&#123;tensor.device&#125;</span>"</span>)</span><br><span class="line"><span class="keyword">if</span> torch.cuda.is_avaliable():</span><br><span class="line">  tensor = tensor.to(<span class="string">"cuda"</span>)</span><br><span class="line">  print(<span class="string">f"tensor store device <span class="subst">&#123;tensor.device&#125;</span>"</span>)</span><br></pre></td></tr></table></figure><h3 id="基本运算"><a href="#基本运算" class="headerlink" title="基本运算"></a>基本运算</h3><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 以 _ 结尾的函数 表示 inplace</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># + - * / += -= *= /=</span></span><br><span class="line"><span class="comment"># add sub mul matmul div</span></span><br><span class="line">torch.add(a, b)</span><br><span class="line">torch.add(a, b, out=result)</span><br><span class="line">a.add(b)</span><br><span class="line">a.add_(b)</span><br><span class="line"></span><br><span class="line"><span class="comment"># 切片</span></span><br><span class="line">ts[:,<span class="number">1</span>]</span><br><span class="line"></span><br><span class="line"><span class="comment"># 链接</span></span><br><span class="line">ts = torch.cat([ts0,ts1], dim=<span class="number">0</span>)</span><br><span class="line"></span><br><span class="line"><span class="comment"># element-wise product 点乘 (对应位置相乘)</span></span><br><span class="line">ts1 * ts0</span><br><span class="line">ts1.mul(ts0)</span><br><span class="line"></span><br><span class="line"><span class="comment"># matrix multiplication 矩阵乘法</span></span><br><span class="line">ts1 @ ts0</span><br><span class="line">ts1.matmul(ts0.T)</span><br></pre></td></tr></table></figure><p>向量乘法:</p><ul><li>数乘: 标量 × 向量, 标量与向量中每个位置相乘, 结果是向量</li><li>点乘(内积): 对应位置相乘之后求和, 结果是标量</li><li>叉乘(外积,叉积,向量积): 与两个向量组成的平面垂直的向量</li></ul><p>矩阵乘法:</p><ul><li>数乘:</li><li>矩阵乘法: (mv)·(vn)=(mn) 前矩阵每个行 与 后矩阵每个列 对应位置相乘后求和, 得到的和组成的新矩阵</li><li>矩阵点乘(element-wise product, entry-wise product, 哈达玛积 hadamard product): (mn)☉(mn)=(mn) 对应位置相乘</li><li>克罗内克积(kronecker product): 前矩阵的每个元素 与 后矩阵整体 进行数乘, 得到的矩阵拼接成的新矩阵</li></ul><p>参考: <a href="https://www.jianshu.com/p/9165e3264ced" target="_blank" rel="noopener">https://www.jianshu.com/p/9165e3264ced</a></p><h3 id="反向传播-与-自动微分"><a href="#反向传播-与-自动微分" class="headerlink" title="反向传播 与 自动微分"></a>反向传播 与 自动微分</h3><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br></pre></td><td class="code"><pre><span class="line">x = torch.tensor(<span class="number">1.</span>)</span><br><span class="line">w = torch.tensor(<span class="number">2.</span>, requires_grad=<span class="literal">True</span>) <span class="comment"># 声明设置, 该 tensor 可追溯梯度过程</span></span><br><span class="line">w.require_grad_(<span class="literal">True</span>) <span class="comment"># 后期设置</span></span><br><span class="line">b = torch.tensor(<span class="number">3.</span>)</span><br><span class="line"></span><br><span class="line">y = w*x + b</span><br><span class="line"></span><br><span class="line">y.backward() <span class="comment"># 自动反向传播, 计算梯度</span></span><br><span class="line">print(y)</span><br><span class="line">print(y.grad_fn)</span><br><span class="line">print(w.grad) <span class="comment"># 自动保存的梯度</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">with</span> torch.no_grad():</span><br><span class="line">  <span class="comment"># 这里定义的变量的逻辑都不进行跟踪记录, 不保存 grad 梯度</span></span><br><span class="line">  <span class="comment"># 这里使用的外部定义的变量, 仍然记录梯度不受影响</span></span><br></pre></td></tr></table></figure><ol><li>使用 <code>requires_grad=True</code> 将会追踪该 tensor 的所有操作</li><li>完成计算后, 通过 <code>.backward()</code> 自动计算所有 grad 梯度</li><li>自动计算后, 梯度会保存在该变量的 <code>.grad</code> 属性上</li></ol>]]></content>
    
    <summary type="html">
    
      
      
        &lt;p&gt;安装: &lt;a href=&quot;https://pytorch.org/get-started/locally/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://pytorch.org/get-started/locally/&lt;/a&gt;&lt;/p&gt;
&lt;p
      
    
    </summary>
    
    
      <category term="计算机" scheme="http://ono.lol/categories/%E8%AE%A1%E7%AE%97%E6%9C%BA/"/>
    
      <category term="人工智能" scheme="http://ono.lol/categories/%E8%AE%A1%E7%AE%97%E6%9C%BA/%E4%BA%BA%E5%B7%A5%E6%99%BA%E8%83%BD/"/>
    
    
      <category term="人工智能" scheme="http://ono.lol/tags/%E4%BA%BA%E5%B7%A5%E6%99%BA%E8%83%BD/"/>
    
  </entry>
  
  <entry>
    <title>人工智能学习 10 - 神经网络的领域</title>
    <link href="http://ono.lol/2023/10/20/ComputerScience/MachineLearning/%E4%BA%BA%E5%B7%A5%E6%99%BA%E8%83%BD%E5%AD%A6%E4%B9%A0%2010%20-%20%E7%A5%9E%E7%BB%8F%E7%BD%91%E7%BB%9C%E7%9A%84%E9%A2%86%E5%9F%9F/"/>
    <id>http://ono.lol/2023/10/20/ComputerScience/MachineLearning/%E4%BA%BA%E5%B7%A5%E6%99%BA%E8%83%BD%E5%AD%A6%E4%B9%A0%2010%20-%20%E7%A5%9E%E7%BB%8F%E7%BD%91%E7%BB%9C%E7%9A%84%E9%A2%86%E5%9F%9F/</id>
    <published>2023-10-20T08:23:15.000Z</published>
    <updated>2023-10-21T13:19:47.698Z</updated>
    
    <content type="html"><![CDATA[<p>神经网络(基础框架) -&gt; 深度学习(解决特定问题)</p><ol><li>卷积(图像相关, 视觉)</li><li>循环(反复使用, 输入不定长, 时间序列)</li><li>注意力(为输入分配不同权重, 时间序列)</li><li>…</li></ol><h3 id="卷积"><a href="#卷积" class="headerlink" title="卷积"></a>卷积</h3><ul><li>图像分类</li><li>ImageNet 数据集</li><li>目标检测</li><li>图片读取转换文字描述</li><li>图像风格迁移</li><li>…</li></ul><h3 id="什么是视觉"><a href="#什么是视觉" class="headerlink" title="什么是视觉"></a>什么是视觉</h3><p>人, 动物, 计算机 看到的是一样的世界么?</p><p>人: 光 - 视觉系统 - 总结概念<br>计算机: 图片像素矩阵 - 模型 - 模型结果</p><p>图片: 灰度图(单通道), 彩色图(三通道 RGB)</p><h3 id="ANN-实现图片分类"><a href="#ANN-实现图片分类" class="headerlink" title="ANN 实现图片分类"></a>ANN 实现图片分类</h3><p>二维数据展开, 构建全连接网络, 通过 softmax 计算得出多分类问题概率</p><p>缺陷:</p><ol><li>二维信息展开丢失维度信息</li><li>输入层与隐藏层全连接引发维度灾难</li></ol><h3 id="卷积神经网络识别图像"><a href="#卷积神经网络识别图像" class="headerlink" title="卷积神经网络识别图像"></a>卷积神经网络识别图像</h3><ol><li>识别目标逻辑: 特征 - 小特征 - 更小特征…</li><li>要识别的目标 - 子图</li><li>点乘(相同位置相乘, 求和) - 乘积大小, 表示特征与子图一致性大小</li></ol><h3 id="卷积运算"><a href="#卷积运算" class="headerlink" title="卷积运算"></a>卷积运算</h3><p>m 目标图像矩阵(切子图) × n 卷积核(小特征)<br>=(点乘)=&gt;<br>m-n+1 新矩阵(激活值), 步长=1<br>=(激活函数)=&gt;<br>m-n+1 新图像矩阵(特征图)</p><p>一般把图片和特效图统称为 <code>通道</code>. 一般卷积核称为为<code>过滤器</code>. 卷积 即 卷积运算, 即点乘运算.</p><p>卷积核要素:</p><ul><li>卷积核形状 shape</li><li>卷积核值</li><li>每次计算在目标矩阵移动步长 stride</li></ul><h4 id="单通道单卷积核"><a href="#单通道单卷积核" class="headerlink" title="单通道单卷积核"></a>单通道单卷积核</h4><p>1 通道输入 - 1 通道卷积核 - 1 特征图</p><h4 id="多通道单核卷积"><a href="#多通道单核卷积" class="headerlink" title="多通道单核卷积"></a>多通道单核卷积</h4><p>每个通道都有独立的卷积核, 每个通道得到各自特征图后进行融合(求和), 最终得到一个融合特征图.</p><p>n 通道输入 - n 通道卷积核 - n 通道临时特征图 - 1 通道融合特征图</p><h4 id="多通道多核卷积"><a href="#多通道多核卷积" class="headerlink" title="多通道多核卷积"></a>多通道多核卷积</h4><p>n 通道输入 - n×n 通道卷积核 - n×n 通道临时特征图 - n 通道融合特征图</p><h3 id="池化运算"><a href="#池化运算" class="headerlink" title="池化运算"></a>池化运算</h3><p>卷积后得到的 m 特征图 × n 池化运算(算法,步长)<br>=(池化算法,求最大值/平均值)=&gt;<br>m/n 池化矩阵, 步长=池化核 shape<br>=(通常无激活,或者线性激活)=&gt;<br>m/n 矩阵</p><p>池化要素:</p><ul><li>池化核形状 shape</li><li>滑动步长(一般不重叠, 步长=shape)</li><li>池化方式(最大,平均)</li></ul><p>ps: 池化核中没有值, 是一个空框, 算法是计算框中的 max 或 avg.</p><ul><li>最大池化 $a_n = max(z_n)$</li><li>平均池化 $a_n = avg(z_n)$</li><li>带激活函数的池化 $a_n = act(pooling(z_n))$</li></ul><h3 id="卷积的特征"><a href="#卷积的特征" class="headerlink" title="卷积的特征"></a>卷积的特征</h3><p>卷积与池化拥有如下特征</p><h4 id="1-平移不变性"><a href="#1-平移不变性" class="headerlink" title="1. 平移不变性"></a>1. 平移不变性</h4><p>图像平移, 不影响识别位置变化的图像.</p><h4 id="2-稀疏连接与权值共享"><a href="#2-稀疏连接与权值共享" class="headerlink" title="2. 稀疏连接与权值共享"></a>2. 稀疏连接与权值共享</h4><p>全连接神经网络: 输入矩阵 m =&gt; 输出矩阵 n, 链接数 m×n, 参数=连接数 × 2 (w,b)</p><p>卷积神经网络: 输入矩阵 m × 卷积核 n =&gt; 输出激活矩阵(m-n+1), 连接数 n × (m-n+1), 参数=卷积核数 × 2 (w,b)</p><p>稀疏链接: 链接数少; 权值共享: 卷积核参数被多条链接共享.</p><h3 id="卷积核大小"><a href="#卷积核大小" class="headerlink" title="卷积核大小"></a>卷积核大小</h3><p><strong>卷积核大小与运算量的关系:</strong></p><p>运算量 = 卷积核大小 $n^2$ × 特征图大小 $(m-n+1)^2$ ≈ 在 $m=n$ 时 达到最大</p><p><strong>卷积层数叠加产生的效果:</strong></p><p>例如 $5×5 =(3×3)=&gt; 3×3 =(3×3)&gt; 1×1$, 说明第二次叠加后 $3×3$ 的卷积核再原图上作用的大小因为层数叠加而放大了.</p><p>卷积核大小的选择, 一般使用较小的卷积核, 叠加更多层数, 靠前的网络卷积核大小略大于后面层数的卷积核大小.</p><h3 id="卷积的图像填充"><a href="#卷积的图像填充" class="headerlink" title="卷积的图像填充"></a>卷积的图像填充</h3><p>为了避免经过多层网络运算后, 特征图逐渐变小, 需要在运算前对图像进行填充. 而且在进行填充后, 也可以更好的利用边界值信息参与运算.</p><p>一般情况, 填充内容为 0 或者与边界值相同.</p><p>填充 p(padding), 步长 s(stride), 图像大小 i(input), 特征图大小 o(output), 卷积核大小 n</p><p>o -&gt; i, p, n, s</p><p>例如 1: 4×4 =(3×3)=&gt; 2×2, 这时为了保证输出与输入大小不变, 将原输入图扩充卷积核步长 1 得到新输入 6×6 (4×4 周围扩大一圈 1×1 得到 6×6), 4×4 =(1×1 扩充)=&gt; 6×6 =(3×3)=&gt; 4×4.</p><p>例如 2: 4×4 =(5×5)=&gt; 1×1, 这时为了得到原图大小, 需要填充 2 得到 8×8 的输入.</p><p>o=math.ceil((i+2p-n)/s)+1</p><h3 id="卷积流程"><a href="#卷积流程" class="headerlink" title="卷积流程"></a>卷积流程</h3><ol start="0"><li>选择模型, 选择卷积核大小, 选择池化核大小</li><li>扩充输入</li><li>卷积计算</li><li>池化计算</li><li>反向传输优化参数</li></ol><h3 id="卷积发展历史"><a href="#卷积发展历史" class="headerlink" title="卷积发展历史"></a>卷积发展历史</h3><p>LeCun - LeNet(MNIST) - AlexNet(ImageNet) -</p><ul><li>VGG 16 - VGG 19 - ResNet</li><li>NIN - GoogleNet - Incption V3/V4 - ResNet</li><li>RCNN - Fast RCNN - SSD</li><li>FCN - StNet - CNN + RM/LSTM</li></ul><h4 id="LeNet-手写数字识别-MNIST"><a href="#LeNet-手写数字识别-MNIST" class="headerlink" title="LeNet 手写数字识别(MNIST)"></a>LeNet 手写数字识别(MNIST)</h4><p>题目, 摘要, 网络结构图</p><ul><li>input: 要处理的图片 <code>32×32</code></li><li>convolutions: <code>C</code>, 卷积</li><li>feature maps: <code>F</code> 或 <code>f.maps</code>, 特征图 <code>6@5×5</code></li><li>subsampling: <code>S</code>, 向下采样 (pooling 池化过程)</li><li>full connection: 或 dense, <code>F</code>, <code>FC</code> 全连接</li><li>layer: 层</li><li>output: 输出的结果</li></ul><p><img src="./%E4%BA%BA%E5%B7%A5%E6%99%BA%E8%83%BD%E5%AD%A6%E4%B9%A0%2011%20-%20%E7%A5%9E%E7%BB%8F%E7%BD%91%E7%BB%9C%E7%9A%84%E9%A2%86%E5%9F%9F/LeNet.jpeg" alt="LeNet"></p><h4 id="AlexNet-ImageNet"><a href="#AlexNet-ImageNet" class="headerlink" title="AlexNet (ImageNet)"></a>AlexNet (ImageNet)</h4><ul><li>使用 ReLu 激活函数</li><li>使用 dropout 技术缓解过拟合: 随机关闭一些神经元不参与运算</li><li>重叠最大池化: 不使用池化核大小作为步长</li></ul><h4 id="VGG"><a href="#VGG" class="headerlink" title="VGG"></a>VGG</h4><p>基于 AlexNet 做出的调整, 更灵活适应不同任务</p><p><img src="./%E4%BA%BA%E5%B7%A5%E6%99%BA%E8%83%BD%E5%AD%A6%E4%B9%A0%2011%20-%20%E7%A5%9E%E7%BB%8F%E7%BD%91%E7%BB%9C%E7%9A%84%E9%A2%86%E5%9F%9F/vgg.png" alt="VGG"></p>]]></content>
    
    <summary type="html">
    
      
      
        &lt;p&gt;神经网络(基础框架) -&amp;gt; 深度学习(解决特定问题)&lt;/p&gt;
&lt;ol&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;/ol
      
    
    </summary>
    
    
      <category term="计算机" scheme="http://ono.lol/categories/%E8%AE%A1%E7%AE%97%E6%9C%BA/"/>
    
      <category term="人工智能" scheme="http://ono.lol/categories/%E8%AE%A1%E7%AE%97%E6%9C%BA/%E4%BA%BA%E5%B7%A5%E6%99%BA%E8%83%BD/"/>
    
    
      <category term="人工智能" scheme="http://ono.lol/tags/%E4%BA%BA%E5%B7%A5%E6%99%BA%E8%83%BD/"/>
    
  </entry>
  
  <entry>
    <title>人工智能学习 9 - Pandas</title>
    <link href="http://ono.lol/2023/10/19/ComputerScience/MachineLearning/%E4%BA%BA%E5%B7%A5%E6%99%BA%E8%83%BD%E5%AD%A6%E4%B9%A0%209%20-%20Pandas/"/>
    <id>http://ono.lol/2023/10/19/ComputerScience/MachineLearning/%E4%BA%BA%E5%B7%A5%E6%99%BA%E8%83%BD%E5%AD%A6%E4%B9%A0%209%20-%20Pandas/</id>
    <published>2023-10-18T18:41:34.000Z</published>
    <updated>2023-10-18T18:51:25.868Z</updated>
    
    <content type="html"><![CDATA[<h2 id="Pandas-基础"><a href="#Pandas-基础" class="headerlink" title="Pandas 基础"></a>Pandas 基础</h2><p>参考: <a href="https://www.pypandas.cn/" target="_blank" rel="noopener">https://www.pypandas.cn/</a> 或 <a href="https://pandas.pydata.org/" target="_blank" rel="noopener">pandas docs</a></p><p>numpy 主要做计算, pandas 主要做数据清理和分析.</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">import</span> pandas <span class="keyword">as</span> pd</span><br><span class="line"></span><br><span class="line">dt = pd.read_csv(<span class="string">"./path/filename.csv"</span>, encoding=<span class="string">"UTF8"</span>)</span><br><span class="line"><span class="comment"># 中文编码: GB2312简体中文, GBK国标, BIG5繁体中文, UTF8默认</span></span><br></pre></td></tr></table></figure><h3 id="Series"><a href="#Series" class="headerlink" title="Series"></a>Series</h3><p>类似 ndarray 只有一列数据, 但是 series 每个数据都有一个 index 标签, 默认是 0 开始序数.</p><p>每个元素底层类型是 numpy.int64</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br></pre></td><td class="code"><pre><span class="line">dt = pd.Series([<span class="number">1</span>,<span class="number">2</span>,<span class="number">3</span>])</span><br><span class="line">dt[<span class="number">0</span>:<span class="number">1</span>] <span class="comment"># 不包含 1 位置</span></span><br><span class="line"></span><br><span class="line">dt = pd.Series([<span class="number">1</span>,<span class="number">2</span>,<span class="number">3</span>], index=[<span class="string">"A"</span>,<span class="string">"B"</span>,<span class="string">"C"</span>])</span><br><span class="line">dt[<span class="string">"A"</span>:<span class="string">"B"</span>] <span class="comment"># 包含 "B" 位置</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 当 series 中只有 int 时, int 数字类型为 numpy.int64</span></span><br><span class="line"><span class="comment"># 当 series 中有 int 和 float 时, int 数字转换为 numpy.float64</span></span><br><span class="line"><span class="comment"># 当 series 中有 str 等其他类型时, int 数字转换为普通 python 类型 int</span></span><br><span class="line">type(dt[<span class="string">"A"</span>])</span><br><span class="line"></span><br><span class="line"><span class="comment"># 以 index 对其后进行计算</span></span><br><span class="line">dt + dt</span><br><span class="line">dt[<span class="number">1</span>:] + dt[:<span class="number">-2</span>]</span><br><span class="line"></span><br><span class="line"><span class="comment"># 常用统计计算</span></span><br><span class="line">dt.mean()/min()/max()...</span><br></pre></td></tr></table></figure><h3 id="DataFrame"><a href="#DataFrame" class="headerlink" title="DataFrame"></a>DataFrame</h3><p>DataFrame 是多个 Series 组成的表</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 使用 array 创建</span></span><br><span class="line">df = pd.DataFrame([[<span class="number">1</span>,<span class="number">2</span>],[<span class="number">3</span>,<span class="number">4</span>]], index=[<span class="string">"a"</span>,<span class="string">"b"</span>], column=[<span class="string">"c"</span>,<span class="string">"d"</span>])</span><br><span class="line"></span><br><span class="line"><span class="comment"># 使用 dict 创建</span></span><br><span class="line">df = pd.DataFrame(&#123;</span><br><span class="line">    <span class="string">"Name"</span>: [<span class="string">"Alice"</span>,<span class="string">"Bob"</span>,<span class="string">"Charlie"</span>,<span class="string">"David"</span>],</span><br><span class="line">    <span class="string">"Age"</span>: [<span class="number">22</span>,<span class="number">31</span>,<span class="number">19</span>,<span class="number">21</span>],</span><br><span class="line">    <span class="string">"City"</span>: [<span class="string">"Beijing"</span>,<span class="string">"Tianjin"</span>,<span class="string">"Tokyo"</span>,<span class="string">"New York"</span>],</span><br><span class="line">&#125;)</span><br><span class="line">df.set_index(<span class="string">"Name"</span>)</span><br><span class="line"></span><br><span class="line"><span class="comment"># 添加/删除列</span></span><br><span class="line">df[<span class="string">"Gender"</span>] = [<span class="string">"Woman"</span>, <span class="string">"Man"</span>, <span class="string">"Woman"</span>, <span class="string">"Man"</span>]</span><br><span class="line"><span class="keyword">del</span> df[<span class="string">"Age"</span>]</span><br><span class="line"></span><br><span class="line"><span class="comment"># 获取列</span></span><br><span class="line">df[<span class="string">"Gender"</span>] 或 df.index</span><br><span class="line"><span class="comment"># 数字id 获取行</span></span><br><span class="line">df.iloc[<span class="number">0</span>] 或 df.iloc[<span class="number">1</span>:<span class="number">2</span>]</span><br><span class="line"><span class="comment"># 索引 获取行</span></span><br><span class="line">df.loc[<span class="string">"ID"</span>] 或 df.loc[<span class="string">"ID1"</span>:<span class="string">"ID2"</span>]</span><br><span class="line"><span class="comment"># 条件过滤</span></span><br><span class="line">df[df[<span class="string">"Gender"</span>] == <span class="string">"Man"</span>]</span><br><span class="line"><span class="comment"># 获取单元格</span></span><br><span class="line">df.at[x, y]</span><br><span class="line"></span><br><span class="line"><span class="comment"># 行列转置</span></span><br><span class="line">df.T</span><br></pre></td></tr></table></figure><h3 id="文件读取"><a href="#文件读取" class="headerlink" title="文件读取"></a>文件读取</h3><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># csv json excel xml html hdfs ...</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 读取</span></span><br><span class="line">df = pd.read_*(file, delimiter = <span class="string">"\t"</span>, index_col=<span class="string">"datetime"</span>)</span><br><span class="line"><span class="comment"># 写入</span></span><br><span class="line">df.to_*(file, index=<span class="literal">False</span>)</span><br></pre></td></tr></table></figure><h3 id="查看数据基本信息"><a href="#查看数据基本信息" class="headerlink" title="查看数据基本信息"></a>查看数据基本信息</h3><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br></pre></td><td class="code"><pre><span class="line">df.head(n=<span class="number">5</span>)</span><br><span class="line">df.tail(n=<span class="number">5</span>)</span><br><span class="line"></span><br><span class="line"><span class="comment"># 数据条数, 索引范围</span></span><br><span class="line"><span class="comment"># 列名称, null 数量, 列数据类型; 数据类型统计</span></span><br><span class="line"><span class="comment"># 占用内存大小</span></span><br><span class="line">df.info()</span><br><span class="line"><span class="comment"># 列数据统计信息(条数, 平均值, std, min, 百分位数, max)</span></span><br><span class="line">df.describe()</span><br><span class="line"></span><br><span class="line"><span class="comment"># 行,列,列数据类型</span></span><br><span class="line">df.index</span><br><span class="line">df.columns</span><br><span class="line">df.dtypes</span><br></pre></td></tr></table></figure><h3 id="处理缺失值"><a href="#处理缺失值" class="headerlink" title="处理缺失值"></a>处理缺失值</h3><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 是否是缺失值</span></span><br><span class="line">df.isnull()</span><br><span class="line">pd.isnull(df)</span><br><span class="line"><span class="comment"># 统计缺失数量</span></span><br><span class="line">df.isnull().sum()</span><br><span class="line"></span><br><span class="line"><span class="comment"># 去掉缺失值</span></span><br><span class="line">df.dropna(inplace=<span class="literal">True</span>)</span><br><span class="line"><span class="comment"># 去掉某一列</span></span><br><span class="line">df.drop(<span class="string">"column"</span>, axis=<span class="number">1</span>, inplace=<span class="literal">True</span>)</span><br><span class="line"></span><br><span class="line"><span class="comment"># 填充缺失值</span></span><br><span class="line">vmean = df[<span class="string">"column"</span>].mean()</span><br><span class="line">df[<span class="string">"column"</span>].fillna(vmean, inplace=<span class="literal">True</span>)</span><br></pre></td></tr></table></figure><h3 id="分组统计"><a href="#分组统计" class="headerlink" title="分组统计"></a>分组统计</h3><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 统计操作</span></span><br><span class="line"><span class="comment"># mean, sum, count, max, min, head, tail</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 分组</span></span><br><span class="line">df.groupby(<span class="string">"c1"</span>)[<span class="string">"c2"</span>].mean()</span><br><span class="line">df[[<span class="string">"c1"</span>,<span class="string">"c2"</span>]].groupby(<span class="string">"c1"</span>).mean()</span><br><span class="line"></span><br><span class="line"><span class="comment"># 多级分组</span></span><br><span class="line">df.groupby([<span class="string">"c1"</span>,<span class="string">"c2"</span>]).mean()</span><br><span class="line"></span><br><span class="line"><span class="comment"># 自定义函数</span></span><br><span class="line"><span class="function"><span class="keyword">def</span> <span class="title">func</span><span class="params">(group)</span>:</span></span><br><span class="line">  <span class="comment"># 数据条数 group.shape[0]</span></span><br><span class="line">  <span class="keyword">pass</span></span><br><span class="line"></span><br><span class="line">df.groupby().apply(func)</span><br></pre></td></tr></table></figure><h3 id="图形化"><a href="#图形化" class="headerlink" title="图形化"></a>图形化</h3><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 折线图</span></span><br><span class="line">df[<span class="string">"column"</span>].plot()</span><br><span class="line"><span class="comment"># 散点图</span></span><br><span class="line">df.plot.scatter(x=<span class="string">"c1"</span>, y=<span class="string">"c2"</span>)</span><br><span class="line"><span class="comment"># 多列一起绘制</span></span><br><span class="line">df[[<span class="string">"c1"</span>,<span class="string">"c2"</span>]].plot.area(figsize=(<span class="number">120</span>,<span class="number">4</span>), subplots=<span class="literal">True</span>)</span><br></pre></td></tr></table></figure><p>存储图片</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">from</span> PIL <span class="keyword">import</span> Image</span><br><span class="line"></span><br><span class="line">bg_color = (<span class="number">255</span>,<span class="number">255</span>,<span class="number">255</span>)</span><br><span class="line">img = Image.new(<span class="string">"RGB"</span>, (width, height), bg_color)</span><br><span class="line"><span class="comment"># see: https://blog.csdn.net/zhouzhiyao960211/article/details/90384524</span></span><br><span class="line">img = Image.fromarray(img.astype(<span class="string">"uint8"</span>)).convert(<span class="string">"RGB"</span>)</span><br><span class="line"><span class="comment"># see: https://blog.csdn.net/qq_30159015/article/details/80070514</span></span><br><span class="line"></span><br><span class="line">img.show()</span><br><span class="line">img.save(<span class="string">"./img.jpg"</span>)</span><br></pre></td></tr></table></figure><h3 id="重塑"><a href="#重塑" class="headerlink" title="重塑"></a>重塑</h3><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># index 不变, c1 中的值做列, 展示 c2 数据</span></span><br><span class="line">df.pivot(columns=<span class="string">"c1"</span>, values=<span class="string">"c2"</span>)</span><br><span class="line"></span><br><span class="line"><span class="comment"># 以 c1 为行, c2 为列, 使用 aggfunc 统计 c3 数据</span></span><br><span class="line">df.pivot_table(index=<span class="string">"c1"</span>, columns=<span class="string">"c2"</span>, values=<span class="string">"c3"</span>, aggfunc=<span class="string">"mean"</span>)</span><br><span class="line">df.groupby([<span class="string">"c1"</span>, <span class="string">"c2"</span>])[<span class="string">"c3"</span>].mean()</span><br></pre></td></tr></table></figure><h3 id="数据处理"><a href="#数据处理" class="headerlink" title="数据处理"></a>数据处理</h3><p>排序</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">df.sort_values(by = <span class="string">"c"</span>, ascending=<span class="literal">True</span>)</span><br></pre></td></tr></table></figure><p>替换</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">df[<span class="string">"nc"</span>] = df[<span class="string">"c"</span>].replace(<span class="string">"regexp"</span>, <span class="string">""</span>, regex=<span class="literal">True</span>)</span><br></pre></td></tr></table></figure><p>数据类型转换</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">df[<span class="string">"nc"</span>] = pd.to_numeric(df[<span class="string">"c"</span>])</span><br></pre></td></tr></table></figure><p>拼接</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># axis=0 上下拼, axis=1 左右拼</span></span><br><span class="line">pd.concat([df1, df2], axis=<span class="number">0</span>)</span><br></pre></td></tr></table></figure><h3 id="时间序列"><a href="#时间序列" class="headerlink" title="时间序列"></a>时间序列</h3><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 重命名 column 字段</span></span><br><span class="line">df.rename(columns=&#123;<span class="string">"old"</span>: <span class="string">"new"</span>&#125;, inplace=<span class="literal">True</span>)</span><br><span class="line">df = df.rename(columns=&#123;<span class="string">"old"</span>: <span class="string">"new"</span>&#125;, inplace=<span class="literal">False</span>)</span><br><span class="line"></span><br><span class="line"><span class="comment"># 时间字符串转时间对象</span></span><br><span class="line">df[<span class="string">"datetime"</span>] = pd.to_datetime(df[<span class="string">"datetime"</span>])</span><br><span class="line"></span><br><span class="line"><span class="comment"># 日期对象的计算</span></span><br><span class="line">tm.min()</span><br><span class="line">tm.max()</span><br><span class="line">tm.max() - tm.min()</span><br><span class="line"></span><br><span class="line"><span class="comment"># 日期对象的属性</span></span><br><span class="line">tm.dt.date <span class="string">"YYYY-mm-dd"</span></span><br><span class="line">tm.dt.year</span><br><span class="line">tm.dt.month</span><br><span class="line">tm.dt.day</span><br><span class="line">tm.dt.weekday</span><br><span class="line">tm.dt.hour</span><br><span class="line">tm.dt.minute</span><br><span class="line">tm.dt.second</span><br></pre></td></tr></table></figure>]]></content>
    
    <summary type="html">
    
      
      
        &lt;h2 id=&quot;Pandas-基础&quot;&gt;&lt;a href=&quot;#Pandas-基础&quot; class=&quot;headerlink&quot; title=&quot;Pandas 基础&quot;&gt;&lt;/a&gt;Pandas 基础&lt;/h2&gt;&lt;p&gt;参考: &lt;a href=&quot;https://www.pypandas.cn/&quot; tar
      
    
    </summary>
    
    
      <category term="计算机" scheme="http://ono.lol/categories/%E8%AE%A1%E7%AE%97%E6%9C%BA/"/>
    
      <category term="人工智能" scheme="http://ono.lol/categories/%E8%AE%A1%E7%AE%97%E6%9C%BA/%E4%BA%BA%E5%B7%A5%E6%99%BA%E8%83%BD/"/>
    
    
      <category term="人工智能" scheme="http://ono.lol/tags/%E4%BA%BA%E5%B7%A5%E6%99%BA%E8%83%BD/"/>
    
  </entry>
  
  <entry>
    <title>人工智能学习 8 - Numpy</title>
    <link href="http://ono.lol/2023/10/17/ComputerScience/MachineLearning/%E4%BA%BA%E5%B7%A5%E6%99%BA%E8%83%BD%E5%AD%A6%E4%B9%A0%208%20-%20Numpy/"/>
    <id>http://ono.lol/2023/10/17/ComputerScience/MachineLearning/%E4%BA%BA%E5%B7%A5%E6%99%BA%E8%83%BD%E5%AD%A6%E4%B9%A0%208%20-%20Numpy/</id>
    <published>2023-10-16T17:51:19.000Z</published>
    <updated>2023-10-17T09:31:18.965Z</updated>
    
    <content type="html"><![CDATA[<h2 id="Numpy-基础"><a href="#Numpy-基础" class="headerlink" title="Numpy 基础"></a>Numpy 基础</h2><p>参考: <a href="https://www.numpy.org.cn/" target="_blank" rel="noopener">https://www.numpy.org.cn/</a> 或 <a href="https://numpy.org/doc/stable/reference/index.html" target="_blank" rel="noopener">numpy docs</a></p><p>numpy 是一个 C 实现的计算库, 开源且性能优异, 是众多科学库的依赖</p><p>ndarray 向量/线性方程组运算</p><ul><li>数组点积 dot (对应元素相乘)</li><li>向量点积 vdot</li><li>数组内积 inner</li><li>数组矩阵积 matmul</li><li>数组行列式 determinant</li><li>求解线性矩阵方程 solve</li><li>计算逆矩阵 inv</li></ul><p>ndarray 底层是 C 实现, 所以要求数据类型一致</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">import</span> numpy ad np</span><br><span class="line"></span><br><span class="line">arr = np.array([])</span><br></pre></td></tr></table></figure><p>查看函数的使用方法, 鼠标在括号内, Mac 按 Command, Win 按 Alt 查看帮助.</p><h3 id="ndarray-的属性"><a href="#ndarray-的属性" class="headerlink" title="ndarray 的属性"></a>ndarray 的属性</h3><ul><li>shape 形状</li><li>ndim 维度</li><li>dtype 数据类型</li><li>itemsize 数据大小(dtype 数据类型占空间字节数)</li><li>size 数组长度(多少个数)</li></ul><h3 id="创建-ndarray-并填充初始值"><a href="#创建-ndarray-并填充初始值" class="headerlink" title="创建 ndarray 并填充初始值"></a>创建 ndarray 并填充初始值</h3><ul><li><code>np.zeros(shape)</code> 使用 0 填充</li><li><code>np.ones(shape)</code> 使用 1 填充</li><li><code>np.empty(shape)</code> 创建但是不赋初始值</li><li><code>np.full(shape, value)</code> 使用自定义填充</li><li><code>np.arange(count).reshape(shape)</code> 创建一个指定数量的一维数组, 重新改写形状</li></ul><p>类似的有 <code>ones_like()</code>, <code>empty_like()</code>, <code>zeros_like()</code>, <code>full_like()</code> 使用 ndarray 替代 shape 参数</p><ul><li><code>np.random.randint(low, high, size)</code> 随机整数范围 [low, high)</li><li><code>np.random.random(size)</code> 随机浮点数 [0,1)</li></ul><h3 id="基本用法"><a href="#基本用法" class="headerlink" title="基本用法"></a>基本用法</h3><p>索引(逗号)与切片(冒号)</p><ul><li>v = np.arange(start, end, step)</li><li>v[x,y], v[start:end:step]</li></ul><p><code>[:]</code> 指的是该维度上的所有, <code>[...]</code> 表示所有其他维度</p><h3 id="数组做-nd-的下标"><a href="#数组做-nd-的下标" class="headerlink" title="数组做 nd 的下标"></a>数组做 nd 的下标</h3><p>使用一维或多维数组做 nd 的下标, 相当于将 nd 的值放到数组的对应位置</p><ul><li><code>a[[1,2,5]]</code> 取 a 中 id 为 1,2,5 的元素组成新 nd,</li><li><code>a[[1,2,5]] = [1,1,1]</code> 可以赋值给 nd array</li><li><code>a[[1,2,5]] += 1</code> 可以对 nd array 运算</li></ul><p>在一维数组 a 中取值 a[x], 在多维数组 b 中取值 b[x, y] 其中 x,y 都是目标形状的数组</p><ul><li>a 的 x 可以是一维也可以多维, 就是把 a 对应位置的值填到数组中</li></ul><h3 id="布尔数组-做-nd-的下标"><a href="#布尔数组-做-nd-的下标" class="headerlink" title="布尔数组 做 nd 的下标"></a>布尔数组 做 nd 的下标</h3><p>值为 True/False 的数组</p><p><code>b = a &gt; 0</code> 所有为真的位置为 True<br><code>a[a&lt;0] = 0</code> 将所有 &lt; 0 的标记为 True, 又将下标 True 的值置位 0</p><h3 id="切片的区别"><a href="#切片的区别" class="headerlink" title="切片的区别"></a>切片的区别</h3><p>list <code>[:]</code> 切片创建指针数据副本(还指向源数据,修改时指向新数据)<br>nd <code>[:]</code> 切片指向原内存修改原数据改变, nd <code>[id]</code> 索引创建数据副本修改原数据不变</p><h3 id="广播"><a href="#广播" class="headerlink" title="广播"></a>广播</h3><p>维度不同, 后缘维度轴长相同: (x,y) vs. (y,z)</p><p>维度相同, 其中有一个轴为 1: (x,y,1,v) vs. (x,1,u,v)</p><ul><li><code>np.broadcast_to(dt, shape)</code> 根据条件配置进行广播</li><li><code>np.expand_dims(dt, axis)</code> 在指定轴上拓展一个长度为 1 的维度</li><li><code>np.squeeze(dt)</code> 删除长度为 1 的轴, 降维</li></ul><h3 id="矩阵的变换"><a href="#矩阵的变换" class="headerlink" title="矩阵的变换"></a>矩阵的变换</h3><ul><li>转置(行变列) <code>dt.T</code> 或 <code>np.transpose(dt, axes)</code>, 默认是将 shape 反过来</li><li>翻转(基于轴镜像) <code>np.flip(dt, axis)</code></li><li>交换(两个轴交换) <code>np.swapaxes(dt, src, tar)</code></li><li>滚动(轴滚动到轴前) <code>np.rollaxis(dt, id, before)</code></li></ul><h3 id="拼接与分割"><a href="#拼接与分割" class="headerlink" title="拼接与分割"></a>拼接与分割</h3><p>拼接</p><ul><li><code>np.concatenate((a,b), axis)</code> 指定方向维度拼接</li><li><code>np.hstake((a,b))</code> 或 <code>np.r_[a,b]</code> horizon, row 拼接</li><li><code>np.vstake((a,b))</code> 或 <code>np.c_[a,b]</code> vertical, column 拼接</li></ul><p>分割</p><ul><li><code>np.split(a, count)</code> 平均切成几段</li><li><code>np.split(a, [id, id...])</code> 在指定位置切分成几段</li><li><code>np.hsplit(a, count)</code> row 分割</li><li><code>np.vsplit(a, count)</code> column 分割</li></ul><h3 id="检索元素"><a href="#检索元素" class="headerlink" title="检索元素"></a>检索元素</h3><ul><li><code>np.argmax(a)</code> 最大值所在位置</li><li><code>np.argmin(a)</code> 最小值所在位置</li><li><code>np.where(cond)</code> 符合条件的元素 id 列表</li><li><code>np.where(cond, True 填充默认原值, False 填充默认 0)</code></li><li><code>a[np.where(cond)]</code> 基于条件选择下标</li></ul><h3 id="IO-操作"><a href="#IO-操作" class="headerlink" title="IO 操作"></a>IO 操作</h3><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line">dt = np.array()</span><br><span class="line"></span><br><span class="line"><span class="comment"># save txt data</span></span><br><span class="line">np.savetxt(<span class="string">"./path/filename.txt"</span>, dt)</span><br><span class="line">dt = np.loadtxt(<span class="string">"./path/filename.txt"</span>, skiprows=<span class="number">1</span>) </span><br><span class="line"></span><br><span class="line"><span class="comment"># save binary data</span></span><br><span class="line">np.save(<span class="string">"./path/filename.npy"</span>, dt)</span><br><span class="line">dt = np.load(<span class="string">"./path/filename.npy"</span>)</span><br></pre></td></tr></table></figure>]]></content>
    
    <summary type="html">
    
      
      
        &lt;h2 id=&quot;Numpy-基础&quot;&gt;&lt;a href=&quot;#Numpy-基础&quot; class=&quot;headerlink&quot; title=&quot;Numpy 基础&quot;&gt;&lt;/a&gt;Numpy 基础&lt;/h2&gt;&lt;p&gt;参考: &lt;a href=&quot;https://www.numpy.org.cn/&quot; target
      
    
    </summary>
    
    
      <category term="计算机" scheme="http://ono.lol/categories/%E8%AE%A1%E7%AE%97%E6%9C%BA/"/>
    
      <category term="人工智能" scheme="http://ono.lol/categories/%E8%AE%A1%E7%AE%97%E6%9C%BA/%E4%BA%BA%E5%B7%A5%E6%99%BA%E8%83%BD/"/>
    
    
      <category term="人工智能" scheme="http://ono.lol/tags/%E4%BA%BA%E5%B7%A5%E6%99%BA%E8%83%BD/"/>
    
  </entry>
  
  <entry>
    <title>流动性做市 4 - 用户行为风险</title>
    <link href="http://ono.lol/2023/10/12/Quant/%E6%B5%81%E5%8A%A8%E6%80%A7%E5%81%9A%E5%B8%82%204%20-%20%E7%94%A8%E6%88%B7%E8%A1%8C%E4%B8%BA%E9%A3%8E%E9%99%A9/"/>
    <id>http://ono.lol/2023/10/12/Quant/%E6%B5%81%E5%8A%A8%E6%80%A7%E5%81%9A%E5%B8%82%204%20-%20%E7%94%A8%E6%88%B7%E8%A1%8C%E4%B8%BA%E9%A3%8E%E9%99%A9/</id>
    <published>2023-10-11T17:17:10.000Z</published>
    <updated>2023-10-12T16:14:30.969Z</updated>
    
    <content type="html"><![CDATA[<p>用户行为风险系统主要包括: <code>配置</code> 指的是配置一些风控维度进行数据监控统计, <code>查询</code> 指的是基于配置查询用户触发记录, 和 <code>处理开关</code> 在配置和查询之后对有风险的用户进行一定的开关操作.</p><ol><li>风控配置与数据查询:<ol><li>平台风控配置</li><li>用户风控记录查询(盈亏,出入金,异常行为)</li><li>平台风控数据查询(资产对账)</li></ol></li><li>风控处理开关:<ol><li>交易所整体开关(系统降级):<ol><li>整站维护, 注册功能, 资产划转(出金)</li><li>登录功能, 查看(资产/仓位/挂单), 交易(开仓,平仓,追加/减少保证金,调节杠杆率), 资产划转(提币,提币限额,多系统划转,C2C), KYC 认证</li></ol></li><li>用户维度开关:<ol><li>禁止 IP/设备号 注册/登录/参与活动</li><li>登录功能, 查看(资产/仓位/挂单), 交易(开仓,平仓,追加/减少保证金,调节杠杆率), 资产划转(提币,提币限额,多系统划转,C2C), KYC 认证</li></ol></li><li>交易风险开关: 对冲</li></ol></li></ol><p>下面详细列举一下各个风控模块的具体内容</p><h2 id="一-风控配置与数据查询"><a href="#一-风控配置与数据查询" class="headerlink" title="一. 风控配置与数据查询"></a>一. 风控配置与数据查询</h2><h3 id="平台风控配置"><a href="#平台风控配置" class="headerlink" title="平台风控配置"></a>平台风控配置</h3><ul><li>风控因子(系统开发时程序支持对应维度数据)</li><li>风控逻辑(and or)</li><li>风控条件(风控因子 + - × ÷ &gt; &lt; 多少数值)</li></ul><ol><li><p>风控因子</p><ul><li>充提<ul><li>大额: 24h 大额, 总量大额, 单笔大额</li><li>高频: 24h 多次, 总次数多</li><li>同一链地址 充提不同 UID (充可能有其他交易所出钱包问题误判要加白名单)</li><li>防洗币: 充提间隔短, 充提数量相同, 已知的链上的黑客地址/菠菜地址黑名单充币</li></ul></li><li>登注<ul><li>防刷: 活动, 返佣, 体验金, 赠金 - 存在同设备, 同 IP 地址问题</li><li>交互: 同 IP 多账号, 多 IP 同账号 短时间切换交互</li><li>KYC: 同 IP 地址, 同设备号, 身份证同村, 审核失败次数</li></ul></li><li>交易<ul><li>持仓: 仓位数量, 持仓时间, 浮盈金额</li><li>频率: 非 API 情况 - 多次开仓间隔时间, 开平仓间隔时间, 挂撤单频率</li><li>开仓: 数量, 手续费, 价格</li><li>平仓: 单笔收益, 单笔收益率</li><li>穿仓: 数量, 差价(指数价&amp;成交价)</li><li>盈利: 阶段盈利(1d, 3d, 7d), 收益曲线平滑</li></ul></li><li>代理<ul><li>同设备多账号, 同 IP 多账号</li><li>资金账号重叠: 内部划转账号, 链上充值来源地址重叠(追查 3 层以上账号), 链上提币收款地址重叠(追查 3 层以上账号)</li><li>对敲</li><li>刷单</li></ul></li></ul></li><li><p>风控配置修改记录</p><ol><li>新增 风控条件, 不需要走审批</li><li>编辑,删除 风控条件, 需要提示当前哪些配置在使用, 提示确定后, 走审批流程</li><li>新增,编辑,删除 风控配置, 走审批流程</li></ol></li></ol><h3 id="用户风控记录查询"><a href="#用户风控记录查询" class="headerlink" title="用户风控记录查询"></a>用户风控记录查询</h3><p>风控记录信息: 时间, 风控名称, 触发条件, 用户 ID, 触发邮箱/手机号, 风控等级, 风控处理</p><ol><li>风控记录流水: 风控记录信息分页</li><li>被风控账号列表: 可以基于时间段, 风控名称过滤, 风控处理过滤, 展示风控记录信息</li><li>账号风控问题查询: 输入用户 ID 或 IDs, 邮箱, 手机号条件查询, 或者在风控记录点击某个用户信息查询</li><li>风控处置(批量):</li><li>风控处置记录流水: 风控记录信息, 解风控人, 解封原因</li></ol><h3 id="平台风控数据查询"><a href="#平台风控数据查询" class="headerlink" title="平台风控数据查询"></a>平台风控数据查询</h3><ol><li>资产对账: 钱包资产 vs. 交易所资产: 总量, 增量</li><li>做市资产: 内部资产+外部资产+仓位盈亏 vs. 财务借款: 市场盈亏, 总盈亏</li><li>新增(注册), 日活(登录), 留存(登录就算), 新增用户充值人数/金额, 总充/提次数/金额</li><li>真实交易用户数, 交易额, 订单数, 手续费</li><li>钱包资产: 冷, 温, 热 曲线</li><li>代理下线总人数, 新增注册, 交易额, 交易人数, 交易次数, 手续费(日,周,月) 曲线 =&gt; 代理考核</li></ol><h2 id="二-风控处理开关"><a href="#二-风控处理开关" class="headerlink" title="二. 风控处理开关"></a>二. 风控处理开关</h2><p>前面介绍了不同类型的风险因子, 根据不同风险条件的组合, 可以设计出自动化的风控开关, 以便于限制用户的不同行为.</p><p>交易所整体的开关, 也可以认为是服务降级, 在出现大规模严重风险时需要降级维护全站或者部分功能, 以便于升级或者排查风险. 用户级别的开关, 用于在某个用户出现风险时对用户的行为限制. 对冲开关是基于用户维度做数据分析后, 将用户分为 AB 仓进行仓位管理的一个方案.</p><p>在上面列举不同开关时大致已经明确了不同开关的目的和用途, 这里着重说一下交易和资产划转. 当用户出现问题时, 堵住资金流转过程是最大程度保护用户资产和系统安全的方式. 其中如果如果用户账号被盗, 或者用户盗取其他用户资产, 那么在系统中禁止提币是第一步, 禁止资金在各个系统模块(现货,合约,期权,理财,C2C 等)之间的划转是第二步, 禁止在模块内进行砸盘拉盘交易将资金对敲给其他用户是第三步, 这样可以在一切事情调查清楚之前最大程度保证全站用户的资产安全</p>]]></content>
    
    <summary type="html">
    
      
      
        &lt;p&gt;用户行为风险系统主要包括: &lt;code&gt;配置&lt;/code&gt; 指的是配置一些风控维度进行数据监控统计, &lt;code&gt;查询&lt;/code&gt; 指的是基于配置查询用户触发记录, 和 &lt;code&gt;处理开关&lt;/code&gt; 在配置和查询之后对有风险的用户进行一定的开关操作.&lt;/p&gt;
&lt;ol
      
    
    </summary>
    
    
      <category term="Quant" scheme="http://ono.lol/categories/Quant/"/>
    
    
      <category term="Quant" scheme="http://ono.lol/tags/Quant/"/>
    
  </entry>
  
  <entry>
    <title>流动性做市 3 - 市场风险与政策风险</title>
    <link href="http://ono.lol/2023/10/11/Quant/%E6%B5%81%E5%8A%A8%E6%80%A7%E5%81%9A%E5%B8%82%203%20-%20%E5%B8%82%E5%9C%BA%E9%A3%8E%E9%99%A9%E4%B8%8E%E6%94%BF%E7%AD%96%E9%A3%8E%E9%99%A9/"/>
    <id>http://ono.lol/2023/10/11/Quant/%E6%B5%81%E5%8A%A8%E6%80%A7%E5%81%9A%E5%B8%82%203%20-%20%E5%B8%82%E5%9C%BA%E9%A3%8E%E9%99%A9%E4%B8%8E%E6%94%BF%E7%AD%96%E9%A3%8E%E9%99%A9/</id>
    <published>2023-10-11T11:31:03.000Z</published>
    <updated>2023-10-12T16:14:16.674Z</updated>
    
    <content type="html"><![CDATA[<h2 id="一-市场风险"><a href="#一-市场风险" class="headerlink" title="一. 市场风险"></a>一. 市场风险</h2><p><code>市场风险</code> 主要包括: 行情波动, 报价丢失, 项目跑路, 交易所跑路</p><p>行情波动的风险, 主要因为消息产生的确定性方向波动, 做市没能快速捕捉消息而造成亏损. 这时候的主要应对方式是在消息放出时间点之前, 降低流动性厚度.</p><p>报价丢失主要因为网络问题, 维护, 项目方跑路, 交易所跑路引起, 这时候需要接入多家交易所报价, 用算法去选择报价.</p><h2 id="二-政策风险"><a href="#二-政策风险" class="headerlink" title="二. 政策风险"></a>二. 政策风险</h2><p><code>政策风险</code> 主要包括: C2C 商家问题, 出现黑币, 出现黑资金, 在不合法地区展开商业活动, 无牌照</p><p>其中 C2C 商家问题需要产品层面设置保证金来解决.</p><p>黑币和黑资金问题是技术层面能处理的, 将链上的各种黑客行为菠菜地址加入黑名单, 出现对应的资金直接风控</p><p>其他不合法问题, 直接离开不参与.</p>]]></content>
    
    <summary type="html">
    
      
      
        &lt;h2 id=&quot;一-市场风险&quot;&gt;&lt;a href=&quot;#一-市场风险&quot; class=&quot;headerlink&quot; title=&quot;一. 市场风险&quot;&gt;&lt;/a&gt;一. 市场风险&lt;/h2&gt;&lt;p&gt;&lt;code&gt;市场风险&lt;/code&gt; 主要包括: 行情波动, 报价丢失, 项目跑路, 交易所跑路&lt;/p&gt;

      
    
    </summary>
    
    
      <category term="Quant" scheme="http://ono.lol/categories/Quant/"/>
    
    
      <category term="Quant" scheme="http://ono.lol/tags/Quant/"/>
    
  </entry>
  
  <entry>
    <title>流动性做市 2 - 做市系统与流动性风险</title>
    <link href="http://ono.lol/2023/10/10/Quant/%E6%B5%81%E5%8A%A8%E6%80%A7%E5%81%9A%E5%B8%82%202%20-%20%E5%81%9A%E5%B8%82%E7%B3%BB%E7%BB%9F%E4%B8%8E%E6%B5%81%E5%8A%A8%E6%80%A7%E9%A3%8E%E9%99%A9/"/>
    <id>http://ono.lol/2023/10/10/Quant/%E6%B5%81%E5%8A%A8%E6%80%A7%E5%81%9A%E5%B8%82%202%20-%20%E5%81%9A%E5%B8%82%E7%B3%BB%E7%BB%9F%E4%B8%8E%E6%B5%81%E5%8A%A8%E6%80%A7%E9%A3%8E%E9%99%A9/</id>
    <published>2023-10-09T18:21:21.000Z</published>
    <updated>2023-10-12T16:14:10.777Z</updated>
    
    <content type="html"><![CDATA[<h2 id="一-做市系统风险"><a href="#一-做市系统风险" class="headerlink" title="一. 做市系统风险"></a>一. 做市系统风险</h2><p><code>做市系统风险</code> 主要来源于三部分: 外部市场 API 问题, 做市市场 API 问题, 资产仓位管理</p><p>其中 API 问题主要分为公有 API 和私有 API 问题.</p><p>公有 API 主要包括: 订单簿,报价,成交单,K 线,成交量等. 外网 API 主要影响报价以及市场数据的分析, 以及做市策略的制定.</p><p>私有 API 主要包括: 挂撤单,平仓,资产,仓位. 外网 API 主要影响仓位管理. 内网 API 影响做市效果. 最终都会影响做市盈亏.</p><h2 id="二-流动性风险"><a href="#二-流动性风险" class="headerlink" title="二. 流动性风险"></a>二. 流动性风险</h2><p><code>流动性风险</code> 主要包括: 仓位过大, 保证金不足, 余额不足, 流动性不足</p><p>仓位过大包括总仓位过大, 这时的 A 仓用户仓位都集中在单边, 造成浮动盈亏波动加剧, 内网保证金不足, 余额不足. 也包括外网对冲仓位过大, 也就是 B 仓用户仓位集中在单边, 这时直接引起外网保证金不足, 余额不足.</p><p>流动性不足主要是指在内网的流动性厚度超过外网厚度时, B 仓用户开仓造成外网流动性不足以负担内网流动性需求引发交易滑点产生亏损.</p><h3 id="流动性风险控制的一些思考"><a href="#流动性风险控制的一些思考" class="headerlink" title="流动性风险控制的一些思考"></a>流动性风险控制的一些思考</h3><p><strong>关于如何划分 AB 仓用户:</strong></p><p>最近在基于机器学习做分类问题, 想着将用户行为数据和交易数据做一个模型训练. 大致参考的维度在之后的 <code>用户行为风险管理</code> 里面的 <code>风险因子</code> 去进一步描述.</p><p><strong>关于短期对赌方向的预测:</strong></p><p>在基于分钟 K 线上构建机器学习模型, 将常用的 MACD, BOLL, RSI 等指标配合 OHLCV 进行模型构建, 并且定期做模型更新, 进而预测短期市场走向并判断 AB 仓盈亏概率.</p>]]></content>
    
    <summary type="html">
    
      
      
        &lt;h2 id=&quot;一-做市系统风险&quot;&gt;&lt;a href=&quot;#一-做市系统风险&quot; class=&quot;headerlink&quot; title=&quot;一. 做市系统风险&quot;&gt;&lt;/a&gt;一. 做市系统风险&lt;/h2&gt;&lt;p&gt;&lt;code&gt;做市系统风险&lt;/code&gt; 主要来源于三部分: 外部市场 API 问题, 做
      
    
    </summary>
    
    
      <category term="Quant" scheme="http://ono.lol/categories/Quant/"/>
    
    
      <category term="Quant" scheme="http://ono.lol/tags/Quant/"/>
    
  </entry>
  
  <entry>
    <title>流动性做市 1 - 风控系统概述</title>
    <link href="http://ono.lol/2023/10/09/Quant/%E6%B5%81%E5%8A%A8%E6%80%A7%E5%81%9A%E5%B8%82%201%20-%20%E9%A3%8E%E6%8E%A7%E7%B3%BB%E7%BB%9F%E6%A6%82%E8%BF%B0/"/>
    <id>http://ono.lol/2023/10/09/Quant/%E6%B5%81%E5%8A%A8%E6%80%A7%E5%81%9A%E5%B8%82%201%20-%20%E9%A3%8E%E6%8E%A7%E7%B3%BB%E7%BB%9F%E6%A6%82%E8%BF%B0/</id>
    <published>2023-10-09T11:45:20.000Z</published>
    <updated>2023-10-12T16:14:04.170Z</updated>
    
    <content type="html"><![CDATA[<p>风控系统设计的主要目的, 是帮助交易所或者流动性服务商, 在提供流动性做市时快速找到可能存在的风险点, 并基于处理预案进行相应的风控操作.</p><p>风险主要分为以下方面</p><ol><li><code>交易系统风险</code>: 系统漏洞, 流量攻击, 访问墙, 钱包被盗</li><li><code>做市系统风险</code>: 交易所/做市系统 API 问题(订单簿,报价,成交单,K 线,成交量; 挂撤单,平仓,资产,仓位)</li><li><code>流动性风险</code>: 仓位过大, 保证金不足, 余额不足</li><li><code>市场风险</code>: 行情波动, 报价丢失, 项目跑路, 交易所跑路</li><li><code>政策风险</code>: C2C 商家问题, 出现黑币, 出现黑资金, 在不合法地区展开商业活动, 无牌照</li><li><code>用户行为风险</code>: 刷子用户, 代理商行为, 用户交易行为, 用户交易策略</li></ol><p>我们主要处理做市系统风险, 流动性风险, 用户行为风险, 市场风险, 以及少量交易系统风险数据, 和政策风险, 其他安全相关的风险由交易所运维和网络安全相关部门.</p><p>交易系统风险中, 钱包被盗问题划分到用户行为风险模块中展示(毕竟也算是一种用户的行为). 我们后面分三部分讨论 做市系统风险 &amp; 流动性风险, 市场风险 &amp; 政策风险, 以及用户行为风险.</p>]]></content>
    
    <summary type="html">
    
      
      
        &lt;p&gt;风控系统设计的主要目的, 是帮助交易所或者流动性服务商, 在提供流动性做市时快速找到可能存在的风险点, 并基于处理预案进行相应的风控操作.&lt;/p&gt;
&lt;p&gt;风险主要分为以下方面&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;code&gt;交易系统风险&lt;/code&gt;: 系统漏洞, 流量攻击, 访问墙
      
    
    </summary>
    
    
      <category term="Quant" scheme="http://ono.lol/categories/Quant/"/>
    
    
      <category term="Quant" scheme="http://ono.lol/tags/Quant/"/>
    
  </entry>
  
  <entry>
    <title>人工智能学习 7 - 神经网络</title>
    <link href="http://ono.lol/2023/10/08/ComputerScience/MachineLearning/%E4%BA%BA%E5%B7%A5%E6%99%BA%E8%83%BD%E5%AD%A6%E4%B9%A0%207%20-%20%E7%A5%9E%E7%BB%8F%E7%BD%91%E7%BB%9C/"/>
    <id>http://ono.lol/2023/10/08/ComputerScience/MachineLearning/%E4%BA%BA%E5%B7%A5%E6%99%BA%E8%83%BD%E5%AD%A6%E4%B9%A0%207%20-%20%E7%A5%9E%E7%BB%8F%E7%BD%91%E7%BB%9C/</id>
    <published>2023-10-08T15:51:31.000Z</published>
    <updated>2023-10-12T17:03:55.913Z</updated>
    
    <content type="html"><![CDATA[<h2 id="神经网络"><a href="#神经网络" class="headerlink" title="神经网络"></a>神经网络</h2><ul><li>输入层: x1, x2…</li><li>隐藏层: a1, a2… 计算的中间过程</li><li>输出层: y1, y2…</li></ul><p>神经网络结构越复杂, 能解决的问题就越复杂</p><p>将输入层数据使用 $z = w_1x_1 + w_2x_2 + … + w_nx_n + b$ (即为 $Z = W^TX+b$) 计算后, 通过激活函数 sgn/logistic/… 等非线性函数转换得出隐藏层 a</p><p>$$<br>\begin{cases}<br>z=w^Tx+b \<br>a=f(z) \<br>\end{cases}<br>$$</p><p>每个隐藏层又作为输入层参与下一层网络的计算.</p><h3 id="激活函数-非线性转换"><a href="#激活函数-非线性转换" class="headerlink" title="激活函数(非线性转换)"></a>激活函数(非线性转换)</h3><ul><li>logistic</li><li>sgn</li><li>relu: &gt;0 时导数=1, &lt;=0 时导数=0</li><li>tanh</li></ul><h3 id="全连接神经网络"><a href="#全连接神经网络" class="headerlink" title="全连接神经网络"></a>全连接神经网络</h3><p>网络结构为每一层的每个神经元都与下一层的所有神经元相连接.</p><h2 id="预测过程"><a href="#预测过程" class="headerlink" title="预测过程"></a>预测过程</h2><p>在已知神经网络上, 传入变量, 得到结果, 就是预测过程.</p><h2 id="训练过程-有监督"><a href="#训练过程-有监督" class="headerlink" title="训练过程(有监督)"></a>训练过程(有监督)</h2><p>训练过程(反向传播)</p><ul><li>前向传播 (预测过程)</li><li>求得损失</li><li>求得梯度</li><li>梯度下降优化参数, 降低损失</li></ul><p>通过反复进行训练过程, 实现参数优化</p><h2 id="完成训练的标记"><a href="#完成训练的标记" class="headerlink" title="完成训练的标记"></a>完成训练的标记</h2><ul><li>求损失: $J(w) = \frac{1}{2}(\hat{y} - y)^2$</li><li>求 $w$ 梯度(导数): $\frac{\partial J(w)}{\partial w_{11}^{(1)}} = 所有路线的偏导数相加$</li><li>梯度下降更新 $w$: $w_{11}^{(1)’} = w_{11}^{(1)} - Lr * \frac{\partial J(w)}{\partial w_{11}^{(1)}}$</li></ul><p>其中 <code>Lr</code> 为 Learning rate 学习率, 较大时容易在最优解附近跳跃, 较小学习过程漫长.</p><p>最终在损失不再下降或者下降的幅度很低时, 或者达到指定学习次数后, 训练完成.</p><h3 id="自动微分"><a href="#自动微分" class="headerlink" title="自动微分"></a>自动微分</h3><p>缓存每个节点微分的值, 需要的时候直接取用</p><p>$\frac{\partial J}{\partial w^{1}<em>{11}} = \frac{\partial J}{\partial z^{1}</em>{1}} * \frac{\partial z^{1}<em>{1}}{\partial w^{1}</em>{11}}$</p><p>$\frac{\partial J}{\partial w^{2}<em>{11}} = \frac{\partial J}{\partial z^{1}</em>{1}} * \frac{\partial z^{1}<em>{1}}{\partial w^{2}</em>{11}}$</p><p>在记录了每一层 $\partial z$ 之后, 运算就无需每次从后向前一步步运算.</p><p>通过自动微分向前逐步找到前面的 $w$ 值的过程, 成为前向传播.</p>]]></content>
    
    <summary type="html">
    
      
      
        &lt;h2 id=&quot;神经网络&quot;&gt;&lt;a href=&quot;#神经网络&quot; class=&quot;headerlink&quot; title=&quot;神经网络&quot;&gt;&lt;/a&gt;神经网络&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;输入层: x1, x2…&lt;/li&gt;
&lt;li&gt;隐藏层: a1, a2… 计算的中间过程&lt;/li&gt;
&lt;li&gt;输出层:
      
    
    </summary>
    
    
      <category term="计算机" scheme="http://ono.lol/categories/%E8%AE%A1%E7%AE%97%E6%9C%BA/"/>
    
      <category term="人工智能" scheme="http://ono.lol/categories/%E8%AE%A1%E7%AE%97%E6%9C%BA/%E4%BA%BA%E5%B7%A5%E6%99%BA%E8%83%BD/"/>
    
    
      <category term="人工智能" scheme="http://ono.lol/tags/%E4%BA%BA%E5%B7%A5%E6%99%BA%E8%83%BD/"/>
    
  </entry>
  
  <entry>
    <title>人工智能学习 6 - Python对象和类</title>
    <link href="http://ono.lol/2023/09/21/ComputerScience/MachineLearning/%E4%BA%BA%E5%B7%A5%E6%99%BA%E8%83%BD%E5%AD%A6%E4%B9%A0%206%20-%20Python%E5%AF%B9%E8%B1%A1%E5%92%8C%E7%B1%BB/"/>
    <id>http://ono.lol/2023/09/21/ComputerScience/MachineLearning/%E4%BA%BA%E5%B7%A5%E6%99%BA%E8%83%BD%E5%AD%A6%E4%B9%A0%206%20-%20Python%E5%AF%B9%E8%B1%A1%E5%92%8C%E7%B1%BB/</id>
    <published>2023-09-20T16:50:45.000Z</published>
    <updated>2023-09-20T16:51:04.000Z</updated>
    
    <content type="html"><![CDATA[<h2 id="类的定义和使用"><a href="#类的定义和使用" class="headerlink" title="类的定义和使用"></a>类的定义和使用</h2><p>类定义</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br></pre></td><td class="code"><pre><span class="line"><span class="class"><span class="keyword">class</span> <span class="title">SuperClass</span><span class="params">()</span>:</span></span><br><span class="line">  <span class="comment"># 属性/变量, 不定义直接在 __init__ 中赋值即可完成属性的声明</span></span><br><span class="line">  <span class="comment"># name = ""</span></span><br><span class="line"></span><br><span class="line">  <span class="comment"># 构造函数</span></span><br><span class="line">  <span class="function"><span class="keyword">def</span> <span class="title">__init__</span><span class="params">(self, name=<span class="string">""</span>)</span>:</span></span><br><span class="line">    <span class="comment"># 公有属性</span></span><br><span class="line">    self.name = name</span><br><span class="line">    <span class="comment"># 私有属性</span></span><br><span class="line">    self._ctime = time.time()</span><br><span class="line"></span><br><span class="line">  <span class="comment"># 方法/函数</span></span><br><span class="line">  <span class="function"><span class="keyword">def</span> <span class="title">debug</span><span class="params">(self, *args, **kvargv)</span>:</span></span><br><span class="line">    print(self.name, args, kvargv)</span><br><span class="line"></span><br><span class="line">  <span class="comment"># 标记为私有方法, 但仍可调用, 可以继承, 可以重写 (就只是个标记, 没有任何强制约束)</span></span><br><span class="line">  <span class="function"><span class="keyword">def</span> <span class="title">_internal_method</span><span class="params">(self)</span>:</span></span><br><span class="line">    <span class="keyword">pass</span></span><br><span class="line"></span><br><span class="line">  <span class="comment"># 标记为私有方法, 无法直接调用(使用 _ClassName__FuncName 方法调用), 无法继承, 可以重写</span></span><br><span class="line">  <span class="function"><span class="keyword">def</span> <span class="title">__internal_method</span><span class="params">(self)</span>:</span></span><br><span class="line">    <span class="keyword">pass</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 继承: 子类可以使用父类的一些方法</span></span><br><span class="line"><span class="comment"># 封装: 私有(内部)的属性和方法的隐藏:</span></span><br><span class="line"><span class="comment">#   使用 `_` 前缀标记私有, 虽然依然可以直接调用.</span></span><br><span class="line"><span class="comment">#   使用 `__` 前缀标记私有, 无法直接调用, 但是可以使用 `obj._ClassName__FuncName()`; 在子类中隐藏, 无法直接调用和覆盖.</span></span><br><span class="line"><span class="class"><span class="keyword">class</span> <span class="title">ClassName</span><span class="params">(SuperClass)</span>:</span></span><br><span class="line">  <span class="comment"># 构造函数的调用</span></span><br><span class="line">  <span class="function"><span class="keyword">def</span> <span class="title">__init__</span><span class="params">(self, name=<span class="string">"name"</span>, age=<span class="number">18</span>)</span>:</span></span><br><span class="line">    super().__init__(name)</span><br><span class="line">    self.age = age</span><br><span class="line"></span><br><span class="line">  <span class="comment"># 父类方法调用/重写</span></span><br><span class="line">  <span class="function"><span class="keyword">def</span> <span class="title">debug</span><span class="params">(self, *args, **kvargv)</span>:</span></span><br><span class="line">    super().debug(*args, **kvargv)</span><br><span class="line">    print(<span class="string">"111"</span>)</span><br></pre></td></tr></table></figure><p>初始化对象</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">cn = ClassName(name=<span class="string">"zs"</span>, age=<span class="number">22</span>)</span><br><span class="line">cn.debug()</span><br></pre></td></tr></table></figure><h2 id="类的-setter-和-getter"><a href="#类的-setter-和-getter" class="headerlink" title="类的 setter 和 getter"></a>类的 setter 和 getter</h2><p>可管理属性(装饰器): 保留了属性可见性, 增加了 getter 和 setter 的逻辑</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br></pre></td><td class="code"><pre><span class="line"><span class="class"><span class="keyword">class</span> <span class="title">ClassName</span><span class="params">()</span>:</span></span><br><span class="line">    <span class="function"><span class="keyword">def</span> <span class="title">__init__</span><span class="params">(self, name, age)</span>:</span></span><br><span class="line">        self.__name = name</span><br><span class="line">        self.__age = age</span><br><span class="line"></span><br><span class="line"><span class="meta">    @property</span></span><br><span class="line">    <span class="function"><span class="keyword">def</span> <span class="title">age</span><span class="params">(self)</span>:</span></span><br><span class="line">        <span class="keyword">if</span> self.__age &gt; <span class="number">100</span>:</span><br><span class="line">           <span class="keyword">return</span> <span class="number">100</span></span><br><span class="line"></span><br><span class="line">        <span class="keyword">return</span> self.__age</span><br><span class="line"></span><br><span class="line"><span class="meta">    @age.setter</span></span><br><span class="line">    <span class="function"><span class="keyword">def</span> <span class="title">age</span><span class="params">(self, age)</span>:</span></span><br><span class="line">        <span class="keyword">if</span> <span class="number">0</span> &lt; age &lt;= <span class="number">100</span>:</span><br><span class="line">            self.__age = age</span><br><span class="line">        <span class="keyword">else</span></span><br><span class="line">            print(<span class="string">"invalid age"</span>, age)</span><br></pre></td></tr></table></figure><h2 id="类的魔法方法"><a href="#类的魔法方法" class="headerlink" title="类的魔法方法"></a>类的魔法方法</h2><ul><li><code>__new__</code> 创建对象, <code>__init__</code> 将创建后的对象初始化</li><li><code>__eq__</code> == , <code>__ne__</code> != , <code>__ge__</code> &gt;= , <code>__gt__</code> &gt; , <code>__le__</code> &lt;= , <code>__lt__</code> &lt; , <code>__contains__</code> in</li><li><code>__add__</code> +-, <code>__mul__</code> */, <code>__mod__</code> %, <code>__rmod__</code> %, <code>__rmul__</code> /</li><li><code>__len__</code>, <code>__sizeof__</code>, <code>__hash__</code>, <code>__str__</code>, <code>__repr__</code>, <code>__format__</code>,</li><li><code>__setattr__</code>, <code>__getitem__</code>, <code>__getattribute__</code>, <code>__delattr__</code>,</li></ul><p><code>__class__</code>, <code>__doc__</code>,<br><code>__getnewargs__</code>, <code>__getslice__</code>,<br><code>__reduce__</code>, <code>__reduce_ex__</code>,<br><code>__subclasshook__</code>,</p>]]></content>
    
    <summary type="html">
    
      
      
        &lt;h2 id=&quot;类的定义和使用&quot;&gt;&lt;a href=&quot;#类的定义和使用&quot; class=&quot;headerlink&quot; title=&quot;类的定义和使用&quot;&gt;&lt;/a&gt;类的定义和使用&lt;/h2&gt;&lt;p&gt;类定义&lt;/p&gt;
&lt;figure class=&quot;highlight python&quot;&gt;&lt;table&gt;&lt;t
      
    
    </summary>
    
    
      <category term="计算机" scheme="http://ono.lol/categories/%E8%AE%A1%E7%AE%97%E6%9C%BA/"/>
    
      <category term="人工智能" scheme="http://ono.lol/categories/%E8%AE%A1%E7%AE%97%E6%9C%BA/%E4%BA%BA%E5%B7%A5%E6%99%BA%E8%83%BD/"/>
    
    
      <category term="人工智能" scheme="http://ono.lol/tags/%E4%BA%BA%E5%B7%A5%E6%99%BA%E8%83%BD/"/>
    
  </entry>
  
  <entry>
    <title>人工智能学习 5 - 人工智能数学基础</title>
    <link href="http://ono.lol/2023/09/20/ComputerScience/MachineLearning/%E4%BA%BA%E5%B7%A5%E6%99%BA%E8%83%BD%E5%AD%A6%E4%B9%A0%205%20-%20%E4%BA%BA%E5%B7%A5%E6%99%BA%E8%83%BD%E6%95%B0%E5%AD%A6%E5%9F%BA%E7%A1%80/"/>
    <id>http://ono.lol/2023/09/20/ComputerScience/MachineLearning/%E4%BA%BA%E5%B7%A5%E6%99%BA%E8%83%BD%E5%AD%A6%E4%B9%A0%205%20-%20%E4%BA%BA%E5%B7%A5%E6%99%BA%E8%83%BD%E6%95%B0%E5%AD%A6%E5%9F%BA%E7%A1%80/</id>
    <published>2023-09-20T15:03:41.000Z</published>
    <updated>2023-09-20T15:03:43.000Z</updated>
    
    <content type="html"><![CDATA[<h2 id="机器学习模型"><a href="#机器学习模型" class="headerlink" title="机器学习模型"></a>机器学习模型</h2><ul><li>Linger or Logistic Regression <code>线性回归与逻辑回归</code></li><li>Decision Tree or Random Forests</li><li>Gradient Boosting Machines(xgboost, lightgbm..)</li><li>CNN: Convolutional Neutral Networks <code>卷积神经网络</code></li><li>Bayesian Approaches</li><li>Dense Neutral Networks</li><li>RNN: Recurrent Neutral Networks</li><li>Transformer Networks</li><li>GAN: Generative Advanced Networks</li><li>Evolutionary Approaches</li></ul><h2 id="分类与回归"><a href="#分类与回归" class="headerlink" title="分类与回归"></a>分类与回归</h2><p>结果是连续函数, 一般为回归问题; 结果是离散函数, 一般为分类问题.</p><h3 id="线性回归问题"><a href="#线性回归问题" class="headerlink" title="线性回归问题"></a>线性回归问题</h3><p>将模型的输入作为自变量, 输出作为因变量, 构建线性方程 $f(x)=W^TX+b$ (其中 W, X, b 均为向量)</p><p>通过训练数据 <code>X-&gt;Y</code> 优化线性方程参数 <code>(W,b)</code> 的过程, 即为机器学习.</p><p>通过梯度下降优化方程, 找到更优的 <code>(W,b)</code> 使得损失函数(代价函数)最小</p><p>$$<br>J(w,b) = \frac{1}{2} \Sigma^n_{i=1}[(f(x_i) - y_i)^2], \qquad \qquad n 为 样本的特征维度<br>$$</p><h3 id="梯度下降法"><a href="#梯度下降法" class="headerlink" title="梯度下降法"></a>梯度下降法</h3><ul><li>函数: $f(x) = W^TX+b$</li><li>参数: <code>w</code>, <code>b</code></li><li>损失: $J(w,b) = \frac{1}{2} \sum^n_{i=1}[(f(x_i) - y_i)^2]$</li><li>目标: $min_{w,b} J(w,b)$</li></ul><p>梯度下降: 求 <code>J(w,b)</code> 函数 局部最优解(最小值)的方法</p><ul><li>方向: 导数的反方向 $- \frac{\partial{J}}{\partial{w}}$</li><li>步长: 学习率 $\alpha$</li></ul><p>$$w’ = w - \alpha \frac{\partial{J}}{\partial{w}}$$</p><p>参考: 什么是梯度和导数 <a href="https://zhuanlan.zhihu.com/p/377666441" target="_blank" rel="noopener">https://zhuanlan.zhihu.com/p/377666441</a>, 什么是梯度下降法 <a href="https://www.zhihu.com/question/305638940" target="_blank" rel="noopener">https://www.zhihu.com/question/305638940</a></p><p><code>梯度</code>: 对于函数的某个特定点，它的梯度就表示从该点出发，函数值增长最为迅猛的方向.</p><p><code>下降</code>: 在优化过程中, 梯度 $\nabla{f}$ 的模 $||\nabla{f}||$ 一直在变小</p><h4 id="学习率"><a href="#学习率" class="headerlink" title="学习率"></a>学习率</h4><ul><li>过大的学习率: 会造成寻找最优解的过程中, 一直在最优解附近震荡</li><li>过小的学习率: 造成寻找效率降低</li></ul><p><code>超参数</code>: 不是模型学习过程中习得的, 而是根据经验设置的.</p><h4 id="初始参数"><a href="#初始参数" class="headerlink" title="初始参数"></a>初始参数</h4><p>初始参数, 会影响学习走向不同的局部最优解</p><h4 id="收敛"><a href="#收敛" class="headerlink" title="收敛"></a>收敛</h4><p>目标函数是凸函数, 梯度下降法的解是全局最优解</p><p>如何判断/认为收敛</p><ol><li>梯度值足够小</li><li>损失变化足够小</li></ol><h4 id="梯度下降的批量操作"><a href="#梯度下降的批量操作" class="headerlink" title="梯度下降的批量操作"></a>梯度下降的批量操作</h4><ol><li>批量梯度下降: 使用全部样本估计梯度 $\frac{1}{2m}\sum_{i=1}^m(f(x_i)-y_i)^2$</li><li>小批量梯度下降: ① 样本划分为多个子集 batch, 分别估计梯度 -&gt; ② 样本打乱 -&gt; 重复 ① …</li><li>随机梯度下降: 每次随机抽取一个样本估计梯度 $(f(x_i)-y_i)^2$</li></ol><p>小批量梯度下降, 每个子集称为 batch, 全部子集循环一遍称为 epoch</p><h3 id="逻辑回归问题"><a href="#逻辑回归问题" class="headerlink" title="逻辑回归问题"></a>逻辑回归问题</h3><p>有 <code>f(x) = WX + b</code> 使得</p><p>$$<br>z =<br>\begin{cases}<br>正类, f(x) \ge 0 \<br>负类, f(x) \lt 0<br>\end{cases}<br>$$</p><p>因为阶跃函数连续不可导, 所以将其转化为sigmoid函数</p><p>$$<br>h(f(x)) = \frac{1}{1+e^{-f(x)}} \<br>f(x) = \frac{1}{1+e^{-(wx+b)}}<br>\begin{cases}<br>正类, h(f(x)) \ge 0.5 \<br>负类, h(f(x)) \lt 0.5<br>\end{cases}<br>$$</p><p>对应的损失函数 <code>J(w,b)</code> 为</p><p>$$<br>J(w,b)_i = - y_i\ln{f(x_i)} - (1-y_i)\ln[1-f(x_i)]<br>$$</p><p>其中 $y_i \in {0,1}$, $f(x_i)$ 正类概率, $1-f(x_i)$ 负类概率; 当 $y_i = 0$ 时, 为负类, 损失函数前半部分为0, 当 $y_i = 1$ 时, 为正类, 损失函数后半部分为0.</p><p>$$<br>J(w,b) = - \frac{1}{m} \sum_{i=1}^m {y_i\ln{f(x_i)} - (1-y_i)\ln[1-f(x_i)]}<br>$$</p><p>参考: 损失函数 II - 逻辑回归 <a href="https://towardsdatascience.com/optimization-loss-function-under-the-hood-part-ii-d20a239cde11" target="_blank" rel="noopener">https://towardsdatascience.com/optimization-loss-function-under-the-hood-part-ii-d20a239cde11</a></p>]]></content>
    
    <summary type="html">
    
      
      
        &lt;h2 id=&quot;机器学习模型&quot;&gt;&lt;a href=&quot;#机器学习模型&quot; class=&quot;headerlink&quot; title=&quot;机器学习模型&quot;&gt;&lt;/a&gt;机器学习模型&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;Linger or Logistic Regression &lt;code&gt;线性回归与逻辑回归&lt;/c
      
    
    </summary>
    
    
      <category term="计算机" scheme="http://ono.lol/categories/%E8%AE%A1%E7%AE%97%E6%9C%BA/"/>
    
      <category term="人工智能" scheme="http://ono.lol/categories/%E8%AE%A1%E7%AE%97%E6%9C%BA/%E4%BA%BA%E5%B7%A5%E6%99%BA%E8%83%BD/"/>
    
    
      <category term="人工智能" scheme="http://ono.lol/tags/%E4%BA%BA%E5%B7%A5%E6%99%BA%E8%83%BD/"/>
    
  </entry>
  
</feed>
