From 31d7d24c0735169e880f087625bb028ba1abc39e Mon Sep 17 00:00:00 2001 From: stormckey Date: Sun, 26 Nov 2023 12:21:17 +0800 Subject: [PATCH] more standard doc format --- docs/Blog/Cool/GPT_academic.md | 8 +- docs/Blog/Cool/github_profile.md | 62 ++++---- docs/Blog/Cool/index.md | 2 +- docs/Blog/Environment/CLI_tools.md | 4 +- docs/Blog/Environment/Mac_VSC_DEBUG.md | 56 +++---- docs/Blog/Environment/VSCode-Markdown.md | 26 ++-- docs/Blog/Environment/VSCode_conda.md | 8 +- docs/Blog/Environment/index.md | 4 +- docs/Blog/Environment/linux_config.md | 22 +-- docs/Blog/Environment/ssh_wsl.md | 30 ++-- docs/Blog/Environment/wsl_cuda.md | 34 ++--- docs/Blog/Environment/zsh_arg.md | 10 +- docs/Blog/Fun/Women_and_prototype.md | 16 +- docs/Blog/Fun/index.md | 2 +- docs/Blog/Labs/CN_lab2.md | 72 ++++----- docs/Blog/Labs/OS_lab3.md | 26 ++-- docs/Blog/Labs/docker_minisql.md | 86 +++++------ docs/Blog/Labs/index.md | 2 +- docs/Blog/Minisql/index.md | 14 +- docs/Blog/Minisql/minisql_part0.md | 18 +-- docs/Blog/Minisql/minisql_part1.md | 14 +- docs/Build_this_website.md | 108 ++++++------- docs/Format.md | 8 +- docs/Note/ADS/B-Tree_B+Tree.md | 48 +++--- docs/Note/ADS/BST_AVL_Splay.md | 28 ++-- docs/Note/ADS/Heap.md | 4 +- docs/Note/ADS/RBTree.md | 18 +-- docs/Note/CO_review.md | 16 +- docs/Note/Data Modeling/Boosting.md | 3 + docs/Note/Data Modeling/Decision_Tree.md | 62 ++++---- docs/Note/Data Modeling/KNN.md | 46 +++--- .../Note/Data Modeling/Logistic_Regression.md | 14 +- docs/Note/Data Modeling/Max_Entropy.md | 28 ++-- docs/Note/Data Modeling/Naive_Bayesian.md | 22 +-- docs/Note/Data Modeling/Perceptron.md | 24 +-- .../Data Modeling/Support_Vector_Machine.md | 78 +++++----- docs/Note/Data Modeling/index.md | 14 +- docs/Note/Missing Semester/Data.md | 46 +++--- docs/Note/Missing Semester/Git.md | 46 +++--- docs/Note/Missing Semester/Shell.md | 144 +++++++++--------- docs/Note/Missing Semester/Vim.md | 50 +++--- docs/Note/Missing Semester/commandline_env.md | 80 +++++----- docs/Note/Missing Semester/index.md | 4 +- docs/PeiPei/index.md | 2 +- docs/PeiPei/markdown.md | 2 +- docs/Research/Diffusion Model/DDIM.md | 14 +- docs/Research/Diffusion Model/DDPM.md | 44 +++--- docs/Research/index.md | 14 +- docs/index.md | 8 +- docs/universal_format.vim | 1 + 50 files changed, 748 insertions(+), 744 deletions(-) create mode 100644 docs/Note/Data Modeling/Boosting.md create mode 100644 docs/universal_format.vim diff --git a/docs/Blog/Cool/GPT_academic.md b/docs/Blog/Cool/GPT_academic.md index 776a17a5..956e8703 100644 --- a/docs/Blog/Cool/GPT_academic.md +++ b/docs/Blog/Cool/GPT_academic.md @@ -4,12 +4,12 @@ comments: true # Enable ChatGPT_academic !!! info "准备工作" - 请在阅读此文前准备好ChatGPT的API Key和好用的代理。(前者主要是注册好账号就行,合理利用https://sms-activate.org/) + 请在阅读此文前准备好 ChatGPT 的 API Key 和好用的代理。(前者主要是注册好账号就行,合理利用 https://sms-activate.org/) -主要的流程就在项目的[:octicons-link-16:源地址](https://github.com/binary-husky/chatgpt_academic)讲的很详细了,照做即可。 +主要的流程就在项目的[:octicons-link-16:源地址](https://github.com/binary-husky/chatgpt_academic)讲的很详细了,照做即可。 -笔者没有用docker部署,部署过程中只遇到一个问题,换过源后pip找不到高版本的gradio -![](images/GPT_academic/2023-03-29-01-35-34.png#pic) +笔者没有用 docker 部署,部署过程中只遇到一个问题,换过源后 pip 找不到高版本的 gradio +![](images/GPT_academic/2023-03-29-01-35-34.png#pic) diff --git a/docs/Blog/Cool/github_profile.md b/docs/Blog/Cool/github_profile.md index 909985da..ea376a54 100644 --- a/docs/Blog/Cool/github_profile.md +++ b/docs/Blog/Cool/github_profile.md @@ -2,23 +2,23 @@ comments: true --- -# 配置Github Profile +# 配置 Github Profile -!!! abstract - 我配置Github主页Profile的方案,灵感来自[:octicons-link-16:Tonycrane的GitHub主页](https://github.com/TonyCrane) +!!! abstract + 我配置 Github 主页 Profile 的方案,灵感来自[:octicons-link-16:Tonycrane 的 GitHub 主页](https://github.com/TonyCrane) -## 启用Github主页Profile -我们先创建一个跟自己账号同名的公开仓库,这是一个特殊的用作主页仓库 -Github会在主页上显示这一仓库的README文档作为Profile,所以我们只要编写这个README文档即可 +## 启用 Github 主页 Profile +我们先创建一个跟自己账号同名的公开仓库,这是一个特殊的用作主页仓库 +Github 会在主页上显示这一仓库的 README 文档作为 Profile,所以我们只要编写这个 README 文档即可 ??? "本人主页预览" ![](images/github_profile/2023-03-23-14-49-05.png#pic) -## 启用Metrics生成 Profile图片 +## 启用 Metrics 生成 Profile 图片 -推荐使用[:octicons-link-16:Metrics](https://github.com/lowlighter/metrics/blob/master/.github/readme/partials/documentation/setup/action.md)来生成好看的Profile +推荐使用[:octicons-link-16:Metrics](https://github.com/lowlighter/metrics/blob/master/.github/readme/partials/documentation/setup/action.md)来生成好看的 Profile -Metrics使用GitHub Action自动更新,我们只要照着链接里的介绍就可以完成部署。Metrics还支持许多不同的[:octicons-link-16:插件](https://github.com/lowlighter/metrics/blob/master/README.md),大家可以随意选择自己喜欢的,最后贴上笔者注释的的Action配置和README源代码,欢迎借鉴使用! +Metrics 使用 GitHub Action 自动更新,我们只要照着链接里的介绍就可以完成部署。Metrics 还支持许多不同的[:octicons-link-16:插件](https://github.com/lowlighter/metrics/blob/master/README.md),大家可以随意选择自己喜欢的,最后贴上笔者注释的的 Action 配置和 README 源代码,欢迎借鉴使用! ??? info "参考配置" @@ -34,7 +34,7 @@ Metrics使用GitHub Action自动更新,我们只要照着链接里的介绍就 # (optional) Run workflow when pushing on master/main push: {branches: ["master", "main"]} jobs: - #generate the left picture + #generate the left picture github-left-metrics: runs-on: ubuntu-latest permissions: @@ -45,30 +45,30 @@ Metrics使用GitHub Action自动更新,我们只要照着链接里的介绍就 uses: lowlighter/metrics@latest with: token: ${{ secrets.METRICS_TOKEN }} - + # the file this action generates filename: matrics-left.svg config_timezone: Asia/Shanghai - - + + # enable plugins plugin_followup: yes - - + + plugin_languages: yes # repositories that wont be accounted plugin_languages_skipped: stormckey/dotfiles plugin_languages_ignored: html, css, ruby, perl, javascript # show the size of source code and percentage of each language plugin_languages_details: bytes-size, percentage - - + + plugin_starlists: yes plugin_starlists_languages: yes - - + + config_order: followup, languages, starlists - + github-right-metrics: runs-on: ubuntu-latest permissions: @@ -77,27 +77,27 @@ Metrics使用GitHub Action自动更新,我们只要照着链接里的介绍就 - name: right uses: lowlighter/metrics@latest with: - #disable the basic metrics + #disable the basic metrics base: "" token: ${{ secrets.METRICS_TOKEN }} filename: matrics-right.svg config_timezone: Asia/Shanghai - + plugin_topics: yes plugin_topics_mode: icons - - + + plugin_isocalendar: yes - - + + plugin_anilist: yes plugin_anilist_user: stormckey plugin_anilist_sections: favorites, characters - - + + config_order: topics, isocalendar, anilist - - + + ``` === "README.md" @@ -121,4 +121,4 @@ Metrics使用GitHub Action自动更新,我们只要照着链接里的介绍就

- ``` \ No newline at end of file + ``` diff --git a/docs/Blog/Cool/index.md b/docs/Blog/Cool/index.md index 3289c06d..40d2d314 100644 --- a/docs/Blog/Cool/index.md +++ b/docs/Blog/Cool/index.md @@ -4,4 +4,4 @@ comments: true # Cool things! !!! abstract - 在这里放一些很酷的事情😋 \ No newline at end of file + 在这里放一些很酷的事情😋 diff --git a/docs/Blog/Environment/CLI_tools.md b/docs/Blog/Environment/CLI_tools.md index 3a154c28..44252f8c 100644 --- a/docs/Blog/Environment/CLI_tools.md +++ b/docs/Blog/Environment/CLI_tools.md @@ -2,7 +2,7 @@ comments: true --- -# 我的CLI工具 +# 我的 CLI 工具 !!! abstract 我在这里列出了我在日常工作中使用的一些 CLI 工具。我会不断更新这个列表。 @@ -19,4 +19,4 @@ comments: true - bat - httpie - hyperfine -- fzf \ No newline at end of file +- fzf diff --git a/docs/Blog/Environment/Mac_VSC_DEBUG.md b/docs/Blog/Environment/Mac_VSC_DEBUG.md index 1be65338..fc68c552 100644 --- a/docs/Blog/Environment/Mac_VSC_DEBUG.md +++ b/docs/Blog/Environment/Mac_VSC_DEBUG.md @@ -1,62 +1,62 @@ --- comments: true --- -# 用Mac的VSCode调试C/C++程序 +# 用 Mac 的 VSCode 调试 C/C++程序 !!! info "环境" - MacOS: Ventura 13.2.1 - VSCode: 1.76.2 x64 - C/C++: 1.14.5 - CodeLLDB: 1.8.0 - Code Runner: 0.12.0 + MacOS: Ventura 13.2.1 + VSCode: 1.76.2 x64 + C/C++: 1.14.5 + CodeLLDB: 1.8.0 + Code Runner: 0.12.0 ## C/C++ -这是一个VSCode插件,启用后,会在VSCode中添加C/C++的语法高亮、代码提示、代码跳转等功能。 -同时右上角出现如下图标: +这是一个 VSCode 插件,启用后,会在 VSCode 中添加 C/C++的语法高亮、代码提示、代码跳转等功能。 +同时右上角出现如下图标: ![](images/Mac_VSC_DEBUG/2023-04-05-23-25-33.png#pic) -选择run的话,插件就会接着让我们选择使用的编译器 +选择 run 的话,插件就会接着让我们选择使用的编译器 ![](images/Mac_VSC_DEBUG/2023-04-05-23-26-52.png#pic) -比如我选择clang++,那么插件就会在当前工作区下自动生成相应的配置文件,并开始运行。 +比如我选择 clang++,那么插件就会在当前工作区下自动生成相应的配置文件,并开始运行。 -对于调试,很遗憾的是,我们的程序是运行在Debug Console中的,而不是终端中,运行在debug console中的问题是没有stdin让我们输入。 +对于调试,很遗憾的是,我们的程序是运行在 Debug Console 中的,而不是终端中,运行在 debug console 中的问题是没有 stdin 让我们输入。 -经过查询,发现Mac上C/C++插件不支持debugger运行在内置终端中,setting里也没有修改选项,只能运行在debug console或者外部终端。详见[:octicons-link-16:官网](https://code.visualstudio.com/docs/cpp/launch-json-reference) +经过查询,发现 Mac 上 C/C++插件不支持 debugger 运行在内置终端中,setting 里也没有修改选项,只能运行在 debug console 或者外部终端。详见[:octicons-link-16:官网](https://code.visualstudio.com/docs/cpp/launch-json-reference) ![](images/Mac_VSC_DEBUG/2023-04-05-23-32-55.png#pic) -如果希望在外部终端运行进行输入的话,我们要在launch.json中配置。注意,当前版本默认配置文件只会生成task.json,没有launch.json: +如果希望在外部终端运行进行输入的话,我们要在 launch.json 中配置。注意,当前版本默认配置文件只会生成 task.json,没有 launch.json: ![](images/Mac_VSC_DEBUG/2023-04-05-23-34-15.png#pic) -那我们就先介绍一下task.json.这里的一些参数是可以修改的,比如args,就是编译时的参数,其中`-g`参数,会让编译器生成调试信息,这样才能进行debug。还有cwd参数,运行程序的文件夹位置,如果不写的话,就会默认在当前工作区的根目录下运行,而非程序所在目录,这在一些打开文件的操作上可能会导致问题。最后注意一下label,我们可以在别的配置文件中通过这个label来调用这个task。 +那我们就先介绍一下 task.json.这里的一些参数是可以修改的,比如 args,就是编译时的参数,其中`-g`参数,会让编译器生成调试信息,这样才能进行 debug。还有 cwd 参数,运行程序的文件夹位置,如果不写的话,就会默认在当前工作区的根目录下运行,而非程序所在目录,这在一些打开文件的操作上可能会导致问题。最后注意一下 label,我们可以在别的配置文件中通过这个 label 来调用这个 task。 -我们新建一个配置文件launch.json:选择侧栏的debug图标,点击`create a launch.json file`: +我们新建一个配置文件 launch.json:选择侧栏的 debug 图标,点击`create a launch.json file`: ![](images/Mac_VSC_DEBUG/2023-04-05-23-38-02.png#pic) -刚开始是空的,什么都没有。点击右下角的`Add Configuration`,就有一些选项,这里有插件为我们准备的默认模版,我们选择`C/C++ lldb(启动)`,意思是C/C++插件提供的,启动一个新的可执行文件并对其debug的配置,选择附加的话是附加到一个已经在执行的进程上的: +刚开始是空的,什么都没有。点击右下角的`Add Configuration`,就有一些选项,这里有插件为我们准备的默认模版,我们选择`C/C++ lldb(启动)`,意思是 C/C++插件提供的,启动一个新的可执行文件并对其 debug 的配置,选择附加的话是附加到一个已经在执行的进程上的: ![](images/Mac_VSC_DEBUG/2023-04-05-23-39-19.png#pic) 默认的模板长这个样子: ![](images/Mac_VSC_DEBUG/2023-04-05-23-40-26.png#pic) -这并不能直接使用,首先修改program为 +这并不能直接使用,首先修改 program 为 ``` "program": "${workspaceFolder}/${fileBasenameNoExtension}", ``` ,这样他运行的就会是当前目录下的当前文件(一般就是光标悬停的那个文件)同名的可执行文件(意思就是没后缀),如果我们编译出来的可执行文件叫做`a.out`,这个配置就不适用(会调用`a`),请在配置中修改为`/a.out`或者让编译出来的可执行文件名为`a`。 -新加一列`preLaunchTask`,值就是之前task.json上的label,这样就会在运行前可执行文件前先运行task编译当前文件(这样比较方便,自动把最新的源代码编译,要多文件编译的话也在task设置。如果不使用task手动编译的话,记得加上-g)。最后,我们要把`"externalConsole": false,`改为`"externalConsole": true,`,这样就会在外部终端中运行了。 +新加一列`preLaunchTask`,值就是之前 task.json 上的 label,这样就会在运行前可执行文件前先运行 task 编译当前文件(这样比较方便,自动把最新的源代码编译,要多文件编译的话也在 task 设置。如果不使用 task 手动编译的话,记得加上-g)。最后,我们要把`"externalConsole": false,`改为`"externalConsole": true,`,这样就会在外部终端中运行了。 ![](images/Mac_VSC_DEBUG/2023-04-05-23-45-03.png#pic) -笔者到这一步就可以在外部终端debug啦,也可以在watch窗口执行命令来监视变量,如全局变量一类的,但是C/C++对一些类型的变量的监视支持不是很好,比如说string: +笔者到这一步就可以在外部终端 debug 啦,也可以在 watch 窗口执行命令来监视变量,如全局变量一类的,但是 C/C++对一些类型的变量的监视支持不是很好,比如说 string: ![](images/Mac_VSC_DEBUG/2023-04-05-23-47-26.png#pic) 监视信息就是一坨。 ## Code Runner -另一个VSCode插件,启用后右上角又会多一个标: +另一个 VSCode 插件,启用后右上角又会多一个标: ![](images/Mac_VSC_DEBUG/2023-04-05-23-49-08.png#pic) 这个是可以跑在内置终端里的: @@ -64,20 +64,20 @@ comments: true ## CodeLLDB 👍 -这个插件也可以进行debug,我感觉比C/C++好用多了。 +这个插件也可以进行 debug,我感觉比 C/C++好用多了。 -启用插件后,我们在launch.json中可选配置就多了几个,我们使用`CodeLLDB (launch)`模板: +启用插件后,我们在 launch.json 中可选配置就多了几个,我们使用`CodeLLDB (launch)`模板: ![](images/Mac_VSC_DEBUG/2023-04-05-23-51-28.png#pic) 同样稍微修改: ![](images/Mac_VSC_DEBUG/2023-04-05-23-52-33.png#pic) -回到侧边栏debug模块,选择新的启动配置(这里选的是launch.json里写好的几个配置): +回到侧边栏 debug 模块,选择新的启动配置(这里选的是 launch.json 里写好的几个配置): ![](images/Mac_VSC_DEBUG/2023-04-05-23-53-05.png#pic) -这会在我们启用debug的时候去launch.json里面找我们指定的配置,然后进行debug。 +这会在我们启用 debug 的时候去 launch.json 里面找我们指定的配置,然后进行 debug。 -!!! warning "有时候debug弹出奇怪的报错,是因为当前打开的是配置文件,试图对launch.json进行debug,所以报错了。我们打开要debug的源代码文件就好了。" +!!! warning "有时候 debug 弹出奇怪的报错,是因为当前打开的是配置文件,试图对 launch.json 进行 debug,所以报错了。我们打开要 debug 的源代码文件就好了。" CodeLLDB 可以使用内置终端: ![](images/Mac_VSC_DEBUG/2023-04-06-00-00-07.png#pic) @@ -85,7 +85,7 @@ CodeLLDB 可以使用内置终端: 可以在监视里直接用变量名监视变量: ![](images/Mac_VSC_DEBUG/2023-04-06-00-00-37.png#pic) -可以在debug console中输入命令: +可以在 debug console 中输入命令: ![](images/Mac_VSC_DEBUG/2023-04-06-00-01-06.png#pic) 变量里的字符串支持也好一些: @@ -93,5 +93,5 @@ CodeLLDB 可以使用内置终端: [:octicons-link-16:这里](https://github.com/vadimcn/codelldb/blob/master/MANUAL.md)还有官方文档,可以看看。 -!!! info "手动创建一个task.json" - 在菜单 terminal > Configure Tasks 选择C/C++来生成模板 +!!! info "手动创建一个 task.json" + 在菜单 terminal > Configure Tasks 选择 C/C++来生成模板 diff --git a/docs/Blog/Environment/VSCode-Markdown.md b/docs/Blog/Environment/VSCode-Markdown.md index 045155ed..11fda150 100644 --- a/docs/Blog/Environment/VSCode-Markdown.md +++ b/docs/Blog/Environment/VSCode-Markdown.md @@ -2,10 +2,10 @@ comments: true --- -# 在VSCode上写Markdown +# 在 VSCode 上写 Markdown ## 起步 -首先启用以下的两个插件,就可以开始写markdown,并在右侧预览了 +首先启用以下的两个插件,就可以开始写 markdown,并在右侧预览了 ![](images/VSCode-markdown/2023-03-23-14-24-20.png#pic) ??? info "效果图" @@ -13,46 +13,46 @@ comments: true ![](images/VSCode-markdown/2023-03-23-14-32-24.png#pic) 注意预览需要在编辑器右上角点击预览按钮开启或者使用快捷键 -如果需要保存成PDF或者别的格式,在预览界面右键就好,Chrome一栏的三个选项都是不需要额外安装的: +如果需要保存成 PDF 或者别的格式,在预览界面右键就好,Chrome 一栏的三个选项都是不需要额外安装的: ![](images/VSCode-markdown/2023-03-23-14-34-26.png#pic) ??? tip "数学公式渲染问题" - 有时候保存成PDF时会发现数学公式渲染失败了,调查了一下发现是生成的速度太快了数学公式来不及渲染,调节以下参数可以解决问题: + 有时候保存成 PDF 时会发现数学公式渲染失败了,调查了一下发现是生成的速度太快了数学公式来不及渲染,调节以下参数可以解决问题: ![](images/VSCode-markdown/2023-03-23-14-35-52.png#pic) ## 快捷地插入图片 -就最原教旨主义的插入方式而言,需要把图片保存到指定文件夹,起好名字,再利用`![](url)`格式插入,步骤相当繁琐,跟Word的图片插入完全是两个量级的工作量。 +就最原教旨主义的插入方式而言,需要把图片保存到指定文件夹,起好名字,再利用`![](url)`格式插入,步骤相当繁琐,跟 Word 的图片插入完全是两个量级的工作量。 推荐使用**Paste Image**插件: ![](images/VSCode-markdown/2023-03-23-14-37-41.png#pic) 修改如下的设置: ![](images/VSCode-markdown/2023-03-23-14-38-36.png#pic) -这会将图片插入到当前md文件下的images/mdfilename/time.png位置。 +这会将图片插入到当前 md 文件下的 images/mdfilename/time.png 位置。 -用系统自带的截屏工具截屏到粘贴板后Command+Option+v即可存入文件夹并自动引用正确的路径。 +用系统自带的截屏工具截屏到粘贴板后 Command+Option+v 即可存入文件夹并自动引用正确的路径。 ??? tip "设置默认图片样式" - 本人使用mkdocs for material搭建此网页,可以给此插件添加的图片添加统一样式: + 本人使用 mkdocs for material 搭建此网页,可以给此插件添加的图片添加统一样式: - - 设置css:比如阴影加圆角 + - 设置 css:比如阴影加圆角 ``` css img[src*="pic"] { box-shadow: 4px 4px 15px #666; border-radius: 10px; } ``` - - 在mkdocs.yml添加css作为额外css: + - 在 mkdocs.yml 添加 css 作为额外 css: ``` yaml extra_css: - css/extra.css - ``` - - 设置Paste Imgae自动添加后缀: + ``` + - 设置 Paste Imgae 自动添加后缀: ``` json "pasteImage.suffix": "#pic" ``` - 可以添加多个样式,并改变#后的名称来切换 - + diff --git a/docs/Blog/Environment/VSCode_conda.md b/docs/Blog/Environment/VSCode_conda.md index 7cf233af..14a6d4cd 100644 --- a/docs/Blog/Environment/VSCode_conda.md +++ b/docs/Blog/Environment/VSCode_conda.md @@ -1,16 +1,16 @@ --- comments: true --- -# 在VSCode中使用conda的虚拟环境问题 +# 在 VSCode 中使用 conda 的虚拟环境问题 -最近开始使用conda,试图在VSCode终端里切换虚拟环境,命令行提示已经切换,但是python环境实际上没有变。 +最近开始使用 conda,试图在 VSCode 终端里切换虚拟环境,命令行提示已经切换,但是 python 环境实际上没有变。 解决方案如下: -1. 快捷键`command shift p`,搜索settings,打开user settings json +1. 快捷键`command shift p`,搜索 settings,打开 user settings json 2. 加入如下内容: ``` "terminal.integrated.env.osx": { "PATH": "" }, ``` -3. 重启VSCode即可 +3. 重启 VSCode 即可 diff --git a/docs/Blog/Environment/index.md b/docs/Blog/Environment/index.md index e9f33812..bb207ecd 100644 --- a/docs/Blog/Environment/index.md +++ b/docs/Blog/Environment/index.md @@ -5,5 +5,5 @@ comments: true # Environment !!! danger - 谁还没有被环境折腾过呢😇 - 我们配环境的宗旨是:能跑就行! \ No newline at end of file + 谁还没有被环境折腾过呢😇 + 我们配环境的宗旨是:能跑就行! diff --git a/docs/Blog/Environment/linux_config.md b/docs/Blog/Environment/linux_config.md index c6c893a0..0d74c496 100644 --- a/docs/Blog/Environment/linux_config.md +++ b/docs/Blog/Environment/linux_config.md @@ -1,50 +1,50 @@ --- comments: true --- -# Linux终端配置 +# Linux 终端配置 -## 启用zsh +## 启用 zsh ``` sudo apt install zsh chsh -s /bin/zsh ``` -重启终端(docker中请重启容器) +重启终端(docker 中请重启容器) -## 安装zsh插件 +## 安装 zsh 插件 -安装p10k +安装 p10k ``` git clone --depth=1 https://gitee.com/romkatv/powerlevel10k.git ~/.zsh/powerlevel10k echo 'source ~/.zsh/powerlevel10k/powerlevel10k.zsh-theme' >>~/.zshrc ``` -重启shell +重启 shell -安装autosuggestion +安装 autosuggestion ``` git clone https://gitee.com/renkx/zsh-autosuggestions.git ~/.zsh/plugins/zsh-autosuggestions echo '#Enable autosuggestion' >> ~/.zshrc echo 'source ~/.zsh/plugins/zsh-autosuggestions/zsh-autosuggestions.zsh' >> ~/.zshrc ``` -安装syntaxhighlight +安装 syntaxhighlight ``` git clone https://gitee.com/renkx/zsh-syntax-highlighting.git ~/.zsh/plugins/zsh-syntax-highlighting echo '#Enable syntax highlight' >> ~/.zshrc echo 'source ~/.zsh/plugins/zsh-syntax-highlighting/zsh-syntax-highlighting.zsh' >> ~/.zshrc ``` -安装autojump +安装 autojump ``` sudo apt install autojump echo '#Enable autojump' >> ~/.zshrc echo 'source /usr/share/autojump/autojump.sh'>>~/.zshrc ``` -## 在命令行中启用vi +## 在命令行中启用 vi ``` git clone https://github.com/soheilpro/zsh-vi-search.git ~/.zsh/plugins/zsh-vi-search echo "#Enable vi mode" >> ~/.zshrc echo "bindkey -v" >> ~/.zshrc echo "source ~/.zsh/plugins/zsh-vi-search/src/zsh-vi-search.zsh" >> ~/.zshrc -``` \ No newline at end of file +``` diff --git a/docs/Blog/Environment/ssh_wsl.md b/docs/Blog/Environment/ssh_wsl.md index d55a1d08..4f6ac692 100644 --- a/docs/Blog/Environment/ssh_wsl.md +++ b/docs/Blog/Environment/ssh_wsl.md @@ -1,8 +1,8 @@ --- comments: true --- -# 用ssh连接同一局域网下的Wsl2 -!!! abstract +# 用 ssh 连接同一局域网下的 Wsl2 +!!! abstract 基础的流程参考[:octicons-link-16:这篇博客](https://blog.csdn.net/qq_24211837/article/details/117386077)就好,本文记录一下踩的雷和更进阶的设置 ## 检查通路 @@ -10,39 +10,39 @@ comments: true !!! abstract "这一步我们要检查我们到要连接的系统的网络通路是正常的" -Windows会给Wsl2分配一个虚拟的本地的地址,在Windows输入`ipconfig`以查看该地址。 -我们在Wsl中启用ssh服务后,想要验证Wsl是否可被连接,可以先在Windows中试着用ssh连接ifconfig中看到的地址 +Windows 会给 Wsl2 分配一个虚拟的本地的地址,在 Windows 输入`ipconfig`以查看该地址。 +我们在 Wsl 中启用 ssh 服务后,想要验证 Wsl 是否可被连接,可以先在 Windows 中试着用 ssh 连接 ifconfig 中看到的地址 -随后我们希望从局域网连接Windows也是通的,我们就用`ipconfig`得到服务器(也就是这台机器)ip,在另一台机器上(客户)尝试`ping `来试着连接,或者直接用ssh连接Windows,保证局域网到Windows这条路都是通的。 +随后我们希望从局域网连接 Windows 也是通的,我们就用`ipconfig`得到服务器(也就是这台机器)ip,在另一台机器上(客户)尝试`ping `来试着连接,或者直接用 ssh 连接 Windows,保证局域网到 Windows 这条路都是通的。 !!! warning - 一些标明为“Secure”的局域网可能不允许局域网内连接,在这些局域网下是互相ping不通的,尝试换个局域网!这点坑了我很久。 + 一些标明为“Secure”的局域网可能不允许局域网内连接,在这些局域网下是互相 ping 不通的,尝试换个局域网!这点坑了我很久。 -最后我们需要确保把局域网,Windows,wsl都连接起来,需要Windows把我们从ssh发来的连接请求转到内部的wsl的端口,这样就通了。(对应的操作在上文的博客中已经提及,如果还有问题,可以尝试[:octicons-link-16:这篇](https://cloud.tencent.com/developer/article/1420930)看看是不是局域网到Windows的问题) +最后我们需要确保把局域网,Windows,wsl 都连接起来,需要 Windows 把我们从 ssh 发来的连接请求转到内部的 wsl 的端口,这样就通了。(对应的操作在上文的博客中已经提及,如果还有问题,可以尝试[:octicons-link-16:这篇](https://cloud.tencent.com/developer/article/1420930)看看是不是局域网到 Windows 的问题) ## 设置免密登陆 - + !!! info "免密登陆也可参考[:octicons-link-16:这篇](https://stormckey.github.io/Blog/docker_minisql/#3sshvscode)" -来到客户端,执行下面命令生成密钥,输入passephrase时直接回车(为空) +来到客户端,执行下面命令生成密钥,输入 passephrase 时直接回车(为空) ``` ssh-keygen ``` -就会在提示的目录下生成密钥,选择其公钥(.pub后缀),把它写入服务器登陆用户的ssh配置文件夹下的“authorized_keys"文件(一般为`~/.ssh/authorized_keys`),注意修改"authorized_keys"的权限改为600,所在文件夹权限改为700. +就会在提示的目录下生成密钥,选择其公钥(.pub 后缀),把它写入服务器登陆用户的 ssh 配置文件夹下的“authorized_keys"文件(一般为`~/.ssh/authorized_keys`),注意修改"authorized_keys"的权限改为 600,所在文件夹权限改为 700. -如果上述都做了之后仍然无法免密登陆,比如`ssh -v user@ip -p port`后看到连接时试图使用公钥验证但是失败了,那么需要再定位问题。在服务器端使用下列语句启用sshd监听连接某个端口 +如果上述都做了之后仍然无法免密登陆,比如`ssh -v user@ip -p port`后看到连接时试图使用公钥验证但是失败了,那么需要再定位问题。在服务器端使用下列语句启用 sshd 监听连接某个端口 ``` sudo /usr/sbin/sshd -d -p 4444 ``` -注意不能使用已经被占用的端口 -启用后去powershell进行端口转发,便可以在终端里看到服务器端认证的全过程了 +注意不能使用已经被占用的端口 +启用后去 powershell 进行端口转发,便可以在终端里看到服务器端认证的全过程了 -## 设置Wsl2静态ip +## 设置 Wsl2 静态 ip 参考[:octicons-link-16:这篇](https://blog.csdn.net/weixin_41301508/article/details/108939520) -还可以顺带设置一下Wsl2开机启动和自动开始ssh服务 +还可以顺带设置一下 Wsl2 开机启动和自动开始 ssh 服务 diff --git a/docs/Blog/Environment/wsl_cuda.md b/docs/Blog/Environment/wsl_cuda.md index 0255bf1c..8b4418f6 100644 --- a/docs/Blog/Environment/wsl_cuda.md +++ b/docs/Blog/Environment/wsl_cuda.md @@ -1,18 +1,18 @@ --- comments: true --- -# 在WSL2上启用CUDA +# 在 WSL2 上启用 CUDA !!! info "主要是参考了[:octicons-link-16:这篇文章](https://zhuanlan.zhihu.com/p/506477744)" -## 1.在Windows上安装显卡驱动 -这步很简单,在[:octicons-link-16:官网](https://www.nvidia.com/Download/index.aspx?lang=en-us)上找到适合自己显卡的版本就好了。 -Download Type选项选Game Ready Driver就好。 -想要查看自己电脑显卡型号,可以先win+R,输入dxdiag,选择dispaly就可以看到了。 +## 1.在 Windows 上安装显卡驱动 +这步很简单,在[:octicons-link-16:官网](https://www.nvidia.com/Download/index.aspx?lang=en-us)上找到适合自己显卡的版本就好了。 +Download Type 选项选 Game Ready Driver 就好。 +想要查看自己电脑显卡型号,可以先 win+R,输入 dxdiag,选择 dispaly 就可以看到了。 -## 2.在wsl上安装驱动 -上一步结束之后`torch.cuda.is_available()`就已经True了,但直接执行还是会报错。 -启动wsl,执行以下命令 +## 2.在 wsl 上安装驱动 +上一步结束之后`torch.cuda.is_available()`就已经 True 了,但直接执行还是会报错。 +启动 wsl,执行以下命令 ```bash wget https://developer.download.nvidia.com/compute/cuda/repos/wsl-ubuntu/x86_64/cuda-wsl-ubuntu.pin sudo mv cuda-wsl-ubuntu.pin /etc/apt/preferences.d/cuda-repository-pin-600 @@ -22,22 +22,22 @@ sudo apt-key add /var/cuda-repo-wsl-ubuntu-11-4-local/7fa2af80.pub apt-get update sudo apt-get -y install cuda ``` -有些安装比较慢,没有换过源的可以换下国内镜像,可以用[:octicons-link-16:浙大源](http://mirrors.zju.edu.cn/) +有些安装比较慢,没有换过源的可以换下国内镜像,可以用[:octicons-link-16:浙大源](http://mirrors.zju.edu.cn/) -笔者在上面的命令执行中还遇到一个问题,最后一步报错liburcu6没有安装。 -可以在[:octicons-link-16:官方软件源](https://packages.debian.org/bullseye/liburcu6)上可以下载,浏览器可能提示下载不安全。如果可以的话,选择合适的版本下载。用`cat /proc/version` 查看我们系统的版本,x86_64用amd64即可。 -如果无法解决,可以用[:octicons-link-16:这里](https://askubuntu.com/questions/1407962/unable-to-install-cuda-on-ubuntu-22-04-wsl2)的方法,使用命令: +笔者在上面的命令执行中还遇到一个问题,最后一步报错 liburcu6 没有安装。 +可以在[:octicons-link-16:官方软件源](https://packages.debian.org/bullseye/liburcu6)上可以下载,浏览器可能提示下载不安全。如果可以的话,选择合适的版本下载。用`cat /proc/version` 查看我们系统的版本,x86_64 用 amd64 即可。 +如果无法解决,可以用[:octicons-link-16:这里](https://askubuntu.com/questions/1407962/unable-to-install-cuda-on-ubuntu-22-04-wsl2)的方法,使用命令: ```bash sudo add-apt-repository ppa:cloudhan/liburcu6 sudo apt update sudo apt install liburcu6 ``` -第一条命令似乎需要科学上网,我没开的时候连接超时了。 -随后就可以继续上一步的安装cuda了。安装完毕后用nvidia-smi命令查看是否成功。 +第一条命令似乎需要科学上网,我没开的时候连接超时了。 +随后就可以继续上一步的安装 cuda 了。安装完毕后用 nvidia-smi 命令查看是否成功。 -此时仍然不能直接使用cuda,需要再安装nvcc,直接下载就好了。 +此时仍然不能直接使用 cuda,需要再安装 nvcc,直接下载就好了。 至此安装结束。 - \ No newline at end of file + diff --git a/docs/Blog/Environment/zsh_arg.md b/docs/Blog/Environment/zsh_arg.md index a730ac6f..f1d094f8 100644 --- a/docs/Blog/Environment/zsh_arg.md +++ b/docs/Blog/Environment/zsh_arg.md @@ -1,9 +1,9 @@ --- comments: true --- -# ZSH的参数传递 +# ZSH 的参数传递 -今天在调用DDPM模型的时候使用[:octicons-link-16:官方代码](https://github.com/openai/guided-diffusion),竟然报错说参数不存在: +今天在调用 DDPM 模型的时候使用[:octicons-link-16:官方代码](https://github.com/openai/guided-diffusion),竟然报错说参数不存在: 命令是 ```bash MODEL_FLAGS="--attention_resolutions 32,16,8 --class_cond True --diffusion_steps 1000 --dropout 0.1 --image_size 64 --learn_sigma True --noise_schedule cosine --num_channels 192 --num_head_channels 64 --num_res_blocks 3 --resblock_updown True --use_new_attention_order True --use_fp16 True --use_scale_shift_norm True" @@ -33,7 +33,7 @@ usage: classifier_sample.py [-h] [--clip_denoised CLIP_DENOISED] [--num_samples [--classifier_pool CLASSIFIER_POOL] classifier_sample.py: error: unrecognized arguments: --attention_resolutions 32,16,8 --class_cond True --diffusion_steps 1000 --dropout 0.1 --image_size 64 --learn_sigma True --noise_schedule cosine --num_channels 192 --num_head_channels 64 --num_res_blocks 3 --resblock_updown True --use_new_attention_order True --use_fp16 True --use_scale_shift_norm True ``` -貌似是因为用这种方式传递的参数不会被按空格分开,所以无法识别 -我还试过换用bash,或者是使用`"$FLAG"`,都没用😡 +貌似是因为用这种方式传递的参数不会被按空格分开,所以无法识别 +我还试过换用 bash,或者是使用`"$FLAG"`,都没用😡 -解决的办法是使用`$=FLAG` (可以参考[:octicons-link-16:这篇解答](https://unix.stackexchange.com/questions/26661/what-is-word-splitting-why-is-it-important-in-shell-programming)) \ No newline at end of file +解决的办法是使用`$=FLAG` (可以参考[:octicons-link-16:这篇解答](https://unix.stackexchange.com/questions/26661/what-is-word-splitting-why-is-it-important-in-shell-programming)) diff --git a/docs/Blog/Fun/Women_and_prototype.md b/docs/Blog/Fun/Women_and_prototype.md index 50caada1..ca332d05 100644 --- a/docs/Blog/Fun/Women_and_prototype.md +++ b/docs/Blog/Fun/Women_and_prototype.md @@ -3,18 +3,18 @@ comments: true --- # 原型 -妇女节将至,我看见了一篇讨论妇女节这个名称的[:octicons-link-16:文章](https://mp.weixin.qq.com/s/yuGoPszsDpBs6GPdw52AOQ)。这篇文章并不讨论妇女权益,它讨论大家为什么不喜欢被称作妇女。 +妇女节将至,我看见了一篇讨论妇女节这个名称的[:octicons-link-16:文章](https://mp.weixin.qq.com/s/yuGoPszsDpBs6GPdw52AOQ)。这篇文章并不讨论妇女权益,它讨论大家为什么不喜欢被称作妇女。 -这样子描述这个问题,它其实很显然,不是吗,大家通常用妇女这个词指代的是中年及以上的女性,这些女性也常被我们称做:大妈。这一典型的使用场景构成了大家对这一词语使用的主要印象(即文中的原型),所以许多女性不喜欢被这么称呼。 +这样子描述这个问题,它其实很显然,不是吗,大家通常用妇女这个词指代的是中年及以上的女性,这些女性也常被我们称做:大妈。这一典型的使用场景构成了大家对这一词语使用的主要印象(即文中的原型),所以许多女性不喜欢被这么称呼。 !!! tip "冷知识" - 在我国,大于等于14岁周岁的女性就可被称为妇女。 + 在我国,大于等于 14 岁周岁的女性就可被称为妇女。 -这是很直白有力的解释,文章把它抽象到了理论的层面:原型。就像我们一说水果就最先想到苹果,我们判断一个东西是不是水果事比较它与苹果、柑橘、梨的异同点,所以这些概念是我们的认知原型,而非抽象的属性或是定义。 +这是很直白有力的解释,文章把它抽象到了理论的层面:原型。就像我们一说水果就最先想到苹果,我们判断一个东西是不是水果事比较它与苹果、柑橘、梨的异同点,所以这些概念是我们的认知原型,而非抽象的属性或是定义。 -原型的理解方式很有用,或者起码说很有趣,如果说我们对认知这件事有个原型的话,那么这个原型更可能是概念定义而非原型。我想在很多场景下使用这种方式是有益的,我们可以选择多个不那么相近的原型作为锚点来帮助我们有个更全面的认知,我在下面会详细阐述这点。 +原型的理解方式很有用,或者起码说很有趣,如果说我们对认知这件事有个原型的话,那么这个原型更可能是概念定义而非原型。我想在很多场景下使用这种方式是有益的,我们可以选择多个不那么相近的原型作为锚点来帮助我们有个更全面的认知,我在下面会详细阐述这点。 -原文还用色谱做类比来说明概念不是离散的,而是连续的,就像一个东西跟苹果的相似度不只有1,0.可以有0.314之类的。我清晰地记得原文中提到了色谱,但我却回想不起来他是怎么把色谱和原型联系到一起的。我又回去看了一遍,大概的感觉是:他通过色谱和色卡的类比来反驳概念的定义认知形式,这里概念的定义认知类比色卡,相应的原型认知对应色谱,色卡不符合实际,我们抛弃,好的,那么原型跟色谱的类比相似在何处呢,感觉没有说的很清楚。 +原文还用色谱做类比来说明概念不是离散的,而是连续的,就像一个东西跟苹果的相似度不只有 1,0.可以有 0.314 之类的。我清晰地记得原文中提到了色谱,但我却回想不起来他是怎么把色谱和原型联系到一起的。我又回去看了一遍,大概的感觉是:他通过色谱和色卡的类比来反驳概念的定义认知形式,这里概念的定义认知类比色卡,相应的原型认知对应色谱,色卡不符合实际,我们抛弃,好的,那么原型跟色谱的类比相似在何处呢,感觉没有说的很清楚。 -我认为是相似的,我愿意举个例子解释,我先前用过相似的解释方法,不是色谱,是光谱,这类使用是这样的:比如我说在这件事上我们完全考虑功利的话,我们的行为是这样的,我们会考虑这些利益;如果我们完全考虑感性,那么我们会这样,我们会做哪些感性判断。但实际上我们的决定总不在这两个极端情况,而是在他们中间一段连续而暧昧的条带上的,我们通过比较他们与双方的异同来大概确定他们的位置。这样一种使用的出现常常是因为某类辩题开始讨论利大于弊了,什么大于什么了,这时候建立原型放在两端,通过比较异同拉起一条连续的线,就是我们搭建起的光谱。正如我们从400nm-700nm间拉起连续的光谱,并根据波长排列。 +我认为是相似的,我愿意举个例子解释,我先前用过相似的解释方法,不是色谱,是光谱,这类使用是这样的:比如我说在这件事上我们完全考虑功利的话,我们的行为是这样的,我们会考虑这些利益;如果我们完全考虑感性,那么我们会这样,我们会做哪些感性判断。但实际上我们的决定总不在这两个极端情况,而是在他们中间一段连续而暧昧的条带上的,我们通过比较他们与双方的异同来大概确定他们的位置。这样一种使用的出现常常是因为某类辩题开始讨论利大于弊了,什么大于什么了,这时候建立原型放在两端,通过比较异同拉起一条连续的线,就是我们搭建起的光谱。正如我们从 400nm-700nm 间拉起连续的光谱,并根据波长排列。 -最后作者提出妇女节作为女性争取权益的代表节日,可以改名为女性节之类的。其实我的感觉上,妇女这个词的使用场景正在收窄,现在提到妇女,我很容易联想到权益这个词了。也许全社会能在默默的努力下改变妇女这个词的原型呢?另一方面是对于女性这个词,我感觉其原型还是一种更侧重于分类的使用,并不与权益、进步有联系。但是如果叫国际劳动妇女节之类的一下就有进步感了(笑)。 \ No newline at end of file +最后作者提出妇女节作为女性争取权益的代表节日,可以改名为女性节之类的。其实我的感觉上,妇女这个词的使用场景正在收窄,现在提到妇女,我很容易联想到权益这个词了。也许全社会能在默默的努力下改变妇女这个词的原型呢?另一方面是对于女性这个词,我感觉其原型还是一种更侧重于分类的使用,并不与权益、进步有联系。但是如果叫国际劳动妇女节之类的一下就有进步感了(笑)。 diff --git a/docs/Blog/Fun/index.md b/docs/Blog/Fun/index.md index 09a3013d..76b4ff69 100644 --- a/docs/Blog/Fun/index.md +++ b/docs/Blog/Fun/index.md @@ -4,4 +4,4 @@ comments: true # Just for fun! !!! abstract - 在这里会记录一些好玩的想法捏😋 \ No newline at end of file + 在这里会记录一些好玩的想法捏😋 diff --git a/docs/Blog/Labs/CN_lab2.md b/docs/Blog/Labs/CN_lab2.md index 49ba34d7..c4b3f8be 100644 --- a/docs/Blog/Labs/CN_lab2.md +++ b/docs/Blog/Labs/CN_lab2.md @@ -5,80 +5,80 @@ comments: true # 计算机网络 - lab2 !!! info "基本信息" - 实验时间: 2023年秋冬 + 实验时间:2023 年秋冬 - 实验报告模板: [:octicons-file-16:]() + 实验报告模板:[:octicons-file-16:]() - 往期参考: [:octicons-file-16:](https://github.com/QSCTech/zju-icicles/raw/master/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BD%91%E7%BB%9C/Lab/Lab2-%E4%BD%BF%E7%94%A8%E4%BA%8C%E5%B1%82%E4%BA%A4%E6%8D%A2%E6%9C%BA%E7%BB%84%E7%BD%91/Lab2-%E4%BD%BF%E7%94%A8%E4%BA%8C%E5%B1%82%E4%BA%A4%E6%8D%A2%E6%9C%BA%E7%BB%84%E7%BD%91.doc) (来自浙江大学课程共享计划) + 往期参考:[:octicons-file-16:](https://github.com/QSCTech/zju-icicles/raw/master/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BD%91%E7%BB%9C/Lab/Lab2-%E4%BD%BF%E7%94%A8%E4%BA%8C%E5%B1%82%E4%BA%A4%E6%8D%A2%E6%9C%BA%E7%BB%84%E7%BD%91/Lab2-%E4%BD%BF%E7%94%A8%E4%BA%8C%E5%B1%82%E4%BA%A4%E6%8D%A2%E6%9C%BA%E7%BB%84%E7%BD%91.doc) (来自浙江大学课程共享计划) - 指导老师: 黄正谦 + 指导老师:黄正谦 -因为这个实验做的时候几乎没什么指导,只有一个神秘的文档,一整个实验室的线和一箱子的神秘机器 +因为这个实验做的时候几乎没什么指导,只有一个神秘的文档,一整个实验室的线和一箱子的神秘机器 ## 认识实验室的仪器 -果咩那塞这里没有照片,但是比较关键的几个设备的外观都会大概描述一下: +果咩那塞这里没有照片,但是比较关键的几个设备的外观都会大概描述一下: === "交换机" - 正面有很多端口,没有开关键,正面有mode键 + 正面有很多端口,没有开关键,正面有 mode 键 === "路由器" - 暂时用不到,比起交换机端口没那么多,有开关键 + 暂时用不到,比起交换机端口没那么多,有开关键 === "网线" - 实验室里看起来是网线的基本就是网线(废话), - - 比较特殊的事如果两端透明头内部的线的颜色顺序不一样,那就是交叉网线. - - 如果一根扁扁的淡蓝色的,另一端是串口的线,那个是拿来连console和PC的. + 实验室里看起来是网线的基本就是网线(废话), + + 比较特殊的事如果两端透明头内部的线的颜色顺序不一样,那就是交叉网线。 + + 如果一根扁扁的淡蓝色的,另一端是串口的线,那个是拿来连 console 和 PC 的。 === "PC" - 机箱里上方连着摆了四台PC,一般从上往下标号1-4 + 机箱里上方连着摆了四台 PC,一般从上往下标号 1-4 - 开机方式很迷,我是按F1然后退出,感觉肯定不是正常途径 + 开机方式很迷,我是按 F1 然后退出,感觉肯定不是正常途径 === "显示屏和键盘" - 最下面摆着的显示屏和键盘,通过按键选择可以连接到不同的PC,顺着显示屏的线往后可以看到四台PC在后面是插到了1-4口上的(我当时是没有PC4,有PC5插在5上面,我给改插到4了) + 最下面摆着的显示屏和键盘,通过按键选择可以连接到不同的 PC,顺着显示屏的线往后可以看到四台 PC 在后面是插到了 1-4 口上的(我当时是没有 PC4,有 PC5 插在 5 上面,我给改插到 4 了) ## 起步 -其实也就起步是最难的,后面基本就按照文档来做就是. +其实也就起步是最难的,后面基本就按照文档来做就是。 ### 连不上交换机 -连接交换机要做的有: +连接交换机要做的有: -- 用前文提到的串口-网口线来连接某PC和交换机的console、 -- 切换到那台PC, 打开桌面上的putty, 选择serial,默认速率9600即可,启动 -- 狂按回车, 出现命令行提示符就成功了,没反应用手扶一下console看一下插紧了没有 +- 用前文提到的串口-网口线来连接某 PC 和交换机的 console、 +- 切换到那台 PC, 打开桌面上的 putty, 选择 serial,默认速率 9600 即可,启动 +- 狂按回车,出现命令行提示符就成功了,没反应用手扶一下 console 看一下插紧了没有 -就我而言,机箱里的下面的一台交换机是死活连不上,最后试了半天是上面的另一台交换机用手扶稳了可以上. +就我而言,机箱里的下面的一台交换机是死活连不上,最后试了半天是上面的另一台交换机用手扶稳了可以上。 -如果你试了很多都不行的话,可以在实验室里溜达一圈多摸几个交换机回来.我们第二次摸了两台白色的小小的交换机来用. +如果你试了很多都不行的话,可以在实验室里溜达一圈多摸几个交换机回来.我们第二次摸了两台白色的小小的交换机来用。 ### 交换机密码 -我们摸来的两台交换机都要求enable密码,重置密码的方法摸的比较熟了,注意适用的是小型白色交换机,正面型号写着C3560 -步骤: +我们摸来的两台交换机都要求 enable 密码,重置密码的方法摸的比较熟了,注意适用的是小型白色交换机,正面型号写着 C3560 +步骤: -- 连接console和PC,打开putty,断电 -- 长按mode键,上电 -- 继续按mode,等待,putty上应该陆续有初始化的输出了,眼尖的还能看到password recovery mechanism is enabled,看到这句话继续按 -- 继续按mode直到屏幕上出现switch: 提示符和两个选项(flash_init, boot) +- 连接 console 和 PC,打开 putty,断电 +- 长按 mode 键,上电 +- 继续按 mode,等待,putty 上应该陆续有初始化的输出了,眼尖的还能看到 password recovery mechanism is enabled,看到这句话继续按 +- 继续按 mode 直到屏幕上出现 switch: 提示符和两个选项(flash_init, boot) - 先`flash_init`,然后`ren flash:config.text flash:config.old`,然后`boot` -- 等待重启,注意到差不多完了会让按回车确认,按完有个是否进入初始化配置,输入no +- 等待重启,注意到差不多完了会让按回车确认,按完有个是否进入初始化配置,输入 no - 重置成功 -### 设定PC的IP +### 设定 PC 的 IP -实验开始前我们要查看各PC的IP,`win + R`,输入cmd打开命令行,输入`ipconfig`就能看到ip了,没有的话检查连接,看看信号灯变绿了没有. +实验开始前我们要查看各 PC 的 IP,`win + R`,输入 cmd 打开命令行,输入`ipconfig`就能看到 ip 了,没有的话检查连接,看看信号灯变绿了没有。 -一般而言PC的IP都挺正常的,互相之间都通(比较正常的IP 10.0.0.13 10.0.1.13 10.0.2.13 10.0.3.13 他们显然都通) +一般而言 PC 的 IP 都挺正常的,互相之间都通(比较正常的 IP 10.0.0.13 10.0.1.13 10.0.2.13 10.0.3.13 他们显然都通) -然而我当时两个PC是10开头两个是192开头,不通,需要手动设定 +然而我当时两个 PC 是 10 开头两个是 192 开头,不通,需要手动设定 -这时候千万别去putty里面敲命令设置,我这么搞四台PC全断联了,要在windows的控制面板里设置,具体步骤网上都有,要把四台放到同一网段. +这时候千万别去 putty 里面敲命令设置,我这么搞四台 PC 全断联了,要在 windows 的控制面板里设置,具体步骤网上都有,要把四台放到同一网段。 !!! warning "恭喜" - 接下来就可以跟着文档一步步走完实验了. + 接下来就可以跟着文档一步步走完实验了。 diff --git a/docs/Blog/Labs/OS_lab3.md b/docs/Blog/Labs/OS_lab3.md index 5f5fd31b..797549f1 100644 --- a/docs/Blog/Labs/OS_lab3.md +++ b/docs/Blog/Labs/OS_lab3.md @@ -5,35 +5,35 @@ comments: true # 操作系统 - lab3 !!! info "基本信息" - 时间:2023秋冬 - - 实验文档:[:octicons-book-16:](https://zju-sec.github.io/os23fall-stu/lab3/) + 时间:2023 秋冬 -??? warning "为什么是从lab3开始?" + 实验文档:[:octicons-book-16:](https://zju-sec.github.io/os23fall-stu/lab3/) + +??? warning "为什么是从 lab3 开始?" 我也不知道 -Lab3的虚拟内存还是需要调一调的,本文只会high level的讲一点思想,如果实在想不明白可以参考.有问题也欢迎提出! +Lab3 的虚拟内存还是需要调一调的,本文只会 high level 的讲一点思想,如果实在想不明白可以参考.有问题也欢迎提出! ## 初步启用虚拟内存 -启用虚拟内存,在本实验的语境下,其实就是设置satp寄存器的那一下.在此之前,我们得先搞一个页表出来. +启用虚拟内存,在本实验的语境下,其实就是设置 satp 寄存器的那一下.在此之前,我们得先搞一个页表出来。 -注意到我们写satp的那一步只是一个`csrw`,所以这句话结束后我们启用了虚拟内存并且将要继续去PC+4执行下一条指令,所以PC+4这个地址在虚拟内存中该怎么被正确的处理就是个问题,这个问题就是思考题所关心的. +注意到我们写 satp 的那一步只是一个`csrw`,所以这句话结束后我们启用了虚拟内存并且将要继续去 PC+4 执行下一条指令,所以 PC+4 这个地址在虚拟内存中该怎么被正确的处理就是个问题,这个问题就是思考题所关心的。 ??? info "为什么在这一步中我们启用的页表是一级的" - 文档中其实已经有链接指向了解释这一点的文档,具体而言,是这段描述转化虚拟内存的过程的[:octicons-book-16:手册](https://www.five-embeddev.com/riscv-isa-manual/latest/supervisor.html#sv32algorithm) + 文档中其实已经有链接指向了解释这一点的文档,具体而言,是这段描述转化虚拟内存的过程的[:octicons-book-16:手册](https://www.five-embeddev.com/riscv-isa-manual/latest/supervisor.html#sv32algorithm) - 仔细阅读,其中第四点提到若当前页表项的权限表明了可读或者可执行,那么就会直接跳走,当作是最后一级,否则才会把它当作某一级的页表 + 仔细阅读,其中第四点提到若当前页表项的权限表明了可读或者可执行,那么就会直接跳走,当作是最后一级,否则才会把它当作某一级的页表 !!! bug - 当我们按照文档修改了链接文件后,我们gdb中直接用符号来打断点之类的操作就都是按照修改了链接文件之后的虚拟地址了,所以启用虚拟内存之前为了在正确的物理地址打断点,需要手动输入地址. + 当我们按照文档修改了链接文件后,我们 gdb 中直接用符号来打断点之类的操作就都是按照修改了链接文件之后的虚拟地址了,所以启用虚拟内存之前为了在正确的物理地址打断点,需要手动输入地址。 ## 完全启用虚拟内存 -这一步我们将使用多级页表并且分级进行权限设置.主要就是设置一个写入页表的函数,并且调用该函数来分权限填写页表. +这一步我们将使用多级页表并且分级进行权限设置.主要就是设置一个写入页表的函数,并且调用该函数来分权限填写页表。 -时刻注意什么地方要填物理地址,什么地方要用虚拟地址.在页表中,我们要填物理地址. +时刻注意什么地方要填物理地址,什么地方要用虚拟地址.在页表中,我们要填物理地址。 !!! bug - 如果你跟我一样改完页表没事,但是一刷新tlb就寄了.与我的经验而言,是页表写的有问题. + 如果你跟我一样改完页表没事,但是一刷新 tlb 就寄了.与我的经验而言,是页表写的有问题。 diff --git a/docs/Blog/Labs/docker_minisql.md b/docs/Blog/Labs/docker_minisql.md index db9facc7..cc6e0e27 100644 --- a/docs/Blog/Labs/docker_minisql.md +++ b/docs/Blog/Labs/docker_minisql.md @@ -2,75 +2,75 @@ comments: true --- -# 用Docker搭建minisql环境 +# 用 Docker 搭建 minisql 环境 -!!! abstract - 一个简易的教程来介绍如何在MacOS上用docker搭建minisql环境,那么有人要问了,为什么不直接本地部署呢。 +!!! abstract + 一个简易的教程来介绍如何在 MacOS 上用 docker 搭建 minisql 环境,那么有人要问了,为什么不直接本地部署呢。 我也想本地部署啊,但是编译起来破事太多了😅,索性试一种跨平台的方案。 !!! info "环境" - MacOS: Ventura 13.4.1 - Docker: 4.16.2 - Ubuntu: 20.04 + MacOS: Ventura 13.4.1 + Docker: 4.16.2 + Ubuntu: 20.04 ## 1.启动容器 -### 1.1下载Docker -首先你要有docker软件,先去官网下一个。 +### 1.1 下载 Docker +首先你要有 docker 软件,先去官网下一个。 -### 1.2拉取镜像 -启动docker软件。来到命令行中输入以下命令来拉取ubuntu:20.04镜像(minisql当前推荐部署在ubuntu:20.04): +### 1.2 拉取镜像 +启动 docker 软件。来到命令行中输入以下命令来拉取 ubuntu:20.04 镜像(minisql 当前推荐部署在 ubuntu:20.04): ```bash docker pull ubuntu:20.04 ``` ??? info "镜像" - 镜像(Image)是一个静态的、只读的文件,它包含了操作系统、文件系统和应用程序的所有文件和设置。镜像是构建容器的基础,可以看作是一个模板或者蓝图。镜像是通过Dockerfile文件定义和构建的,Dockerfile中包含了一系列指令和配置,用于创建镜像。镜像可以存储在Docker Registry中,可以通过镜像名称和标签来唯一标识。镜像是不可修改的,如果需要对镜像进行更改,需要重新构建一个新的镜像。 + 镜像(Image)是一个静态的、只读的文件,它包含了操作系统、文件系统和应用程序的所有文件和设置。镜像是构建容器的基础,可以看作是一个模板或者蓝图。镜像是通过 Dockerfile 文件定义和构建的,Dockerfile 中包含了一系列指令和配置,用于创建镜像。镜像可以存储在 Docker Registry 中,可以通过镜像名称和标签来唯一标识。镜像是不可修改的,如果需要对镜像进行更改,需要重新构建一个新的镜像。 === "docker images" 使用`docker images`命令查看当前已有的镜像列表。这将显示所有已下载和构建的镜像,以及它们的相关信息,如镜像 ID、名称、标签、大小等。![](images/docker_minisql/2023-07-01-17-34-32.png#pic) === "docker pull" - 使用`docker pull`命令从Docker Registry中拉取镜像。如果不指定标签,默认拉取latest标签的镜像。例如,`docker pull ubuntu:20.04`将拉取Ubuntu 20.04镜像。 + 使用`docker pull`命令从 Docker Registry 中拉取镜像。如果不指定标签,默认拉取 latest 标签的镜像。例如,`docker pull ubuntu:20.04`将拉取 Ubuntu 20.04 镜像。 === "docker rmi" - 使用`docker rmi`命令删除镜像。例如,`docker rmi ubuntu:20.04`将删除Ubuntu 20.04镜像,这里也可以使用ID指定要删除的镜像。 + 使用`docker rmi`命令删除镜像。例如,`docker rmi ubuntu:20.04`将删除 Ubuntu 20.04 镜像,这里也可以使用 ID 指定要删除的镜像。 -### 1.3启动容器 -用`docker run`启动一个容器,参数`-it`表示启动完后直接启动容器的终端以供操作,`-p`表示端口映射,这里把loclahost:2333映射为容器的22号端口,`--name`后接容器名字,`ubuntu:20.04`表示使用的镜像。 +### 1.3 启动容器 +用`docker run`启动一个容器,参数`-it`表示启动完后直接启动容器的终端以供操作,`-p`表示端口映射,这里把 loclahost:2333 映射为容器的 22 号端口,`--name`后接容器名字,`ubuntu:20.04`表示使用的镜像。 ```bash docker run -it -p 2333:22 --name minisql ubuntu:20.04 ``` -执行完命令应看到我们以root用户进入了容器的终端: +执行完命令应看到我们以 root 用户进入了容器的终端: ![](images/docker_minisql/2023-07-01-19-33-57.png#pic) ??? info "端口映射" 端口映射是一种将主机(宿主机)端口与容器内部端口进行绑定的技术。它允许从主机上的特定端口访问容器内运行的服务或应用程序。 - 在Docker中,通过使用`-p`或`--publish`参数来进行端口映射。参数的格式为主机端口:容器端口,其中主机端口是您希望在主机上暴露的端口号,容器端口是容器内部正在运行的服务所监听的端口号。 + 在 Docker 中,通过使用`-p`或`--publish`参数来进行端口映射。参数的格式为主机端口:容器端口,其中主机端口是您希望在主机上暴露的端口号,容器端口是容器内部正在运行的服务所监听的端口号。 - `docker run -it -p 2333:22 --name minisql ubuntu:20.04`命令将主机的2333端口映射到容器的22号端口。这意味着主机上的任何请求发送到2333端口时,将被转发到容器的22号端口,22号端口是SSH使用的默认端口。因此,可以通过访问主机的2333端口来访问容器内部运行的SSH服务,以便进行远程连接和操作。 + `docker run -it -p 2333:22 --name minisql ubuntu:20.04`命令将主机的 2333 端口映射到容器的 22 号端口。这意味着主机上的任何请求发送到 2333 端口时,将被转发到容器的 22 号端口,22 号端口是 SSH 使用的默认端口。因此,可以通过访问主机的 2333 端口来访问容器内部运行的 SSH 服务,以便进行远程连接和操作。 ## 2.环境初步设置 -### 2.1(可选)换源 +### 2.1(可选)换源 ??? warning "可能存在的问题" 有时候直接换源会遇到报错: ![](images/docker_minisql/2023-07-01-19-42-06.png#pic) - 这需要我们先使用http,运行如下命令换http源: + 这需要我们先使用 http,运行如下命令换 http 源: ```bash - echo " + echo " deb http://mirrors.zju.edu.cn/ubuntu/ focal main restricted universe multiverse deb http://mirrors.zju.edu.cn/ubuntu/ focal-updates main restricted universe multiverse deb http://mirrors.zju.edu.cn/ubuntu/ focal-backports main restricted universe multiverse deb http://mirrors.zju.edu.cn/ubuntu/ focal-security main restricted universe multiverse " > /etc/apt/sources.list ``` - 这就可以进行下一步了,如果你希望在之后换回https源,那么在执行完2.2后,需要先 + 这就可以进行下一步了,如果你希望在之后换回 https 源,那么在执行完 2.2 后,需要先 更新证书: ```bash apt install --reinstall ca-certificates ``` - 换回https源: + 换回 https 源: ```bash echo " deb https://mirrors.zju.edu.cn/ubuntu/ focal main restricted universe multiverse @@ -79,16 +79,16 @@ docker run -it -p 2333:22 --name minisql ubuntu:20.04 deb https://mirrors.zju.edu.cn/ubuntu/ focal-security main restricted universe multiverse " > /etc/apt/sources.list ``` - 再次更新apt: + 再次更新 apt: ```bash apt update apt upgrade ``` - 即可(该方法来自[:octicons-link-16:此博客](https://blog.csdn.net/Chaowanq/article/details/121559709)) + 即可(该方法来自[:octicons-link-16:此博客](https://blog.csdn.net/Chaowanq/article/details/121559709)) 直接执行命令即可 ```bash cp /etc/apt/sources.list /etc/apt/sources.list.bak -echo " +echo " deb https://mirrors.zju.edu.cn/ubuntu/ focal main restricted universe multiverse deb https://mirrors.zju.edu.cn/ubuntu/ focal-updates main restricted universe multiverse deb https://mirrors.zju.edu.cn/ubuntu/ focal-backports main restricted universe multiverse @@ -100,8 +100,8 @@ echo " 更换软件包源的具体方法会因不同的操作系统和软件包管理工具而有所差异。在基于 Ubuntu 的 Docker 容器中,可以编辑 /etc/apt/sources.list 文件,将默认的软件包源替换为国内的镜像源,如浙江大学、清华大学等。这样一来,通过容器中的 `apt-get` 或 `apt` 命令安装软件时,将从国内镜像源下载软件包,提高速度和稳定性。 -### 2.2安装必要工具 -首先更新apt +### 2.2 安装必要工具 +首先更新 apt ```bash apt update apt upgrade @@ -112,27 +112,27 @@ apt upgrade apt install openssh-server vim git cmake gcc g++ gdb sudo ``` -## 3.配置SSH,使用VSCode开发 +## 3.配置 SSH,使用 VSCode 开发 ### 3.1(可选)创建用户 -如果希望用非root用户登陆,那么我们可以先创建并设置一个用户: +如果希望用非 root 用户登陆,那么我们可以先创建并设置一个用户: ```bash useradd -m stormckey passwd stormckey ``` -这里的stormckey换成你自己起的用户名 +这里的 stormckey 换成你自己起的用户名 -给用户添加sudo权限,需要在`/etc/sudoers`文件中`# User privilege specification`添加: +给用户添加 sudo 权限,需要在`/etc/sudoers`文件中`# User privilege specification`添加: ![](images/docker_minisql/2023-07-01-21-25-52.png#pic) -### 3.2配置免密登陆 -来到远程连接的发起者端(这里就是宿主机),执行下面命令生成密钥,输入paseephrase时直接回车(为空) +### 3.2 配置免密登陆 +来到远程连接的发起者端(这里就是宿主机),执行下面命令生成密钥,输入 paseephrase 时直接回车(为空) ```bash ssh-keygen ``` -来到提示的目录下,复制id_rsa.pub的内容,将它写入被连接端(这里是容器)的`/home/stormckey/.ssh/authorized_keys`文件中 +来到提示的目录下,复制 id_rsa.pub 的内容,将它写入被连接端(这里是容器)的`/home/stormckey/.ssh/authorized_keys`文件中 ??? info "另一种更方便的方案" 在可以用密码登录了之后,可以用`ssh-copy-id`命令一键把密钥放置到服务器并做好相应的设置 ```bash @@ -140,29 +140,29 @@ ssh-keygen ``` -接着配置容器的sshd: +接着配置容器的 sshd: `vim /etc/ssh/sshd_config` 去掉以下的注释: ![](images/docker_minisql/2023-07-01-20-23-02.png#pic) ![](images/docker_minisql/2023-07-01-20-23-44.png#pic) -注意第二张图中的文件一定是你之前放公钥的文件,路径从用户根目录开始 +注意第二张图中的文件一定是你之前放公钥的文件,路径从用户根目录开始 -更改完配置后启动/重启sshd +更改完配置后启动/重启 sshd ```bash service ssh start ``` -我们最好把自动启动ssh服务加入bashrc,这样启动容器的时候就会自动启动ssh服务了 +我们最好把自动启动 ssh 服务加入 bashrc,这样启动容器的时候就会自动启动 ssh 服务了 ```bash echo "service ssh start" >> /root/.bashrc ``` -此时你在宿主机上就可以通过`ssh stormckey@localhost -p 2333`登陆容器了: +此时你在宿主机上就可以通过`ssh stormckey@localhost -p 2333`登陆容器了: ![](images/docker_minisql/2023-07-01-20-42-07.png#pic) -### 3.3配置VSCode +### 3.3 配置 VSCode -下载插件Remote-SSH插件,点击右边出现的插件图标,在侧栏中选择设置SSH: +下载插件 Remote-SSH 插件,点击右边出现的插件图标,在侧栏中选择设置 SSH: ![](images/docker_minisql/2023-07-01-20-43-59.png#pic) 写入如下的配置信息: @@ -171,7 +171,7 @@ echo "service ssh start" >> /root/.bashrc 连接! ![](images/docker_minisql/2023-07-01-20-45-37.png#pic) -此后就没有什么特别的了,打开终端直接按照助教的文档配置minisql即可。 +此后就没有什么特别的了,打开终端直接按照助教的文档配置 minisql 即可。 ![](images/docker_minisql/2023-07-01-20-52-01.png#pic) ## 4.更多设置 diff --git a/docs/Blog/Labs/index.md b/docs/Blog/Labs/index.md index 3b7e2d27..d0d1f169 100644 --- a/docs/Blog/Labs/index.md +++ b/docs/Blog/Labs/index.md @@ -4,4 +4,4 @@ comments: true # 实验记录📝 -计算机专业的学生怎么能没被lab折磨过,这里放的是一些实验中的踩坑记录或者是指南.如果有错误或者更好的方法欢迎在评论中指出! \ No newline at end of file +计算机专业的学生怎么能没被 lab 折磨过,这里放的是一些实验中的踩坑记录或者是指南.如果有错误或者更好的方法欢迎在评论中指出! diff --git a/docs/Blog/Minisql/index.md b/docs/Blog/Minisql/index.md index eafbedfa..21f8d1a0 100644 --- a/docs/Blog/Minisql/index.md +++ b/docs/Blog/Minisql/index.md @@ -4,19 +4,19 @@ commnets: true # Minisql -!!! abstract - Minisql是计算机科学与技术专业大二春夏的必修课数据库系统夏学期的大程。本博客记录了本人实现这一框架过程中遇到的问题和感想。 +!!! abstract + Minisql 是计算机科学与技术专业大二春夏的必修课数据库系统夏学期的大程。本博客记录了本人实现这一框架过程中遇到的问题和感想。 ## 简介 -很早就听说了Minisql的大名了,对于这个大二春夏到来的据说非常庞大的一个工程,我心里其实是既非常害怕又非常期待的,之前做的大程总感觉缺那么点意思,但到这里就感觉味对了(笑哭)。 +很早就听说了 Minisql 的大名了,对于这个大二春夏到来的据说非常庞大的一个工程,我心里其实是既非常害怕又非常期待的,之前做的大程总感觉缺那么点意思,但到这里就感觉味对了(笑哭)。 -这给项目是可以组队也可以单刷的,我选择了单刷完成,个人认为工作量是单人可以承担的,也比较推荐单人完成。一是很多模块只有自己上手写过了,debug过了才有真切的感受;二是我觉得很酷!😎 +这给项目是可以组队也可以单刷的,我选择了单刷完成,个人认为工作量是单人可以承担的,也比较推荐单人完成。一是很多模块只有自己上手写过了,debug 过了才有真切的感受;二是我觉得很酷!😎 ## 收获 -1. 练习巩固了oop和db,前者是因为这个项目都是用C++实现的。后者是因为这个项目很多部分都是把数据库理论应当用到实践中。 -2. 熟悉了大项目的框架,以及git,cmake等工具,都是很实用的工具(当然在项目中我们只保持最低限度的使用也是可以的,但是感兴趣的话完全可以趁这个机会熟悉起来) +1. 练习巩固了 oop 和 db,前者是因为这个项目都是用 C++实现的。后者是因为这个项目很多部分都是把数据库理论应当用到实践中。 +2. 熟悉了大项目的框架,以及 git,cmake 等工具,都是很实用的工具(当然在项目中我们只保持最低限度的使用也是可以的,但是感兴趣的话完全可以趁这个机会熟悉起来) 3. 熟悉了一些调试的技巧和好用的性能分析工具 4. 又被搭环境折磨了一遍,抗逆性提高了!😅 @@ -26,4 +26,4 @@ commnets: true 在具体实现的各部分的话,我主要是会介绍这些模块里面各个结构、函数在什么情境下应该被调用,被调用来做什么事,整个大的模块在做什么,以及如何优化。 -可以说和项目主页上的内容在倾向性上有一些重叠,但人家说过了我就尽量不再重复了,主要是从一个实现者的角度来讲困惑和理解的。 \ No newline at end of file +可以说和项目主页上的内容在倾向性上有一些重叠,但人家说过了我就尽量不再重复了,主要是从一个实现者的角度来讲困惑和理解的。 diff --git a/docs/Blog/Minisql/minisql_part0.md b/docs/Blog/Minisql/minisql_part0.md index 7ce67bf3..c5e90e9a 100644 --- a/docs/Blog/Minisql/minisql_part0.md +++ b/docs/Blog/Minisql/minisql_part0.md @@ -9,10 +9,10 @@ comments: true ## 初试:本地运行 -本人目前使用的的MacBookPro,MacOS Ventura13.3.1. 直说的话,本地运行的尝试失败了😅 +本人目前使用的的 MacBookPro,MacOS Ventura13.3.1. 直说的话,本地运行的尝试失败了😅 ### Cmake -第一个坑是cmake阶段 有如下的经典报错(经典是因为我见过他无数次了): +第一个坑是 cmake 阶段 有如下的经典报错(经典是因为我见过他无数次了): ```bash cmake .. ─╯ CMake Error at /Users/xxx/opt/anaconda3/lib/cmake/GTest/GTestTargets.cmake:37 (message): @@ -27,12 +27,12 @@ Call Stack (most recent call first): thirdparty/glog/CMakeLists.txt:71 (find_package) ``` -我不懂cmake,也搜不到这个问题,感觉可能跟版本兼容啥的有关(有知道的大佬可以直接在评论区里说说,感谢!)不过我看到了报错路径上了anaconda3,想起来我终端的环境还是conda base,所以我一个`conda deactivae`后,重建build目录,再cmake就没有这个问题了。 +我不懂 cmake,也搜不到这个问题,感觉可能跟版本兼容啥的有关(有知道的大佬可以直接在评论区里说说,感谢!)不过我看到了报错路径上了 anaconda3,想起来我终端的环境还是 conda base,所以我一个`conda deactivae`后,重建 build 目录,再 cmake 就没有这个问题了。 -但这个问题只是被暂时修复了算是,因为我调用VSCode的cmake插件啥的还是会这样,我也没找出来这里的要怎么解决。 +但这个问题只是被暂时修复了算是,因为我调用 VSCode 的 cmake 插件啥的还是会这样,我也没找出来这里的要怎么解决。 ### Make -Cmake通了 Make又不通😅 +Cmake 通了 Make 又不通😅 报错如下: ```bash In file included from /Users/xxx/Desktop/minisql/src/executor/execute_engine.cpp:1: @@ -48,14 +48,14 @@ In file included from /Library/Developer/CommandLineTools/SDKs/MacOSX13.3.sdk/us /Users/xxx/Desktop/minisql/test/include/utils/utils.h:24:41: note: in instantiation of template class 'std::uniform_int_distribution' requested here std::uniform_int_distribution uniform_dist(33, 122); ``` -看起来是框架里实例化模板的时候用的的char类型,但是这里不让用char类型,那怎么办,要我去改框架吗,这玩意万一耦合的很紧我的理解成本加修改成本估计都够我受的了。这里的两个选择一个是换个SDK版本,这个不知道能不能起效,另一个就是跑路,因为我还有一台Windows游戏本,所以果断润了。 +看起来是框架里实例化模板的时候用的的 char 类型,但是这里不让用 char 类型,那怎么办,要我去改框架吗,这玩意万一耦合的很紧我的理解成本加修改成本估计都够我受的了。这里的两个选择一个是换个 SDK 版本,这个不知道能不能起效,另一个就是跑路,因为我还有一台 Windows 游戏本,所以果断润了。 ## 二试:WSL2 -我的Win本早就装过WSL2了,之前跑一些模型的时候把ssh啥的也配好了(不过玉湖只能用动态IP我三天两头就得换一下😅),所以成本其实不大。 -这里遇到两个问题,一是cmake阶段跟上面一样的问题,解决方法还是`conda deactivate`,二是提示没有gflag模块,这个最简单,直接安装一下就好了 +我的 Win 本早就装过 WSL2 了,之前跑一些模型的时候把 ssh 啥的也配好了(不过玉湖只能用动态 IP 我三天两头就得换一下😅),所以成本其实不大。 +这里遇到两个问题,一是 cmake 阶段跟上面一样的问题,解决方法还是`conda deactivate`,二是提示没有 gflag 模块,这个最简单,直接安装一下就好了 ```bash sudo apt-get install gflags ``` -然后就能跑了,虽然在这里用各种Cmake插件一类的还是没一个能跑的(报Cmake阶段的那个错),我试图用Clion远程开发结果后端也崩坏了开不起来,各种事情搞得我很烦,但总算有个能用的VSCode + ssh + WSL2 的方案能跑了,他的优点是能跑,缺点是能跑的补集,但我实在折腾不动了就先这样了。 \ No newline at end of file +然后就能跑了,虽然在这里用各种 Cmake 插件一类的还是没一个能跑的(报 Cmake 阶段的那个错),我试图用 Clion 远程开发结果后端也崩坏了开不起来,各种事情搞得我很烦,但总算有个能用的 VSCode + ssh + WSL2 的方案能跑了,他的优点是能跑,缺点是能跑的补集,但我实在折腾不动了就先这样了。 diff --git a/docs/Blog/Minisql/minisql_part1.md b/docs/Blog/Minisql/minisql_part1.md index 008e949d..7a260094 100644 --- a/docs/Blog/Minisql/minisql_part1.md +++ b/docs/Blog/Minisql/minisql_part1.md @@ -2,19 +2,19 @@ commnets: true --- -# Minisql\#1 Disk and BufferPoolManager +# Minisql\#1 Disk and BufferPoolManager !!! abstract - 这一部分主要负责与内存磁盘空间申请释放等打交道,在项目中的地位大概相当于`new` `delete`,所以这一部分在后续会被频繁调用,也是直接与磁盘IO打交道的,实现既要求正确又要求效率 + 这一部分主要负责与内存磁盘空间申请释放等打交道,在项目中的地位大概相当于`new` `delete`,所以这一部分在后续会被频繁调用,也是直接与磁盘 IO 打交道的,实现既要求正确又要求效率 ### 动机 -假设我们手头上现在有65536(4096*16)页(一页为4096Bytes)的数据需要存在磁盘上,最自然的想法就是数组,实际上是变长数组,因为我们可以在文件尾继续写入新的页。 +假设我们手头上现在有 65536(4096*16)页(一页为 4096Bytes)的数据需要存在磁盘上,最自然的想法就是数组,实际上是变长数组,因为我们可以在文件尾继续写入新的页。 -但是,数据库会对数据进行删除。假设我们分配出去第0-9页用于记录某个表,然后删除了其中第2,4,6页的数据,那么下次再请求页面来存储信息的时候,就可以用这空闲的三页来存储。不这样做,那么面对申请100页,删100页,申请100页,删100页这样的操作,本来只要100页的空间就可以实现,实际上却会花的多得多。 +但是,数据库会对数据进行删除。假设我们分配出去第 0-9 页用于记录某个表,然后删除了其中第 2,4,6 页的数据,那么下次再请求页面来存储信息的时候,就可以用这空闲的三页来存储。不这样做,那么面对申请 100 页,删 100 页,申请 100 页,删 100 页这样的操作,本来只要 100 页的空间就可以实现,实际上却会花的多得多。 -这就引出了BitMap,我们只要拿出一页来,把这一页4096个Byte,即32768个bit,每个bit的0指示该页未被使用,1指示已经被使用,这样这一页就可以管理其后的32768页了,我们每次都现在其中找0,没有0了,才去新开一页。 +这就引出了 BitMap,我们只要拿出一页来,把这一页 4096 个 Byte,即 32768 个 bit,每个 bit 的 0 指示该页未被使用,1 指示已经被使用,这样这一页就可以管理其后的 32768 页了,我们每次都现在其中找 0,没有 0 了,才去新开一页。 -当然实际上这一页的4096B我们不会都拿去用来记录使用情况,还有一些元数据比如记录目前以占用的有10页等等。 +当然实际上这一页的 4096B 我们不会都拿去用来记录使用情况,还有一些元数据比如记录目前以占用的有 10 页等等。 -但注意第一段假设我们有65536页要存,一页BitMap不够,那就多来几个。我们把1页BitMap和后面的(大概)32767页称为一段(extent),我们需要两段来存储65536页,在最前面来个Disk Meta Page来管理所有页。 +但注意第一段假设我们有 65536 页要存,一页 BitMap 不够,那就多来几个。我们把 1 页 BitMap 和后面的(大概)32767 页称为一段(extent),我们需要两段来存储 65536 页,在最前面来个 Disk Meta Page 来管理所有页。 diff --git a/docs/Build_this_website.md b/docs/Build_this_website.md index 91a7c001..81c88c9e 100644 --- a/docs/Build_this_website.md +++ b/docs/Build_this_website.md @@ -6,16 +6,16 @@ hide: # 如何构建一个像这样的网站! !!! abstract "网站搭建教程" - 本站点使用mkdocs搭建,部署于Github Pages,使用了[:octicons-link-16:material](https://squidfunk.github.io/mkdocs-material/)主题 + 本站点使用 mkdocs 搭建,部署于 Github Pages,使用了[:octicons-link-16:material](https://squidfunk.github.io/mkdocs-material/)主题 ## 1.环境准备 -安装python +安装 python ```bash sudo apt install python3 python3-pip ``` -pip换源 +pip 换源 ```bash pip install pip -U pip config set global.index-url https://mirrors.zju.edu.cn/pypi/web/simple @@ -29,7 +29,7 @@ python -m venv webenv source webenv/bin/activate ``` -安装mkdocs +安装 mkdocs ```bash pip install mkdocs-material ``` @@ -39,7 +39,7 @@ pip install mkdocs-material ERROR: mkdocs 1.4.3 has requirement markdown<3.4,>=3.2.1, but you'll have markdown 3.4.3 which is incompatible. ``` -修改markdown版本,然后重新安装mkdocs: +修改 markdown 版本,然后重新安装 mkdocs: ```bash pip install markdown==3.2.1 pip install mkdocs-material @@ -53,15 +53,15 @@ pip install pillow cairosvg -??? info "可选优化:yaml补全" - 1. 安装VSCode-yaml - 2. 把下面设置写入settings.json: +??? info "可选优化:yaml 补全" + 1. 安装 VSCode-yaml + 2. 把下面设置写入 settings.json: ```json { "yaml.schemas": { "https://squidfunk.github.io/mkdocs-material/schema.json": "mkdocs.yml" }, - "yaml.customTags": [ + "yaml.customTags": [ "!ENV scalar", "!ENV sequence", "tag:yaml.org,2002:python/name:materialx.emoji.to_svg", @@ -71,22 +71,22 @@ pip install pillow cairosvg } ``` -## 2.部署到Github Pages +## 2.部署到 Github Pages -新建一个空的公开仓库,并且克隆到本地,在其中新建一个mkdocs site: +新建一个空的公开仓库,并且克隆到本地,在其中新建一个 mkdocs site: ```bash git clone repo cd repo mkdocs new . ``` -在mkdocs.yml中启用主题: +在 mkdocs.yml 中启用主题: ```yaml theme: name: material ``` -如果你希望将markdown源文件也保存在同一个仓库里的话,先新建一个忽略`site/`的`.gitignore`文件,然后提交,推送: +如果你希望将 markdown 源文件也保存在同一个仓库里的话,先新建一个忽略`site/`的`.gitignore`文件,然后提交,推送: ```bash echo "site/" > .gitignore git add . @@ -94,25 +94,25 @@ git commit -m "init" git push -u origin master ``` -然后用`gh-deploy`命令一键部署到Github Pages: +然后用`gh-deploy`命令一键部署到 Github Pages: ```bash mkdocs gh-deploy ``` -现在我们的仓库有两个分支了,master分支储存markdown源文件,gh-pages分支储存编译后的网站 +现在我们的仓库有两个分支了,master 分支储存 markdown 源文件,gh-pages 分支储存编译后的网站 -在settings-pages中可以看到网站的网址了,一般为`username.github.io/repo`,如果你创建的仓库是特殊的,名为`username.github.io`,那么网址就是`username.github.io`了 +在 settings-pages 中可以看到网站的网址了,一般为`username.github.io/repo`,如果你创建的仓库是特殊的,名为`username.github.io`,那么网址就是`username.github.io`了 当前的网站为默认样式: ![](images/Build_this_website/2023-07-02-02-35-34.png#pic) ??? info "可选优化:自动编译部署" - 我们可以使用GitHub action来帮助我们每次更新master分支后自动编译网站并推送到gh-pages分支,这样我们就不用每次都手动执行`mkdocs gh-deploy`了。 + 我们可以使用 GitHub action 来帮助我们每次更新 master 分支后自动编译网站并推送到 gh-pages 分支,这样我们就不用每次都手动执行`mkdocs gh-deploy`了。 1. 在仓库中新建一个`.github/workflows/auto-deploy.yml`文件,内容如下: ```yaml - name: ci + name: ci on: push: branches: - - master + - master - main permissions: contents: write @@ -126,7 +126,7 @@ mkdocs gh-deploy - uses: actions/setup-python@v4 with: python-version: 3.x - - run: echo "cache_id=$(date --utc '+%V')" >> $GITHUB_ENV + - run: echo "cache_id=$(date --utc '+%V')" >> $GITHUB_ENV - uses: actions/cache@v3 with: key: mkdocs-material-${{ env.cache_id }} @@ -136,14 +136,14 @@ mkdocs gh-deploy - run: pip install mkdocs-material mkdocs-changelog-plugin mkdocs-glightbox jieba pillow cairosvg mkdocs-tooltips mkdocs-statistics-plugin mkdocs-table-reader-plugin mkdocs-git-revision-date-localized-plugin - run: mkdocs gh-deploy --force ``` - 注意,推送到Github的话需要你的token有workflow权限 - 如果你依赖了额外的库,需要修改action + 注意,推送到 Github 的话需要你的 token 有 workflow 权限 + 如果你依赖了额外的库,需要修改 action ## 3.添加特性 -### 3.1 修改网站的css样式 +### 3.1 修改网站的 css 样式 -我们需要新增的样式君放置于`docs/css/`目录下,每个css文件都要在`mkdocs.yml`中添加: +我们需要新增的样式君放置于`docs/css/`目录下,每个 css 文件都要在`mkdocs.yml`中添加: ```yaml extra_css: @@ -167,15 +167,15 @@ extra_css: --my-changlog-color: #161616; } .md-grid { - max-width: 1400px; + max-width: 1400px; }/* make the page wider */ /* changelog config*/ .timeline-card{ - background-color: var(--my-changlog-color); + background-color: var(--my-changlog-color); } .timeline-content::before{ - background-color: var(--my-changlog-color); - } + background-color: var(--my-changlog-color); + } .changelog-type{ background-color: #CC8A85; } @@ -195,23 +195,23 @@ extra_css: ``` ??? tip "自己定义样式" - 我们可能不熟悉css,没事,我也完全不懂,对于一些简单的修改颜色修改字,直接用F12查看对应的样式改成自己喜欢的就好了,浏览器一般都支持直接改并且显示修改后的效果的 + 我们可能不熟悉 css,没事,我也完全不懂,对于一些简单的修改颜色修改字,直接用 F12 查看对应的样式改成自己喜欢的就好了,浏览器一般都支持直接改并且显示修改后的效果的 另一个好用的设置就是修改默认的图片样式,我们只要像这样引用图片 ``` ![](images/Build_this_website/2023-07-02-02-35-34.png#pic) ``` - 也就是在结尾加上#pic,就可以对图片应用默认样式了,我用的是圆角+阴影。这一添加的过程可以用VSCode插件Paste Image自动实现,我在[:octicons-link-16:这里](https://stormckey.github.io/Blog/VSCode-Markdown/#_2)有介绍 + 也就是在结尾加上#pic,就可以对图片应用默认样式了,我用的是圆角+阴影。这一添加的过程可以用 VSCode 插件 Paste Image 自动实现,我在[:octicons-link-16:这里](https://stormckey.github.io/Blog/VSCode-Markdown/#_2)有介绍 -### 3.2 添加额外的javascript +### 3.2 添加额外的 javascript -我们需要新增的js文件放置于`docs/js/`目录下,每个js文件都要在`mkdocs.yml`中添加: +我们需要新增的 js 文件放置于`docs/js/`目录下,每个 js 文件都要在`mkdocs.yml`中添加: ```yaml extra_javascript: - js/extra.js ``` -这里的url可以指向网络上的js文件,也可以是本地的 +这里的 url 可以指向网络上的 js 文件,也可以是本地的 -??? exmaple "我使用的的js" +??? exmaple "我使用的的 js" === "extra.js" ```javascript document.querySelectorAll('.zoom').forEach(item => { @@ -234,8 +234,8 @@ extra_javascript: processHtmlClass: "arithmatex" } }; - - document$.subscribe(() => { + + document$.subscribe(() => { MathJax.typesetPromise() }) ``` @@ -249,9 +249,9 @@ extra_javascript: }) ``` -### 3.3添加全局脚注 +### 3.3 添加全局脚注 -所有脚注都放在`includes/abbreviatioins.md`(在docs之外),格式为: +所有脚注都放在`includes/abbreviatioins.md`(在 docs 之外),格式为: ```md *[HTML]: Hyper Text Markup Language *[W3C]: World Wide Web Consortium @@ -270,7 +270,7 @@ markdown_extensions: ??? example "效果图" -### 3.4启用网站数据分析 +### 3.4 启用网站数据分析 在`mkdocs.yml`中添加: ```yaml @@ -280,11 +280,11 @@ extra: property: G-XXXXXXXXXX ``` -随后前往Google Analytics注册使用即可。 +随后前往 Google Analytics 注册使用即可。 -!!! warning "启用这项功能需要向每个网页注入google code" +!!! warning "启用这项功能需要向每个网页注入 google code" -### 3.5启用最新更新时间 +### 3.5 启用最新更新时间 安装库: ```bash @@ -297,17 +297,17 @@ plugins: enable_creation_date: true ``` -### 3.6启用评论区 - +### 3.6 启用评论区 + [:octicons-link-16:原文档](https://squidfunk.github.io/mkdocs-material/setup/setting-up-comments/)介绍的很清楚了 -### 3.7从文件读取表格 +### 3.7 从文件读取表格 参考[:octicons-link-16:原文档](https://squidfunk.github.io/mkdocs-material/reference/data-tables/#import-table-from-file) -### 3.8使用emojis和icons +### 3.8 使用 emojis 和 icons -这个[:octicons-link-16:链接](https://squidfunk.github.io/mkdocs-material/reference/icons-emojis/#search)可以搜索emoji +这个[:octicons-link-16:链接](https://squidfunk.github.io/mkdocs-material/reference/icons-emojis/#search)可以搜索 emoji ### 3.9 图片放大 @@ -345,14 +345,14 @@ plugins: name: material custom_dir: overrides favicon: cat.svg # put in /docs/cat.svg - font: + font: text: Roboto Mono code: Roboto Mono features: - content.action.edit # enable the button to edit the source code of the page - content.action.view # enable the button to view the source code of the page - content.code.copy # enable the button to copy the code block - - navigation.tabs # enable the row of tabs under the title + - navigation.tabs # enable the row of tabs under the title # - navigation.sections # unfold the secondary titles to the left # - navigation.footer # enable the next and previous button - navigation.indexes # the index page will be incoperate into the tab @@ -422,10 +422,10 @@ plugins: - pymdownx.keys # render key symbols - pymdownx.smartsymbols #enable button - - attr_list + - attr_list #enable content tabs - pymdownx.tabbed: - alternate_style: true + alternate_style: true - tables #daigrams are not enabled - footnotes @@ -479,7 +479,7 @@ plugins: lang: zh consent: title: Cookie consent - description: >- + description: >- We use cookies to recognize your repeated visits and preferences, as well as to measure the effectiveness of our documentation and whether users find what they're searching for. With your consent, you're helping us to @@ -493,6 +493,6 @@ plugins: - css/extra.css ``` -### 3.x更多特性(我还不会用但考虑启用的) +### 3.x 更多特性(我还不会用但考虑启用的) -1. 自定义html样式[:octicons-link-16:](https://squidfunk.github.io/mkdocs-material/customization/#extending-the-theme) \ No newline at end of file +1. 自定义 html 样式[:octicons-link-16:](https://squidfunk.github.io/mkdocs-material/customization/#extending-the-theme) diff --git a/docs/Format.md b/docs/Format.md index e1aba546..3f920644 100644 --- a/docs/Format.md +++ b/docs/Format.md @@ -6,8 +6,8 @@ hide: --- # 样式一览 !!! abstraction - 此页面将会列出本站点目前支持的所有显示样式 - 许多都来自[:octicons-link-16: Material for Mkdocs](https://squidfunk.github.io/mkdocs-material/) + 此页面将会列出本站点目前支持的所有显示样式 + 许多都来自[:octicons-link-16: Material for Mkdocs](https://squidfunk.github.io/mkdocs-material/) ```C hl_lines="2 2" int main(){ @@ -23,7 +23,7 @@ using namespace std; The `#!python range()` function is used to generate a sequence of numbers. -``` title="inlcude a file: .gitignore" +``` title="inlcude a file: .gitignore" --8<-- ".gitignore" ``` @@ -127,7 +127,7 @@ $$ \operatorname{ker} f=\{g\in G:f(g)=e_{H}\}{\mbox{.}} $$ -[鼠标悬停!]{😋} +【鼠标悬停!】{😋} [:material-information-outline:]{Important information} diff --git a/docs/Note/ADS/B-Tree_B+Tree.md b/docs/Note/ADS/B-Tree_B+Tree.md index 0edc6744..763eaf31 100644 --- a/docs/Note/ADS/B-Tree_B+Tree.md +++ b/docs/Note/ADS/B-Tree_B+Tree.md @@ -1,55 +1,55 @@ -1. +1. - B树利用了局部性来加速访问 + B 树利用了局部性来加速访问 - B树的外部节点是指叶节点的空孩子 + B 树的外部节点是指叶节点的空孩子 ![](image/B-Tree_B+Tree/media/image1.png) -2. +2. - 对B树的节点关键码数约定,注意下限是上取整,可用上下限命名 - 如(3,5)树/5阶B树,5阶B数一个节点最多4个关键码 + 对 B 树的节点关键码数约定,注意下限是上取整,可用上下限命名 + 如(3,5)树/5 阶 B 树,5 阶 B 数一个节点最多 4 个关键码 ![](image/B-Tree_B+Tree/media/image2.png) -3. +3. - B树在内存中实际的存储形式为 + B 树在内存中实际的存储形式为 ![](image/B-Tree_B+Tree/media/image3.png) -4. +4. 注意 外部节点数=内部节点数+1 ![](image/B-Tree_B+Tree/media/image4.png) - 也可理解为内部节点对应N种成功,外部节点就是对应的N+1种失败的情况 + 也可理解为内部节点对应 N 种成功,外部节点就是对应的 N+1 种失败的情况 -5. +5. - B树的高度就在\\thetalogmn + B 树的高度就在、\thetalogmn ![](image/B-Tree_B+Tree/media/image5.png) -6. +6. - B数的插入,如果导致节点key过多,则需要分裂,并把中点上移 + B 数的插入,如果导致节点 key 过多,则需要分裂,并把中点上移 ![](image/B-Tree_B+Tree/media/image6.png) - 如果分裂到根 那么高度加1 + 如果分裂到根 那么高度加 1 -7. +7. - B树的删除,如果导致下越界,但凡左右有一个兄弟有多的(借出后不下溢出),旋转 + B 树的删除,如果导致下越界,但凡左右有一个兄弟有多的(借出后不下溢出),旋转 ![](image/B-Tree_B+Tree/media/image7.png) @@ -61,25 +61,25 @@ 合并到根,就把空根删除,至此高度减一 -8. +8. - B树把数据存在节点中,比起B+树存在根中,B除了key多了个指针的大小。除去指针索引可以容纳宽扁的树。 + B 树把数据存在节点中,比起 B+树存在根中,B 除了 key 多了个指针的大小。除去指针索引可以容纳宽扁的树。 - 另外加入要查找某一区间的点比如20-60,需要依次搜索,很麻烦 + 另外加入要查找某一区间的点比如 20-60,需要依次搜索,很麻烦 - 引入B+树: + 引入 B+树: ![](image/B-Tree_B+Tree/media/image9.png) 索引值(内部点)不重复; - 不再需要B树的外部节点; + 不再需要 B 树的外部节点; 叶子块单向链表,方便查找某个范围内的值,不必多遍从根出发。 - 索引值(内部点的key)存的是右子树的最小叶子节点的值。 + 索引值(内部点的 key)存的是右子树的最小叶子节点的值。 如果有磁盘指针,也都存在有节点。 - 插入删除与B树相仿。但都要深入到叶节点。 + 插入删除与 B 树相仿。但都要深入到叶节点。 diff --git a/docs/Note/ADS/BST_AVL_Splay.md b/docs/Note/ADS/BST_AVL_Splay.md index c2c73a48..39844725 100644 --- a/docs/Note/ADS/BST_AVL_Splay.md +++ b/docs/Note/ADS/BST_AVL_Splay.md @@ -1,24 +1,24 @@ -1. 我们在调用search时会多传递一个引用的参数hot 其意义如下: +1. 我们在调用 search 时会多传递一个引用的参数 hot 其意义如下: ![](image/BST_AVL_Splay/media/image1.png) - 这有利于我们实现insert delete + 这有利于我们实现 insert delete -2. +2. - BST的平均高度,有两种计算方式 + BST 的平均高度,有两种计算方式 - 1. 随机组成:计算一共有多少种可能的拓扑结构 根号n Catalan(N)种结构 + 1. 随机组成:计算一共有多少种可能的拓扑结构 根号 n Catalan(N)种结构 2. 随机生成:计算一共有多少种可能的输入序列 ln N N!种序列 ![](image/BST_AVL_Splay/media/image2.png) - 随机组成更加可信,因为随机生成会额外增大213和231这一较低树的权重,重复了 + 随机组成更加可信,因为随机生成会额外增大 213 和 231 这一较低树的权重,重复了 -3.等价BST +3.等价 BST 上下具有一定的灵活度 @@ -28,27 +28,27 @@ ![](image/BST_AVL_Splay/media/image4.png) -4. +4. ![](image/BST_AVL_Splay/media/image5.png) - 左分叉是zig右分叉是zag,旋转可以保持BST的等价 + 左分叉是 zig 右分叉是 zag,旋转可以保持 BST 的等价 -5. +5. - AVL的插入可能会导致一系列祖先的失衡,但是删除只可能导致某一个祖先的失衡 + AVL 的插入可能会导致一系列祖先的失衡,但是删除只可能导致某一个祖先的失衡 -6. +6. ![](image/BST_AVL_Splay/media/image6.png) 注意到我们找到第一个失衡点之后,循环走啊路径只要往下找两次高度最高的孩子就好 -7. +7. - 伸展树的删除和插入,由于1都需要用search操作,search完后self/hot会成为新的根节点,我们的插入删除只要在搜索完后对根操作即可。 + 伸展树的删除和插入,由于 1 都需要用 search 操作,search 完后 self/hot 会成为新的根节点,我们的插入删除只要在搜索完后对根操作即可。 ![](image/BST_AVL_Splay/media/image7.png) diff --git a/docs/Note/ADS/Heap.md b/docs/Note/ADS/Heap.md index 24c90f21..62a11c84 100644 --- a/docs/Note/ADS/Heap.md +++ b/docs/Note/ADS/Heap.md @@ -1,7 +1,7 @@ # 优先级队列/堆拾遗 -## NPL的另一种理解 -可以参看图片理解,节点NPL也是该子树的最大完全二叉树深度 +## NPL 的另一种理解 +可以参看图片理解,节点 NPL 也是该子树的最大完全二叉树深度 ![](images/Heap/2023-03-23-19-53-52.png#pic) ## 最小节点数的证明 diff --git a/docs/Note/ADS/RBTree.md b/docs/Note/ADS/RBTree.md index 007c8c84..5e248bb4 100644 --- a/docs/Note/ADS/RBTree.md +++ b/docs/Note/ADS/RBTree.md @@ -1,32 +1,32 @@ -1. +1. - 四个约束条件: + 四个约束条件: ![](image/RBTree/media/image1.png) -2. +2. - 红黑树就是B-树 + 红黑树就是 B-树 ![](image/RBTree/media/image2.png) -3. +3. - 利用B-树证明红黑树的高度 + 利用 B-树证明红黑树的高度 ![](image/RBTree/media/image3.png) -4. +4. - 利用B-Tree认识问题,这里只需使用3,4重构即可,重新归于RBR + 利用 B-Tree 认识问题,这里只需使用 3,4 重构即可,重新归于 RBR ![](image/RBTree/media/image4.png) -5. +5. 红黑树插入的复杂度,注意到重构(旋转)至多常数次 diff --git a/docs/Note/CO_review.md b/docs/Note/CO_review.md index 4649d9d0..43b289ce 100644 --- a/docs/Note/CO_review.md +++ b/docs/Note/CO_review.md @@ -12,10 +12,10 @@ comments: true - PC relative addressing: `PC + offset` 而非 `PC + 4 + offset` - I 类型的立即数均为符号扩展,但要注意移位指令只截取低位,因为过多位数的位移无意义 -- SB 和 UJ类型都不存最低位,因为他们的目的地是指令(word alignment),一般最后两位都是0(因为存在16位的指令所以只有最后一位必然是0) +- SB 和 UJ 类型都不存最低位,因为他们的目的地是指令(word alignment),一般最后两位都是 0(因为存在 16 位的指令所以只有最后一位必然是 0) - 合理利用`bgeu`来检测越界(小于零或者大于某个数) -- `lui`加载了立即数的高20位后,用`aadi`加载低12位,若因符号扩展导致进位,只要多加1000就可以抵消FFFFF000的影响 -- 记清楚ld的d是doubleword,老是记成load的d +- `lui`加载了立即数的高 20 位后,用`aadi`加载低 12 位,若因符号扩展导致进位,只要多加 1000 就可以抵消 FFFFF000 的影响 +- 记清楚 ld 的 d 是 doubleword,老是记成 load 的 d 还有几张常用表: ![](images/CO_review/2023-03-31-17-29-23.png#pic) @@ -24,15 +24,15 @@ comments: true ![](images/CO_review/2023-03-31-17-29-45.png#pic) -(下图里的j imm要改成PC+imm) +(下图里的 j imm 要改成 PC+imm) ![](images/CO_review/2023-03-31-17-30-14.png#pic) ![](images/CO_review/2023-03-31-18-04-03.png#pic) ## Ch3 Arithmetic -- 检测加减法溢出:最高位全加器的Cin Cout进行异或即可,这俩信号不一样,就意味着溢出了 -- 最高位牵出一根线set到最低位的less,其他所有位less都置0就可以组成slt的输出信号了 -- IEEE 754 注意两点 一是1+8+23 = 32 |1 + 11 + 52 = 64;二是下溢的非规格数的exponent跟规格数的最小exponent是一样的,这样设计就可以让 0.1111111...(下溢最大) -> 1.0000000(规格最小)...连续可以等差的往上增加 +- 检测加减法溢出:最高位全加器的 Cin Cout 进行异或即可,这俩信号不一样,就意味着溢出了 +- 最高位牵出一根线 set 到最低位的 less,其他所有位 less 都置 0 就可以组成 slt 的输出信号了 +- IEEE 754 注意两点 一是 1+8+23 = 32 |1 + 11 + 52 = 64;二是下溢的非规格数的 exponent 跟规格数的最小 exponent 是一样的,这样设计就可以让 0.1111111...(下溢最大) -> 1.0000000(规格最小)...连续可以等差的往上增加 - 浮点加法:注意对齐改变的是小的指数那个 -- 浮点乘法,注意减去bias +- 浮点乘法,注意减去 bias diff --git a/docs/Note/Data Modeling/Boosting.md b/docs/Note/Data Modeling/Boosting.md new file mode 100644 index 00000000..1b255594 --- /dev/null +++ b/docs/Note/Data Modeling/Boosting.md @@ -0,0 +1,3 @@ +--- +comments: true +--- diff --git a/docs/Note/Data Modeling/Decision_Tree.md b/docs/Note/Data Modeling/Decision_Tree.md index 226ee61f..b533f2ba 100644 --- a/docs/Note/Data Modeling/Decision_Tree.md +++ b/docs/Note/Data Modeling/Decision_Tree.md @@ -8,7 +8,7 @@ comments: true ??? example "决策树实例" ![](images/Decision_Tree/2023-11-21-16-34-09.png#pic) -决策树等价于一系列的if-then规则,在决策树中,每个具体的例子都被且仅被一条路径覆盖。 +决策树等价于一系列的 if-then 规则,在决策树中,每个具体的例子都被且仅被一条路径覆盖。 决策树还等价于一种条件概率分布,不过这种条件概率分布被强化成了一个空间的划分。 @@ -25,36 +25,36 @@ comments: true 首先我们先定义熵和条件熵 !!! info "熵" - 给定一个随机变量X: + 给定一个随机变量 X: $$ P(X = x_i) = P_i $$ - + 那么该随机变量的熵为: $$ H(X) = -\sum_{i=1}^{n}P_i\log P_i \quad\quad \in [0,\log n] $$ - 注意,在讨论熵是默认对数的底为2,此时熵的单位为bit。 + 注意,在讨论熵是默认对数的底为 2,此时熵的单位为 bit。 ??? example "对熵的理解" - 假设我们有一个随机为0-7的等概率的随机变量,从上式可以很容易计算出他的熵是3bit,也就是说我们需要3bit的信息才能确定这个随机变量的取值。 - 这跟直观上也是吻合的,因为我们需要至少3bit的编码来分别这八个信号(000-111)。 + 假设我们有一个随机为 0-7 的等概率的随机变量,从上式可以很容易计算出他的熵是 3bit,也就是说我们需要 3bit 的信息才能确定这个随机变量的取值。 + 这跟直观上也是吻合的,因为我们需要至少 3bit 的编码来分别这八个信号(000-111)。 - 上式中的log的行为可以理解为,如果一个信号有1/8的概率出现,那么这个信号需要$-\log_2 1/8 = 3$bit的编码来表示。如果一个信号有1/4的概率出现,那么这个信号需要$-\log_2 1/4 = 2$bit的编码来表示。最后我们对这个随机变量的熵的计算其实就是对这个编码长度求期望。 + 上式中的 log 的行为可以理解为,如果一个信号有 1/8 的概率出现,那么这个信号需要$-\log_2 1/8 = 3$bit 的编码来表示。如果一个信号有 1/4 的概率出现,那么这个信号需要$-\log_2 1/4 = 2$bit 的编码来表示。最后我们对这个随机变量的熵的计算其实就是对这个编码长度求期望。 而熵的值越大,我们目前的信息就越少。 - - 假如我们要预测的人的进攻方向,若敌人进攻方向这一随机变量的熵为3bits,等效敌人从八个方向等可能进攻。但如果我们获取了某个信息后此随机变量的熵只剩下1bit,等效敌人从两个方向等可能进攻,信息就充足的多了。 + + 假如我们要预测的人的进攻方向,若敌人进攻方向这一随机变量的熵为 3bits,等效敌人从八个方向等可能进攻。但如果我们获取了某个信息后此随机变量的熵只剩下 1bit,等效敌人从两个方向等可能进攻,信息就充足的多了。 所以我们可以有一个直观的理解,某个信息来之后我的熵减少的越多,这个信息的信息量越大,越有用。 !!! info "条件熵" 给定一个联合分布: - - $$ + + $$ P(X = x_i,Y = y_j) = P_{ij} $$ @@ -64,15 +64,15 @@ comments: true H(Y|X) = -\sum_{i=1}^{n} P_i H(Y|X = x_i) = -\sum_{i=1}^{n} P_i \sum_{j=1}^{m} P_{j|i} \log P_{j|i} $$ - 从第一个等号可以看得出来条件熵其实也就是对于不同的X的取值求期望 + 从第一个等号可以看得出来条件熵其实也就是对于不同的 X 的取值求期望 -于是我们就可以定义特征A对于数据D的信息增益: +于是我们就可以定义特征 A 对于数据 D 的信息增益: $$ g(D,A) = H(D) - H(D|A) $$ -这也被称为类与特征的互信息,它表示得知特征A的信息而使得类Y的信息的不确定性减少的程度。 +这也被称为类与特征的互信息,它表示得知特征 A 的信息而使得类 Y 的信息的不确定性减少的程度。 ### 信息增益比 @@ -82,7 +82,7 @@ $$ g_R(D,A) = \frac{g(D,A)}{H_A(D)} $$ -其中$H_A(D) = -\sum_{i=1}^{n} \frac{|D_i|}{|D|} \log \frac{|D_i|}{|D|}$是关于特征A对数据集D的经验熵,$|D_i|$是$D$中在特征A上取值为$a_i$的样本子集。A的可取值越多,$H_A(D)$的值越大。 +其中$H_A(D) = -\sum_{i=1}^{n} \frac{|D_i|}{|D|} \log \frac{|D_i|}{|D|}$是关于特征 A 对数据集 D 的经验熵,$|D_i|$是$D$中在特征 A 上取值为$a_i$的样本子集。A 的可取值越多,$H_A(D)$的值越大。 ### 基尼指数 @@ -98,9 +98,9 @@ $$ ## 决策树生成 -### ID3算法 +### ID3 算法 -ID3算法的核心是在决策树各个节点上应用信息增益准则选择特征,递归的构建决策树。 +ID3 算法的核心是在决策树各个节点上应用信息增益准则选择特征,递归的构建决策树。 - 输入:训练集$D$,特征集$A$,阈值$\epsilon$ - 输出:决策树$T$ @@ -109,9 +109,9 @@ ID3算法的核心是在决策树各个节点上应用信息增益准则选择 - base case: 若$\max g(D,A) < \epsilon$,则$T$为单节点树,并将$D$中实例数最大的类$C_k$作为该节点的类标记,返回$T$。 - 否则,计算$A$中各个特征对$D$的信息增益,选择信息增益最大的特征$A_g$将数据集分类,然后对各个子类调用本算法,递归的构建决策树,返回$T$。 -### C4.5算法 +### C4.5 算法 -C4.5算法根ID3算法完全一样,只是用的不是信息增益,而是信息增益比。 +C4.5 算法根 ID3 算法完全一样,只是用的不是信息增益,而是信息增益比。 ## 决策树剪枝 @@ -121,11 +121,11 @@ C4.5算法根ID3算法完全一样,只是用的不是信息增益,而是信 $$ C_{\alpha}(T) = \sum_{t \in T} N_t H_t(T) + \alpha |T| $$ -其中T为所有叶节点的集合,t为某个叶节点,$N_t$为叶节点t的样本个数,$H_t(T)$为叶节点t的经验熵,$|T|$为叶节点的个数,$\alpha$为正则化参数。 +其中 T 为所有叶节点的集合,t 为某个叶节点,$N_t$为叶节点 t 的样本个数,$H_t(T)$为叶节点 t 的经验熵,$|T|$为叶节点的个数,$\alpha$为正则化参数。 -具体来说,假设t叶节点的所有$N_t$个样本中,k类的样本有$N_{tk}$个,那么$H_t(T) = -\sum_{k=1}^{K} \frac{N_{tk}}{N_t} \log \frac{N_{tk}}{N_t}$。 +具体来说,假设 t 叶节点的所有$N_t$个样本中,k 类的样本有$N_{tk}$个,那么$H_t(T) = -\sum_{k=1}^{K} \frac{N_{tk}}{N_t} \log \frac{N_{tk}}{N_t}$。 -我们需要对这个损失函数进行最小化,容易看出,如果叶节点全部都是单一类,那么第一项的值为0。这时候决策树的分类效果好,但是叶子节点容易过多,第二项很大。但如果第二项极端的优化,我们只有一个叶节点,那么树是小了,但是所有样本都在一个节点内,可以说是毫无分类效果。所以我们最小化这个损失函数就是要在二者之间找到一个平衡,树既不会过深,分类效果也有保障。 +我们需要对这个损失函数进行最小化,容易看出,如果叶节点全部都是单一类,那么第一项的值为 0。这时候决策树的分类效果好,但是叶子节点容易过多,第二项很大。但如果第二项极端的优化,我们只有一个叶节点,那么树是小了,但是所有样本都在一个节点内,可以说是毫无分类效果。所以我们最小化这个损失函数就是要在二者之间找到一个平衡,树既不会过深,分类效果也有保障。 算法 @@ -135,11 +135,11 @@ $$ ## 实例 -### CART回归树算法 +### CART 回归树算法 -假设我们有数据集$\{(x_i,y_i)\}$, 其中$x \in \mathbb{R}^n$,$y_i \in \mathbb{R}$,现在给出一个新的数据点$x$,求出它的对应y。 +假设我们有数据集$\{(x_i,y_i)\}$, 其中$x \in \mathbb{R}^n$,$y_i \in \mathbb{R}$,现在给出一个新的数据点$x$,求出它的对应 y。 -CART回归树算法会把空间划分成m块$R_1,R_2...R_m$,每个单元上函数的输出值都是固定的: +CART 回归树算法会把空间划分成 m 块$R_1,R_2...R_m$,每个单元上函数的输出值都是固定的: $$ f(x) = \sum_{m=1}^{M} c_m I(x \in R_m) @@ -155,10 +155,10 @@ $$ - 输入:训练集$D$,阈值$\epsilon$ - 输出:回归树$f(x)$ -- 开始:遍历维度j以及该维度上变量划分点S,将数据集在该维度上按照划分点划分成两部分$R_1(j,s),R_2(j,s)$,计算对应的损失函数值$min_{s} \sum_{x_i \in R_1(j,s)} (y_i - c_1)^2 + \sum_{x_i \in R_2(j,s)} (y_i - c_2)^2$ -- 找到最佳维度和最佳划分之后,把数据集划分为$R_1,R_2$,然后对$R_1,R_2$分别递归的调用本算法,直到满足停止条件(区域内部损失函数小于阈值) +- 开始:遍历维度 j 以及该维度上变量划分点 S,将数据集在该维度上按照划分点划分成两部分$R_1(j,s),R_2(j,s)$,计算对应的损失函数值$min_{s} \sum_{x_i \in R_1(j,s)} (y_i - c_1)^2 + \sum_{x_i \in R_2(j,s)} (y_i - c_2)^2$ +- 找到最佳维度和最佳划分之后,把数据集划分为$R_1,R_2$,然后对$R_1,R_2$分别递归的调用本算法,直到满足停止条件(区域内部损失函数小于阈值) -### CART分类树算法 +### CART 分类树算法 首先我们先用基尼指数生成决策树,然后对决策树进行剪枝。我们着重介绍这里使用的剪枝算法 @@ -168,13 +168,13 @@ $$ C_{\alpha}(T) = C(T)+ \alpha |T| \quad\quad \alpha \in [0,\infty) $$ -其中$C(T)$为用该决策树对训练集进行预测的损失函数(用基尼指数)。 我们的目标是找到$\alpha$从0到正无穷的每一个区间内的剪枝后的最优树。 +其中$C(T)$为用该决策树对训练集进行预测的损失函数(用基尼指数)。 我们的目标是找到$\alpha$从 0 到正无穷的每一个区间内的剪枝后的最优树。 在此语境下,对某个节点进行剪枝就是在决策树中用一个单一节点代替以当前节点为根的子树,该单一节点含有子树中所有的样本。 -我们先来看比较极端的$\alpha$,看他对决策树的影响,当$\alpha$为0时,我们的损失函数就是$C(T)$,此时我们的目标就是最小化$C(T)$,也就是说我们的目标是生成一个最优的决策树,就算我们分出了非常多的节点也无所谓。当$\alpha$为正无穷时,我们的损失函数就是$|T|$,此时我们的目标就是最小化$|T|$,也就是说我们的目标是生成一个节点最少的树,那么毫无疑问所有的样本都放在根节点内就是最优解。可以看出, $\alpha$越大,决策树会被剪的越干净。 +我们先来看比较极端的$\alpha$,看他对决策树的影响,当$\alpha$为 0 时,我们的损失函数就是$C(T)$,此时我们的目标就是最小化$C(T)$,也就是说我们的目标是生成一个最优的决策树,就算我们分出了非常多的节点也无所谓。当$\alpha$为正无穷时,我们的损失函数就是$|T|$,此时我们的目标就是最小化$|T|$,也就是说我们的目标是生成一个节点最少的树,那么毫无疑问所有的样本都放在根节点内就是最优解。可以看出, $\alpha$越大,决策树会被剪的越干净。 -在以上前提下,我们发现我们可以单独讨论一个节点是否要被剪枝(回忆一下什么叫做对一个节点进行剪枝),假设一个节点所代表的子树为$T_t$,把子树内的所有样本都收到节点内所构成的节点为t,那么该节点从不剪枝转向剪枝的关键节点就是当下式成立时: +在以上前提下,我们发现我们可以单独讨论一个节点是否要被剪枝(回忆一下什么叫做对一个节点进行剪枝),假设一个节点所代表的子树为$T_t$,把子树内的所有样本都收到节点内所构成的节点为 t,那么该节点从不剪枝转向剪枝的关键节点就是当下式成立时: $$ C(t) + \alpha * 1 = C(T_t) + \alpha * |T_t| diff --git a/docs/Note/Data Modeling/KNN.md b/docs/Note/Data Modeling/KNN.md index 64b6332b..492c9860 100644 --- a/docs/Note/Data Modeling/KNN.md +++ b/docs/Note/Data Modeling/KNN.md @@ -3,15 +3,15 @@ comments: true header-includes: - \usepackage[ruled,vlined,linesnumbered]{algorithm2e} --- -# K近邻 +# K 近邻 ## 问题及算法描述 -给定数据集$\{(x_i,y_i)\}$, 其中$x \in \mathbb{R}^n$,$y_i \in \{ c_1,c_2,....c_k\}$, 一共有K种类别,现在给出一个新的数据点$x$,求出它的类别$y$。 -算法思想: +给定数据集$\{(x_i,y_i)\}$, 其中$x \in \mathbb{R}^n$,$y_i \in \{ c_1,c_2,....c_k\}$, 一共有 K 种类别,现在给出一个新的数据点$x$,求出它的类别$y$。 +算法思想: -- 找出离x最近的K个邻居$N_{k}(x)$ -- 由着K个邻居进行多数表决: +- 找出离 x 最近的 K 个邻居$N_{k}(x)$ +- 由着 K 个邻居进行多数表决: $$ y =\underset{c_j}{\operatorname{arg max}} \sum_{N_{k}(x)} I(y = c_j) @@ -19,9 +19,9 @@ $$ 其中的$I(y = c_j)$是指示函数,当$y = c_j$时,$I(y = c_j) = 1$,否则$I(y = c_j) = 0$。 -## K近邻的三要素 +## K 近邻的三要素 -有了上述的算法框架后,K近邻算法由三个要素决定: +有了上述的算法框架后,K 近邻算法由三个要素决定: === "距离度量" 一般来说我们使用$L_p$距离,即: @@ -30,37 +30,37 @@ $$ L_p(x_i,x_j) = (\sum_{l=1}^{n}|x_i^{(l)} - x_j^{(l)}|^p)^{\frac{1}{p}} $$ - 当p的取值为2时,就是欧氏距离 -=== "K值选择" - 当K比较小的时候,模型比较复杂,容易过拟合; - 当K比较大的时候,模型比较简单,容易欠拟合。 - 一般来说K值都不会选的太大。 + 当 p 的取值为 2 时,就是欧氏距离 +=== "K 值选择" + 当 K 比较小的时候,模型比较复杂,容易过拟合; + 当 K 比较大的时候,模型比较简单,容易欠拟合。 + 一般来说 K 值都不会选的太大。 === "分类决策规则" 一般使用多数表决规则,在此情景下多数表决规则等效于经验风险最小化。 - -## 用kd树切分空间求解K近邻 -### kd树的构造 +## 用 kd 树切分空间求解 K 近邻 + +### kd 树的构造 - 输入: $\{(x_i,y_i)\}$ -- 开始: 取变量$x$的第一个维度$x_i^(1)$,第一个纬度的中位数$x_j^(1)$,将数据集分为两部分,左子树和右子树,而$x_j^(1)$就是根节点,左右子节点的深度为1 -- 重复: 对左右子树继续进行分割,对于j深度的子树,取$x$的第$j+1$维度$x_i^(j+1)$进行分割 +- 开始: 取变量$x$的第一个维度$x_i^(1)$,第一个纬度的中位数$x_j^(1)$,将数据集分为两部分,左子树和右子树,而$x_j^(1)$就是根节点,左右子节点的深度为 1 +- 重复: 对左右子树继续进行分割,对于 j 深度的子树,取$x$的第$j+1$维度$x_i^(j+1)$进行分割 - 结束: 直到左右空间都不再有子节点 ??? example "课件上的例子" ![](images/KNN/2023-11-21-15-29-48.png#pic) -### 搜索kd树寻找K近邻 +### 搜索 kd 树寻找 K 近邻 -- 输入: kd树,目标点$x$(注意此处的x一般而言不是数据集中的点) -- 开始: 从根节点开始,递归的向下访问kd树,在每个节点把对应维度跟该节点比较决定向左还是向右,直到叶子节点 +- 输入: kd 树,目标点$x$(注意此处的 x 一般而言不是数据集中的点) +- 开始: 从根节点开始,递归的向下访问 kd 树,在每个节点把对应维度跟该节点比较决定向左还是向右,直到叶子节点 - 重复: 维护一个当前的最近距离,这个当前最近距离的初始值就是跟到达叶节点的距离,仅有某个子树可能含有距离小于此最小距离的的节点时我们才访问之 - - 向上回溯,首先尝试用父节点更新最小距离,然后计算一下兄弟空间是否跟以x为中心,以最小距离为半径的超球相交,如果相交,对兄弟子树进行kd树搜索 + - 向上回溯,首先尝试用父节点更新最小距离,然后计算一下兄弟空间是否跟以 x 为中心,以最小距离为半径的超球相交,如果相交,对兄弟子树进行 kd 树搜索 - 结束: 回溯到根的时候结束,当前维护的最近点就是全局最近点 -一次搜索给出一个最近邻点,时间复杂度用为$O(logn)$,如果要找出K个最近邻点,时间复杂度为$O(klogn)$ +一次搜索给出一个最近邻点,时间复杂度用为$O(logn)$,如果要找出 K 个最近邻点,时间复杂度为$O(klogn)$ -??? example "PPT上的例子" +??? example "PPT 上的例子" ![](images/KNN/2023-11-21-15-39-15.png#pic) diff --git a/docs/Note/Data Modeling/Logistic_Regression.md b/docs/Note/Data Modeling/Logistic_Regression.md index 7917ee95..fc240106 100644 --- a/docs/Note/Data Modeling/Logistic_Regression.md +++ b/docs/Note/Data Modeling/Logistic_Regression.md @@ -12,7 +12,7 @@ $$ F(x)=\frac{1}{1+e^{-(x-\mu)/\gamma}} $$ -其中$\mu$为位置参数,$\gamma$为形状参数。该分布函数的图像为S型曲线,$\mu$为函数的对称中心,$\gamma$控制函数的陡峭程度,值越大,函数越陡峭。 +其中$\mu$为位置参数,$\gamma$为形状参数。该分布函数的图像为 S 型曲线,$\mu$为函数的对称中心,$\gamma$控制函数的陡峭程度,值越大,函数越陡峭。 ![](images/Logistic_Regression/2023-11-25-23-39-04.png#pic) @@ -20,14 +20,14 @@ $$ 给定数据集$D=\{(x_1,y_1),(x_2,y_2),...,(x_m,y_m)\}$,其中$x_i \in \mathbb{R}$,$y_i \in \{0,1\}$,我们的目标是学习到一个线性模型来进行分类,在感知机中,我们用一个指示函数来将函数值的符号映射到不同的分类。 -对于逻辑斯蒂回归来说,我们想要得到的是某个x下属于0,或者1的概率,因为分布函数也是连续的,所以我们可以试图用线性的模型去拟合,我们先作如下的转化: +对于逻辑斯蒂回归来说,我们想要得到的是某个 x 下属于 0,或者 1 的概率,因为分布函数也是连续的,所以我们可以试图用线性的模型去拟合,我们先作如下的转化: - 概率的取值范围是$P \in [0,1]$ - 如果我们使用几率$\frac{p}{1-p}$,那么我们的取值范围就是$(0,\infty)$ - 再加一个对数,我们就得到对数几率$logit(p)=ln\frac{p}{1-p}$,取值范围是$(-\infty,\infty)$ -这样对数几率的取值范围就和线性函数的一样了,我们就可以试着用线性函数去进行拟合(如果某个分布的对数函数相关系数很高,自然可以拟合到比较好的效果,但如果一个分布的对数几率几乎不成线性,那么线性函数的拟合效果就会比较差。所以我们用逻辑斯蒂回归拟合的分布最好有类似逻辑斯蒂分布的分布函数)。 - +这样对数几率的取值范围就和线性函数的一样了,我们就可以试着用线性函数去进行拟合(如果某个分布的对数函数相关系数很高,自然可以拟合到比较好的效果,但如果一个分布的对数几率几乎不成线性,那么线性函数的拟合效果就会比较差。所以我们用逻辑斯蒂回归拟合的分布最好有类似逻辑斯蒂分布的分布函数)。 + 我们令 $$ @@ -44,7 +44,7 @@ $$ P(Y=0|x)=\frac{1}{1+exp(w\cdot x+b)} $$ -这就是逻辑斯蒂回归,现在问题是我们有的是一对数据点而不是x和对应的概率,我们该如何进行拟合? +这就是逻辑斯蒂回归,现在问题是我们有的是一对数据点而不是 x 和对应的概率,我们该如何进行拟合? ## 极大似然估计 @@ -72,11 +72,11 @@ $$ ## 多项逻辑斯谛回归模型 -类似的,多项逻辑斯蒂分布的分布函数如下: +类似的,多项逻辑斯蒂分布的分布函数如下: \begin{aligned} &P(Y=1|x)=\frac{exp(w_1\cdot x+b_1)}{1+\sum_{i=1}^{k-1} e^{w_i \cdot x + b_i}} \\ &P(Y=2|x)=\frac{exp(w_2\cdot x+b_2)}{1+\sum_{i=1}^{k-1} e^{w_i \cdot x + b_i}} \\ &... \\ &P(Y=k|x)=\frac{1}{1+\sum_{i=1}^{k-1} e^{w_i \cdot x + b_i}} \\ -\end{aligned} \ No newline at end of file +\end{aligned} diff --git a/docs/Note/Data Modeling/Max_Entropy.md b/docs/Note/Data Modeling/Max_Entropy.md index 359f4fe6..657f0dc7 100644 --- a/docs/Note/Data Modeling/Max_Entropy.md +++ b/docs/Note/Data Modeling/Max_Entropy.md @@ -5,50 +5,50 @@ comments: true # 最大熵模型 !!! info "思想" - 有时候我们已有的数据并不足以我们唯一确定一个分布,这个时候对于所有候选的分布中,我们认为熵最大的那个分布是最好的.换言之,在满足约束的情况下,我们尽可能采取等可能分布. + 有时候我们已有的数据并不足以我们唯一确定一个分布,这个时候对于所有候选的分布中,我们认为熵最大的那个分布是最好的.换言之,在满足约束的情况下,我们尽可能采取等可能分布。 ## 模型描述 -对于数据集$\{(x_i,y_i)\}$,统计经验分布(也就是频率) +对于数据集$\{(x_i,y_i)\}$,统计经验分布(也就是频率) \begin{aligned} &\tilde{P}(X=x,Y=y) = \frac{v(X = x, Y = y)}{N} \\ &\tilde{P}(X=x) = \frac{v(X = x)}{N} \\ \end{aligned} -我们引入特征函数$f(x,y) \ in {0,1}$,我们可以置顶某种条件,满足条件的$(x,y)$对应的特征函数值为1,否则为0.比如我们可以定义$f(x,y) = 1$当且仅当$x$和$y$相等,否则为0.定义了一个特征函数,我们就可以定义在特征函数上的期望: +我们引入特征函数$f(x,y) \ in {0,1}$,我们可以置顶某种条件,满足条件的$(x,y)$对应的特征函数值为 1,否则为 0.比如我们可以定义$f(x,y) = 1$当且仅当$x$和$y$相等,否则为 0.定义了一个特征函数,我们就可以定义在特征函数上的期望: $$ E_{\tilde{P}}(f) = \sum_{x,y}\tilde{P}(x,y)f(x,y) $$ -简单来说,这就是对某些$(x,y)$上的频数求和,在上例中,就是对xy相等的那些项的频数求和 +简单来说,这就是对某些$(x,y)$上的频数求和,在上例中,就是对 xy 相等的那些项的频数求和 -假设我们学习到了一个条件分布$P(Y|X)$,那么用我们学到的条件分布与X的经验分布算出来的期望是: +假设我们学习到了一个条件分布$P(Y|X)$,那么用我们学到的条件分布与 X 的经验分布算出来的期望是: $$ E_{P}(f) = \sum_{x,y}P(y|x)\tilde{P}(x)f(x,y) $$ -我们希望我们学到的条件呢分布尽可能符合实际,也就是$P(y|x)\tilde{P}(x)$在特征函数的意义上尽可能贴近$\tilde{P}(x,y)$,也就是说 +我们希望我们学到的条件呢分布尽可能符合实际,也就是$P(y|x)\tilde{P}(x)$在特征函数的意义上尽可能贴近$\tilde{P}(x,y)$,也就是说 $$ E_{P}(f) = E_{\tilde{P}}(f) $$ -如果我们用上面例子中的特征函数,这里的意思就是我们学习到的分布中,xy相等的频数等于实际观测到的xy相等的频数. +如果我们用上面例子中的特征函数,这里的意思就是我们学习到的分布中,xy 相等的频数等于实际观测到的 xy 相等的频数。 -这里就是我们在思想中提到的约束,满足这样约束的模型并不唯一,我们计算各个模型的条件熵: +这里就是我们在思想中提到的约束,满足这样约束的模型并不唯一,我们计算各个模型的条件熵: $$ H(P) = -\sum_{x,y}\tilde{P}(x)P(y|x)\log P(y|x) $$ -我们希望条件熵最大,条件熵越大的分布越好,这是一个优化问题. +我们希望条件熵最大,条件熵越大的分布越好,这是一个优化问题。 ## 模型求解 -写出形式化表达式: +写出形式化表达式: \begin{aligned} \underset{P \in C}{\operatorname{min}} &-H(P) = \sum_{x,y}\tilde{P}(x)P(y|x)\log P(y|x) \\ @@ -58,11 +58,11 @@ $$ 注意到我们可以用多个特征函数来进行约束 -为了解觉优化问题,我们用以下三步 +为了解觉优化问题,我们用以下三步 -- 写出对偶问题,拉格朗日函数$L(P,w)$为: +- 写出对偶问题,拉格朗日函数$L(P,w)$为: $$ \undreset{P \in C}{\operatorname{min}} \underset{w}{\operatorname{max}} L(P,w) = \sum_{x,y}\tilde{P}(x)P(y|x)\log P(y|x) + \sum_{i=1}^{n}w_i(\sum_{x,y}\tilde{P}(x)P(y|x)f_i(x,y) - E_{\tilde{P}}(f_i)) $$ -- 极小化: 在$L(P,w)$中对P求偏导以进行最小化 -- 极大化: 同样求导或者使用其他最优化算法(梯度下降法,牛顿法,拟牛顿法) +- 极小化:在$L(P,w)$中对 P 求偏导以进行最小化 +- 极大化:同样求导或者使用其他最优化算法(梯度下降法,牛顿法,拟牛顿法) diff --git a/docs/Note/Data Modeling/Naive_Bayesian.md b/docs/Note/Data Modeling/Naive_Bayesian.md index 07db7f5d..9b2262fe 100644 --- a/docs/Note/Data Modeling/Naive_Bayesian.md +++ b/docs/Note/Data Modeling/Naive_Bayesian.md @@ -6,27 +6,27 @@ comments: true ## 问题及算法描述 -给定数据集$\{(x_i,y_i)\}$, 其中 $x \in \mathbb{R}^n$,$y_i \in \{ c_1,c_2,....c_k\}$, 一共有K种类别,现在给出一个新的数据点$x$,求出它的类别$y$。 +给定数据集$\{(x_i,y_i)\}$, 其中 $x \in \mathbb{R}^n$,$y_i \in \{ c_1,c_2,....c_k\}$, 一共有 K 种类别,现在给出一个新的数据点$x$,求出它的类别$y$。 算法希望学习一个联合概率分布$P(X,Y)$,而我们现在已经有的是先验分布$P(Y)$和条件概率分布$P(X|Y)$。 -但是后者的空间太大,这里我们引入独立性假设,假设x的每个维度都是独立的(事实上大概率并不是,这是极大简化计算量的一步,也是引入误差的一步,也是该算法的“朴素”之处): +但是后者的空间太大,这里我们引入独立性假设,假设 x 的每个维度都是独立的(事实上大概率并不是,这是极大简化计算量的一步,也是引入误差的一步,也是该算法的“朴素”之处): $$ P(X = x| Y = c_k) = P(X^{(1)} = x^{(1)}, X^{(2)} = x^{(2)} ... X^{(n)} = x^{(n)} | Y = c_k)= \prod_{i=1}^{n}P(X^{(i)} = x^{(i)}| Y = c_k) $$ -上式的意思是在类别是$c_k$的前提下,X这一n维随机变量的取值为x的概率,就是$c_k$这一类中每个维度的取值为$x^{(i)}$的概率的乘积。 +上式的意思是在类别是$c_k$的前提下,X 这一 n 维随机变量的取值为 x 的概率,就是$c_k$这一类中每个维度的取值为$x^{(i)}$的概率的乘积。 学习到了联合概率分布之后,我们在分类的时候直接使用最大后验概率: $$ y = \underset{c_k}{\operatorname{arg max}} P(Y = c_k) \prod_{i=1}^{n}P(X^{(i)} = x^{(i)}| Y = c_k) -$$ +$$ -上式的意思就是假设x的类别是$c_k$,计算每个$c_k$这一类中出现x的概率,找出概率最大的那一类作为x的分类。 +上式的意思就是假设 x 的类别是$c_k$,计算每个$c_k$这一类中出现 x 的概率,找出概率最大的那一类作为 x 的分类。 -??? example "PPT中的一个分类实例" +??? example "PPT 中的一个分类实例" ![](images/Naive_Bayesian/2023-11-21-16-12-56.png#pic) ## 极大似然估计 @@ -40,9 +40,9 @@ $$ 指示函数的定义在[:octicons-link-16:前面](https://stormckey.github.io/Note/Data%20Modeling/KNN/#_1)已经有介绍,后续都默认使用这一定义。 -第一式的意思是不同类别的出现概率的先验概率直接为样本中该类别出现的频率。 +第一式的意思是不同类别的出现概率的先验概率直接为样本中该类别出现的频率。 -第二式的意思是在类别为$c_k$的前提下,第i维取值为$a_{jl}$的概率为样本中$c_k$类中该分量为$a_{jl}$的样本占$c_k$类样本总数的比重。 +第二式的意思是在类别为$c_k$的前提下,第 i 维取值为$a_{jl}$的概率为样本中$c_k$类中该分量为$a_{jl}$的样本占$c_k$类样本总数的比重。 !!! note "思想" 极大似然估计在此处的结果基本上可以简单归结为:用频率估计概率 @@ -51,16 +51,16 @@ $$ 上述的极大似然估计在一个情况下可能遇到问题,如果某个样本没有出现的话,对那个类别估计的信息完全丢失。 -为解决这一问题,我们可以手动为每一类别添加默认n次的出现频数: +为解决这一问题,我们可以手动为每一类别添加默认 n 次的出现频数: \begin{aligned} &P(Y = c_k) = \frac{\sum_{i=1}^{N}I(y_i = c_k) + \lambda}{N + K\lambda} \\ &P(X^{(i)} = a_{jl}| Y = c_k) = \frac{\sum_{i=1}^{N}I(x_i^{(i)} = a_{jl},y_i = c_k) + \lambda}{\sum_{i=1}^{N}I(y_i = c_k) + S_i\lambda} \end{aligned} -其中$S_i$是第i维的取值个数,$\lambda$是一个超参数,一般取1。 +其中$S_i$是第 i 维的取值个数,$\lambda$是一个超参数,一般取 1。 -在第一式中,我们为每个类别都加入了$\lambda$的频率,所以分子单独某类的频数加上了$\lambda$,分母加上了总类别数K乘上$\lambda$。 +在第一式中,我们为每个类别都加入了$\lambda$的频率,所以分子单独某类的频数加上了$\lambda$,分母加上了总类别数 K 乘上$\lambda$。 在第二式中,我们为每个类别的每个维度都加入了$\lambda$的频率,所以分子单独某类的频数加上了$\lambda$,分母加上了该维度可能的取值个数数乘上$\lambda$(因为有多少个取值,我们就人为的加上了多少个$\lambda$)。 diff --git a/docs/Note/Data Modeling/Perceptron.md b/docs/Note/Data Modeling/Perceptron.md index a6858167..f9b78e08 100644 --- a/docs/Note/Data Modeling/Perceptron.md +++ b/docs/Note/Data Modeling/Perceptron.md @@ -10,7 +10,7 @@ comments: true !!! example "" ![](images/Perceptron/2023-11-20-11-24-41.png#pic) -下面给出形式化表述: +下面给出形式化表述: !!! note "感知机" 给定数据集$\{(x_i,y_i)\}$,其中$y_i \in \{1,-1\}$是数据标签,我们需要找到一组$(w,b)$使得函数$f(x) = sign(w \cdot x + b)$的损失函数最小: @@ -30,9 +30,9 @@ $$ \right. $$ -可以看出,如果$y_i$和$f(x)$若是符号相同(也就是分类正确),那么$y_i(w \cdot x_i + b)$的值就是1,反之则是-1。因此我们的目标就是尽可能最大化所有$y_i(w \cdot x_i + b)$求和的值,这也等效于最小化其负数。(该领域约定俗成就是写成最小化优化目标,最小化和最大化之间只要加一个负号就可以互相转化) +可以看出,如果$y_i$和$f(x)$若是符号相同(也就是分类正确),那么$y_i(w \cdot x_i + b)$的值就是 1,反之则是-1。因此我们的目标就是尽可能最大化所有$y_i(w \cdot x_i + b)$求和的值,这也等效于最小化其负数。(该领域约定俗成就是写成最小化优化目标,最小化和最大化之间只要加一个负号就可以互相转化) -我们可以用SGD(Stochastic Gradient Descent)来求解上述问题,损失函数的梯度为: +我们可以用 SGD(Stochastic Gradient Descent)来求解上述问题,损失函数的梯度为: \begin{aligned} &\nabla_w L(w,b) = - \sum_{i=1}^{n} y_i x_i \\ @@ -42,7 +42,7 @@ $$ 从数据集中随机选取一个样本$(x_i,y_i)$,更新参数: \begin{aligned} - & w = w + \eta y_i x_i\\ + & w = w + \eta y_i x_i\\ & b = b + \eta y_i \\ \end{aligned} @@ -50,7 +50,7 @@ $$ ## 收敛性 -可以证明,感知机的误分类次数K存在一个上界,即; +可以证明,感知机的误分类次数 K 存在一个上界,即; \begin{aligned} & K \leq (\frac{R}{\gamma})^2 \\ @@ -70,9 +70,9 @@ $$ & b = \sum \eta y_i \end{aligned} -其中$\eta$是学习率。因为我们是从0开始每次都往参数上加一定的更新值,所以上式自然成立。 +其中$\eta$是学习率。因为我们是从 0 开始每次都往参数上加一定的更新值,所以上式自然成立。 -假设其中第i个数据点在SGD中被随机选中了$n_i$次,那么它因此导致了$n_i$次参数的更新,我们可以把上式写成: +假设其中第 i 个数据点在 SGD 中被随机选中了$n_i$次,那么它因此导致了$n_i$次参数的更新,我们可以把上式写成: \begin{aligned} & w = \sum_{i=1}^{n} \eta n_i y_i x_i \\ @@ -92,17 +92,17 @@ $$ f(x) = sign(\sum_{i=1}^{n}\alpha_i y_i( x_i \cdot x ) + \sum_{i=1}^{n}\alpha_i y_i) $$ -每步SGD中我们只需要更新$\alpha_i$: +每步 SGD 中我们只需要更新$\alpha_i$: $$ \alpha_i = \alpha_i + \eta $$ -可以看到我们的分类函数中只有$\alpha_i$需要每次更新,除此之外还有大量的x的内积运算,为了方便,我们可以把x的内积预先计算出来,这被称作Gram矩阵: +可以看到我们的分类函数中只有$\alpha_i$需要每次更新,除此之外还有大量的 x 的内积运算,为了方便,我们可以把 x 的内积预先计算出来,这被称作 Gram 矩阵: -!!! info "Gram矩阵" - 给定n个向量$x_1,x_2,...,x_n$,那么Gram矩阵$G$是由这些向量所有可能的内积组成的矩阵,即: +!!! info "Gram 矩阵" + 给定 n 个向量$x_1,x_2,...,x_n$,那么 Gram 矩阵$G$是由这些向量所有可能的内积组成的矩阵,即: $$ g_{ij} = x_i \cdot x_j - $$ \ No newline at end of file + $$ diff --git a/docs/Note/Data Modeling/Support_Vector_Machine.md b/docs/Note/Data Modeling/Support_Vector_Machine.md index 950316eb..ab30a9d6 100644 --- a/docs/Note/Data Modeling/Support_Vector_Machine.md +++ b/docs/Note/Data Modeling/Support_Vector_Machine.md @@ -5,33 +5,33 @@ comments: true # 支持向量机 !!! warning - 很多人都吐槽,支持向量机这个名字起的依托 + 很多人都吐槽,支持向量机这个名字起的依托 ## 模型描述 -对于数据集$\{(x_i,y_i)\}$,其中$x_i \in \mathbb{R}^n, y \in \{1,-1\}$,我们希望找到一个超平面$w\cdot x + b = 0$将数据集分开. +对于数据集$\{(x_i,y_i)\}$,其中$x_i \in \mathbb{R}^n, y \in \{1,-1\}$,我们希望找到一个超平面$w\cdot x + b = 0$将数据集分开。 !!! info "实例点到超平面的几何间隔" $$ \gamma_i = \frac{y_i(w\cdot x_i + b)}{\|w\|} $$ - 可以看出,其绝对值也就是点到直线距离 + 可以看出,其绝对值也就是点到直线距离 !!! info "实例点到超平面的函数间隔" $$ \hat{\gamma_i} = y_i(w\cdot x_i + b) $$ - 可以看出,其绝对值也就是函数间隔除去了$||w||$这个因素 + 可以看出,其绝对值也就是函数间隔除去了$||w||$这个因素 ![](images/Support_Vector_Machine/2023-11-25-23-37-51.png#pic) -上述的变量的绝对值含义都表示某种距离,而符号表示分类正确与否,分类正确时间隔为正,分类错误时间隔为负 +上述的变量的绝对值含义都表示某种距离,而符号表示分类正确与否,分类正确时间隔为正,分类错误时间隔为负 -给定一组数据点和一个超平面,我们可以计算出各个函数间隔和几何间隔.但是如果我们成比例的同时放缩w和b,那么超平面和几何间隔都完全不变,但是所有点的函数间隔都会随着w的变化而变化,因为函数间隔其实就是几何间隔(不变)乘上w的模(正在被成比例放缩) +给定一组数据点和一个超平面,我们可以计算出各个函数间隔和几何间隔.但是如果我们成比例的同时放缩 w 和 b,那么超平面和几何间隔都完全不变,但是所有点的函数间隔都会随着 w 的变化而变化,因为函数间隔其实就是几何间隔(不变)乘上 w 的模(正在被成比例放缩) -为了提高分类的确信度和泛化能力,我们希望最大化最小几何间隔,也就是尽量提高所有点到超平面的距离的下界,也就是让所有点都尽可能离超平面远一点(离超平面很近的话,稍微有一点扰动就容易被分成另一类) +为了提高分类的确信度和泛化能力,我们希望最大化最小几何间隔,也就是尽量提高所有点到超平面的距离的下界,也就是让所有点都尽可能离超平面远一点(离超平面很近的话,稍微有一点扰动就容易被分成另一类) 于是我们写出优化目标 @@ -49,14 +49,14 @@ comments: true s.t. & \quad y_i(w\cdot x_i + b) \geq \hat{\gamma}, i = 1,2,...,N \\ \end{aligned} -因为我们可以通过成比例的放缩w和b来调节$\hat{\gamma}$,我们就放缩$w$使得$\hat{\gamma} = 1$,上述优化目标转化为 +因为我们可以通过成比例的放缩 w 和 b 来调节$\hat{\gamma}$,我们就放缩$w$使得$\hat{\gamma} = 1$,上述优化目标转化为 \begin{aligned} \underset {w,b}{\operatorname{max}} & \quad \frac{1}{\|w\|} \\ s.t. & \quad y_i(w\cdot x_i + b) \geq 1, i = 1,2,...,N \\ \end{aligned} -求解上述优化问题可得到最优解$w^*,b^*$,构成最优分离超平面,可以证明,该超平面存在且唯一,那些离超平面最近的点就被称为支持向量 +求解上述优化问题可得到最优解$w^*,b^*$,构成最优分离超平面,可以证明,该超平面存在且唯一,那些离超平面最近的点就被称为支持向量 ## 模型求解 @@ -64,13 +64,13 @@ comments: true #### 写出对偶问题 -拉格朗日函数为: +拉格朗日函数为: $$ L(w,b,\alpha) = \frac{1}{2}||w||^2 - \sum_{i=1}^{N}\alpha_iy_i(w\cdot x_i + b) + \sum_{i=1}^{N}\alpha_i $$ -我们将最小最大问题转化为最大最小问题,写出对偶问题: +我们将最小最大问题转化为最大最小问题,写出对偶问题: $$ \underset {\alpha}{\operatorname{min}} \underset {w,b}{\operatorname{max}} L(w,b,\alpha) \rightarrow \underset {\alpha}{\operatorname{min}} \underset {w,b}{\operatorname{max}} L(w,b,\alpha) @@ -85,7 +85,7 @@ $$ & 0 = \sum_{i=1}^{N}\alpha_i y_i \\ \end{aligned} -带回原式中,得到: +带回原式中,得到: $$ L(w,b,\alpha) = \sum_{i=1}^{N}\alpha_i - \frac{1}{2}\sum_{i=1}^{N}\sum_{j=1}^{N}\alpha_i\alpha_jy_iy_j(x_i\cdot x_j) @@ -93,7 +93,7 @@ $$ #### 极大化 -在极小化之后,剩下的问题就是 +在极小化之后,剩下的问题就是 \begin{aligned} \underset {\alpha}{\operatorname{max}} & \quad L(\alpha) = \sum_{i=1}^{N}\alpha_i - \frac{1}{2}\sum_{i=1}^{N}\sum_{j=1}^{N}\alpha_i\alpha_jy_iy_j(x_i\cdot x_j) \\ @@ -101,13 +101,13 @@ $$ & \quad \alpha_i \geq 0, i = 1,2,...,N \\ \end{aligned} -通过某种方式求解上述问题,我们得到最优解$\alpha^*$ +通过某种方式求解上述问题,我们得到最优解$\alpha^*$ ### 原始问题 -#### 应用KKT条件 +#### 应用 KKT 条件 -有了对偶问题的最优解$\alpha^* = (\alpha_1^*,\alpha_2^*,...,\alpha_N^*)$,应用KKT条件: +有了对偶问题的最优解$\alpha^* = (\alpha_1^*,\alpha_2^*,...,\alpha_N^*)$,应用 KKT 条件: \begin{align} & \alpha_i^* \geq 0 \tag{1}\\ @@ -117,13 +117,13 @@ $$ & \nabla_b L(w^*,b^*,\alpha^*) = \sum_{i=1}^{N}\alpha_i^* y_i = 0 \tag{5}\\ \end{align} -若$\alpha^* = 0$,由(4)可以推出$w^* = 0$,显然不对,所以$\alpha^*$不全为零 +若$\alpha^* = 0$,由(4)可以推出$w^* = 0$,显然不对,所以$\alpha^*$不全为零 -若$\alpha_i^* > 0$,由(3)可以推出$y_i(w^*\cdot x_i + b^*) = 1$,回忆前文我们已经令$\hat{\gamma} = 1$,所以j的函数间隔跟最小函数间隔相等,每个j都因此成为一个支持向量,其中既有正例也有反例 +若$\alpha_i^* > 0$,由(3)可以推出$y_i(w^*\cdot x_i + b^*) = 1$,回忆前文我们已经令$\hat{\gamma} = 1$,所以 j 的函数间隔跟最小函数间隔相等,每个 j 都因此成为一个支持向量,其中既有正例也有反例 -#### 求最优w,b +#### 求最优 w,b -利用支持向量,我们可以得到 +利用支持向量,我们可以得到 \begin{align} & w^* = \sum_{i=1}^{N}\alpha_i^* y_i x_i \\ @@ -132,33 +132,33 @@ $$ #### 得到分离函数 -利用最优解,我们可以得到分离函数 +利用最优解,我们可以得到分离函数 $$ f(x) = sign(\sum_{i=1}^{N}\alpha_i^* y_i (x_i\cdot x) + b^*) $$ -以上便是求解二次规划问题得到最优间隔超平面的方法,其中只有对偶问题中的求的最优$\alpha^*$的方法没有阐明,后面会给出 +以上便是求解二次规划问题得到最优间隔超平面的方法,其中只有对偶问题中的求的最优$\alpha^*$的方法没有阐明,后面会给出 ## 软间隔 -一般而言,由于噪声的干扰,我们很难直接拿到一个线性可分的数据集,而是一个近似线性可分的数据集,我们去掉大部分的噪点后可以做到线性可分,但是这些噪点实际上是跑到了支持向量以内甚至超平面对面的,这意味着 +一般而言,由于噪声的干扰,我们很难直接拿到一个线性可分的数据集,而是一个近似线性可分的数据集,我们去掉大部分的噪点后可以做到线性可分,但是这些噪点实际上是跑到了支持向量以内甚至超平面对面的,这意味着 $$ y_i(w\cdot x_i + b) \geq 1 - \xi_i \quad i = 1,2,...,N (\xi_i \geq 0 ) $$ -也就是说, 并非所有点的函数间隔都大于1了(函数间隔为1的是支持向量,不大于一就位于支持向量以内了), +也就是说,并非所有点的函数间隔都大于 1 了(函数间隔为 1 的是支持向量,不大于一就位于支持向量以内了), -当然,我们不能允许无限制的松弛,不然所谓的其他向量都可以随意跑到支持向量以内的话,支持向量也就没有意义的,我们进形正则化 +当然,我们不能允许无限制的松弛,不然所谓的其他向量都可以随意跑到支持向量以内的话,支持向量也就没有意义的,我们进形正则化 $$ \underset {w,b,\xi}{\operatorname{min}} \quad \frac{1}{2}||w||^2 + C\sum_{i=1}^{N}\xi_i \\ $$ -其中的C是一个我们手动设置的惩罚参数 +其中的 C 是一个我们手动设置的惩罚参数 -我们的对偶问题随之变成: +我们的对偶问题随之变成: \begin{aligned} \underset {\alpha}{\operatorname{max}} & \quad L(\alpha) = \sum_{i=1}^{N}\alpha_i - \frac{1}{2}\sum_{i=1}^{N}\sum_{j=1}^{N}\alpha_i\alpha_jy_iy_j(x_i\cdot x_j) \\ @@ -166,7 +166,7 @@ $$ & \quad 0 \leq \alpha_i \leq C, i = 1,2,...,N \\ \end{aligned} -其中由于松弛条件,我们极小化的过程中新增了以下的约束: +其中由于松弛条件,我们极小化的过程中新增了以下的约束: \begin{aligned} \nabla_{\xi_i} L(w,b,\alpha,\xi) = C - \alpha_i - \mu_i = 0 \quad i = 1,2,...,N \\ @@ -175,24 +175,24 @@ $$ 这也是上述条件中出现$\alpha_i \leq C$的原因 -同样求解最优解$\alpha^*$,然后带回原式,得到最优解$w^*,b^*,\xi^*$,构成最优分离超平面 +同样求解最优解$\alpha^*$,然后带回原式,得到最优解$w^*,b^*,\xi^*$,构成最优分离超平面 -那些被松弛的点的位置和$\xi$的的关系为: +那些被松弛的点的位置和$\xi$的的关系为: ![](images/Support_Vector_Machine/2023-11-26-00-47-33.png#pic) - + ## 核函数 -我们想要把点$x, z \in \mathbb{R}^n$映射到一个更高维的空间,也就是($\phi(x)$被映射到更高维),在这个映射中,我们需要保证高维空间中二者的点积是原空间中点积的函数,也就是 +我们想要把点$x, z \in \mathbb{R}^n$映射到一个更高维的空间,也就是($\phi(x)$被映射到更高维),在这个映射中,我们需要保证高维空间中二者的点积是原空间中点积的函数,也就是 $$ K(x,z) = \phi(x)\cdot \phi(z) $$ -一般而言,给定这个把原内积映射到高维内积的K就可以了,不用具体给出把向量映射到高位向量的$\phi()$ +一般而言,给定这个把原内积映射到高维内积的 K 就可以了,不用具体给出把向量映射到高位向量的$\phi()$ -在对偶问题中,我们注意到$x_i$之间只有内积,所以我们就直接用映射后的高位内积进行替换 +在对偶问题中,我们注意到$x_i$之间只有内积,所以我们就直接用映射后的高位内积进行替换 $$ \underset {\alpha}{\operatorname{max}} \quad L(\alpha) = \sum_{i=1}^{N}\alpha_i - \frac{1}{2}\sum_{i=1}^{N}\sum_{j=1}^{N}\alpha_i\alpha_jy_iy_jK(x_i,x_j) \\ @@ -211,15 +211,15 @@ $$ K(x,z) = \exp(-\frac{||x-z||^2}{2\sigma^2}) $$ -## SMO算法 +## SMO 算法 -最后我们给出SMO算法,这是一种具体求解上述的$\alpha^*$的数值方法. +最后我们给出 SMO 算法,这是一种具体求解上述的$\alpha^*$的数值方法。 -输入: 数据集$D = \{(x_i,y_i)\}$,核函数$K(x,z)$,容忍度$\epsilon$ +输入:数据集$D = \{(x_i,y_i)\}$,核函数$K(x,z)$,容忍度$\epsilon$ - 初始化$\alpha = 0$,k = 0 -- 取优化变量$\alpha_1,\alpha_2$,解析求解最优化问题,更新$\alpha_1,\alpha_2$ -- 若在容忍度$\epsilon$内满足: +- 取优化变量$\alpha_1,\alpha_2$,解析求解最优化问题,更新$\alpha_1,\alpha_2$ +- 若在容忍度$\epsilon$内满足: \begin{aligned} & \sum_{i=1}^{N}\alpha_i y_i = 0 \\ diff --git a/docs/Note/Data Modeling/index.md b/docs/Note/Data Modeling/index.md index e6c3c837..ca368382 100644 --- a/docs/Note/Data Modeling/index.md +++ b/docs/Note/Data Modeling/index.md @@ -4,11 +4,11 @@ comments: true # 数据建模与分析 !!! info "课程信息" - 授课教师:郭正初 - 开科学院:数学科学学院 - 开课学期:2023年春夏 - 预修要求:微积分,线性代数,概率论 - 教材: 统计学习方法 李航 第二版 + 授课教师:郭正初 + 开科学院:数学科学学院 + 开课学期:2023 年春夏 + 预修要求:微积分,线性代数,概率论 + 教材: 统计学习方法 李航 第二版 -本门课程主要聚焦于机器学习的算法讲解与分析,并且大部分机器学习的方法仍属于统计学习而非深度学习的范畴,比较传统。 -本门课程为数学科学学院开设,数学气息比较浓厚。 \ No newline at end of file +本门课程主要聚焦于机器学习的算法讲解与分析,并且大部分机器学习的方法仍属于统计学习而非深度学习的范畴,比较传统。 +本门课程为数学科学学院开设,数学气息比较浓厚。 diff --git a/docs/Note/Missing Semester/Data.md b/docs/Note/Missing Semester/Data.md index 51b9a5bd..70d8e7de 100644 --- a/docs/Note/Missing Semester/Data.md +++ b/docs/Note/Missing Semester/Data.md @@ -3,41 +3,41 @@ !!! abstract "本节列举一些命令行常用的数据处理工具" ## Sed -Sed是 Stream editor 流编辑器,可以接受管道输入,对每一行进行处理,然后输出到标准输出。 +Sed 是 Stream editor 流编辑器,可以接受管道输入,对每一行进行处理,然后输出到标准输出。 ``` sed [OPTION] 'edit-command' [input-file]` ``` -选项是一些用于控制 sed 命令行为的参数,常见的有: +选项是一些用于控制 sed 命令行为的参数,常见的有: -- `-n` 不输出到标准输出 -- `-e` 以后的参数作为脚本 -- `-f` 以后的参数作为脚本文件 -- `-i` 直接修改文件 -- `-r` 使用扩展正则表达式 -- `-E` 同上 -- `-r` 使用基础正则表达式 -- `-h` 不打印文件名 - -`sed`的编辑命令可以使用正则表达式来指定匹配模式,并通过替换、删除、插入等命令来修改文本。一些常见的 sed 编辑命令包括: +- `-n` 不输出到标准输出 +- `-e` 以后的参数作为脚本 +- `-f` 以后的参数作为脚本文件 +- `-i` 直接修改文件 +- `-r` 使用扩展正则表达式 +- `-E` 同上 +- `-r` 使用基础正则表达式 +- `-h` 不打印文件名 -- s/pattern/replacement/:替换指定模式的文本。 -- d:删除匹配到的行。 -- p:打印(输出)匹配到的行。 -- i:在指定行前插入文本。 -- a:在指定行后追加文本。 +`sed`的编辑命令可以使用正则表达式来指定匹配模式,并通过替换、删除、插入等命令来修改文本。一些常见的 sed 编辑命令包括: + +- s/pattern/replacement/:替换指定模式的文本。 +- d:删除匹配到的行。 +- p:打印(输出)匹配到的行。 +- i:在指定行前插入文本。 +- a:在指定行后追加文本。 ??? info "正则表达式" - 正则表达式可以实现字符串匹配,大部分字符都保持愿意除了一些特殊的 - `.` 代表除了换行任何的单字符 - - `*` 前一个重复0-无限次 - - `+` 前一个重复1-无限次 - - `[abc]` abc任意一个 + - `*` 前一个重复 0-无限次 + - `+` 前一个重复 1-无限次 + - `[abc]` abc 任意一个 - `(RX1|RX2)` 表达式一或者二 - `^` 行首 - `$` 行尾 - - `()` 捕获,位于补货内的字符串可在被替代部分用\1 \2 \3 引用 + - `()` 捕获,位于补货内的字符串可在被替代部分用、1 \2 \3 引用 ## Awk `awk` 是一种强大的文本处理工具,用于从结构化文本数据中提取和操作信息。它可以逐行读取输入文件或标准输入的文本,根据指定的模式和动作进行匹配、处理和输出。 @@ -65,7 +65,7 @@ awk 'pattern { action }' file awk -F':' '{ print $1, $2 }' file.txt ``` -`awk` 是一种非常实用的文本处理工具,适用于处理结构化的文本数据,如日志文件、CSV文件、报告等。它具有强大的功能和灵活性,可以大大简化文本处理任务,提高数据分析和转换的效率。 +`awk` 是一种非常实用的文本处理工具,适用于处理结构化的文本数据,如日志文件、CSV 文件、报告等。它具有强大的功能和灵活性,可以大大简化文本处理任务,提高数据分析和转换的效率。 ## Aided Command line Tools @@ -77,4 +77,4 @@ awk -F':' '{ print $1, $2 }' file.txt - head: 截取尾部几条 - paste: 通过指定的间隔字符链连接两行 - bc: 计算器 - - xargs: 把stdin转换为参数调用后续程序 \ No newline at end of file + - xargs: 把 stdin 转换为参数调用后续程序 diff --git a/docs/Note/Missing Semester/Git.md b/docs/Note/Missing Semester/Git.md index cdacab7c..d876fb33 100644 --- a/docs/Note/Missing Semester/Git.md +++ b/docs/Note/Missing Semester/Git.md @@ -8,34 +8,34 @@ comments: true !!! info "定义" `blob` - : 一个文件被称作**blob**. + : 一个文件被称作**blob**. `tree` - : 一个文件夹被称作**tree**. + : 一个文件夹被称作**tree**. `commit` - : 整个仓库的快照被称作**commit**. + : 整个仓库的快照被称作**commit**. `history` - : commit的有向无环图构成**history**. + : commit 的有向无环图构成**history**. `object` - : 一个**object**是blob、tree或者commit,每个对象都有自己对应的hash. + : 一个**object**是 blob、tree 或者 commit,每个对象都有自己对应的 hash. `reference` - : 一个**reference**是一个对象的别名,除了别名,我们还可以通过hash来引用一个对象. + : 一个**reference**是一个对象的别名,除了别名,我们还可以通过 hash 来引用一个对象。 `main/master` - : **main/master** 作为一个特殊的reference总是指向开发中的最新稳定版本. + : **main/master** 作为一个特殊的 reference 总是指向开发中的最新稳定版本。 `HEAD` - : **HEAD** 作为一个特殊引用指向我们目前在历史中的位置. + : **HEAD** 作为一个特殊引用指向我们目前在历史中的位置。 `Git repository` - : 一个 **Git repository*** 是object和reference的集合. + : 一个 **Git repository*** 是 object 和 reference 的集合。 `Staging area` - : **Staging area** 是一种机制来让我们指定哪些对象要被commit, 而非整个仓库. + : **Staging area** 是一种机制来让我们指定哪些对象要被 commit, 而非整个仓库。 ## Git Data Model 首先定义数据对象 @@ -56,9 +56,9 @@ type commit = struct { //An object is a blob,tree,or commit type object = blob | tree | commit -``` +``` -在Git存储结构中,每个对象对应一个hash +在 Git 存储结构中,每个对象对应一个 hash ``` objects = map @@ -98,35 +98,35 @@ def load(id): !!! info "More on rebase" Commonly used to "move" an entire branch to another base, creating copies of the commits in the new location. - - Rebase the current branch on top of another specified branch: + - Rebase the current branch on top of another specified branch: `git rebase new_base_branch` - - Start an interactive rebase, which allows the commits to be reordered, omitted, combined or modified: + - Start an interactive rebase, which allows the commits to be reordered, omitted, combined or modified: `git rebase -i target_base_branch_or_commit_hash` - - Continue a rebase that was interrupted by a merge failure, after editing conflicting files: + - Continue a rebase that was interrupted by a merge failure, after editing conflicting files: `git rebase --continue` - - Continue a rebase that was paused due to merge conflicts, by skipping the conflicted commit: + - Continue a rebase that was paused due to merge conflicts, by skipping the conflicted commit: `git rebase --skip` - - Abort a rebase in progress (e.g. if it is interrupted by a merge conflict): + - Abort a rebase in progress (e.g. if it is interrupted by a merge conflict): `git rebase --abort` - - Move part of the current branch onto a new base, providing the old base to start from: + - Move part of the current branch onto a new base, providing the old base to start from: `git rebase --onto new_base old_base` - - Reapply the last 5 commits in-place, stopping to allow them to be reordered, omitted, combined or modified: + - Reapply the last 5 commits in-place, stopping to allow them to be reordered, omitted, combined or modified: `git rebase -i HEAD~5` - - Auto-resolve any conflicts by favoring the working branch version (`theirs` keyword has reversed meaning in this case): + - Auto-resolve any conflicts by favoring the working branch version (`theirs` keyword has reversed meaning in this case): `git rebase -X theirs branch_name` !!! info "Remotes" - `git remote`: list remotes - - `git remote add `: add a remote ;name is origin by convention if we have only one remote; url can be a web address or a local directory + - `git remote add `: add a remote ;name is origin by convention if we have only one remote; url can be a web address or a local directory - `git push :`: send objects to remote, and update remote reference - `git branch --set-upstream-to=/`: set up correspondence between local and remote branch - - `git fetch`: retrieve objects/references from a remote; be aware of the changes pushed here from the remote + - `git fetch`: retrieve objects/references from a remote; be aware of the changes pushed here from the remote - `git pull`: same as git fetch; git merge - `git clone`: download repository from remote !!! info "Undo" @@ -141,4 +141,4 @@ def load(id): - `git blame`: show who last edited which line - `git stash`: temporarily remove modifications to working directory - `git bisect`: binary search history (e.g. for regressions) - - `.gitignore`: specify intentionally untracked files to ignore \ No newline at end of file + - `.gitignore`: specify intentionally untracked files to ignore diff --git a/docs/Note/Missing Semester/Shell.md b/docs/Note/Missing Semester/Shell.md index a9b33bb3..910bd8aa 100644 --- a/docs/Note/Missing Semester/Shell.md +++ b/docs/Note/Missing Semester/Shell.md @@ -10,17 +10,17 @@ comments: true !!! tip "" === "$0" - 当前脚本的名称。对于被执行的脚本,它是脚本文件的路径和名称。 + 当前脚本的名称。对于被执行的脚本,它是脚本文件的路径和名称。 === "$1, $2, $3, ..." - 位置参数变量,表示脚本或函数的参数。$1表示第一个参数,$2表示第二个参数,依此类推。 + 位置参数变量,表示脚本或函数的参数。$1 表示第一个参数,$2 表示第二个参数,依此类推。 === "$@" 表示所有位置参数的列表。在脚本中,可以使用"$@"将所有位置参数作为一个参数传递给其他命令或函数。 === "$#" 表示位置参数的数量。 === "$?" - 上一个命令的退出状态。如果命令成功执行,则其值为0,否则为非零值。 + 上一个命令的退出状态。如果命令成功执行,则其值为 0,否则为非零值。 === "$$" - 当前脚本的进程ID(PID)。 + 当前脚本的进程 ID(PID)。 === "$USER" 当前用户的用户名。 === "$HOME" @@ -34,7 +34,7 @@ comments: true === "$IFS" 内部字段分隔符,用于指定由哪个字符分割输入数据的字段。默认情况下,它包含空格、制表符和换行符。 === "$PATH" - 一个由冒号分隔的目录列表(环境变量),shell在其中查找命令。 + 一个由冒号分隔的目录列表(环境变量),shell 在其中查找命令。 ### 重定向 @@ -56,29 +56,29 @@ comments: true !!! tip "" === "文件类型" - -:普通文件 - d:目录 - l:符号链接(软链接) - c:字符设备文件 - b:块设备文件 - s:套接字(socket)文件 - p:命名管道(FIFO)文件 + -:普通文件 + d:目录 + l:符号链接(软链接) + c:字符设备文件 + b:块设备文件 + s:套接字(socket)文件 + p:命名管道(FIFO)文件 === "权限" - r:读取权限 - w:写入权限 - x:执行权限 + r:读取权限 + w:写入权限 + x:执行权限 === "权限字符串" - 由10个字符组成,第一个字符表示文件类型,后面三个字符表示文件所有者的权限,再后面三个字符表示文件所属组的权限,最后三个字符表示其他用户的权限。 + 由 10 个字符组成,第一个字符表示文件类型,后面三个字符表示文件所有者的权限,再后面三个字符表示文件所属组的权限,最后三个字符表示其他用户的权限。 例如,-rw-r--r--表示普通文件,文件所有者具有读取和写入权限,文件所属组和其他用户具有读取权限。 === "权限数字" - 由三个八进制数字组成,每个数字表示文件所有者、文件所属组和其他用户的权限。 - 每个数字的计算方法是将对应的三个权限转换为八进制数拼接起来。 - 例如,-rw-r--r--对应的权限数字为644,-rwxr-xr-x对应的权限数字为755。 + 由三个八进制数字组成,每个数字表示文件所有者、文件所属组和其他用户的权限。 + 每个数字的计算方法是将对应的三个权限转换为八进制数拼接起来。 + 例如,-rw-r--r--对应的权限数字为 644,-rwxr-xr-x 对应的权限数字为 755。 === "权限修改" - `chmod`:用于更改文件或目录的权限。可以使用数字表示法(如chmod 755 file.txt)或符号表示法(如chmod u+x file.txt)来修改权限。 - `chown`:用于更改文件或目录的所有者。 - `chgrp`:用于更改文件或目录的所属组。 - `umask`:设置新创建文件和目录的默认权限掩码。 + `chmod`:用于更改文件或目录的权限。可以使用数字表示法(如 chmod 755 file.txt)或符号表示法(如 chmod u+x file.txt)来修改权限。 + `chown`:用于更改文件或目录的所有者。 + `chgrp`:用于更改文件或目录的所属组。 + `umask`:设置新创建文件和目录的默认权限掩码。 ### 文件操作 @@ -87,23 +87,23 @@ comments: true ``` command | tee [OPTION]... [FILE]... ``` - `tee`是一个常用的命令行工具,用于从标准输入读取数据并将其同时输出到标准输出和指定的文件中。 - 常用选项包括: - -a:以追加模式将输出附加到文件中,而不是覆盖文件内容。 - -i:忽略中断信号(SIGINT),即使收到中断信号也继续运行。 - -p:使用原始数据块大小,而不是按行缓冲输出。 - -u:禁用输出缓冲区,立即将数据写入文件。 + `tee`是一个常用的命令行工具,用于从标准输入读取数据并将其同时输出到标准输出和指定的文件中。 + 常用选项包括: + -a:以追加模式将输出附加到文件中,而不是覆盖文件内容。 + -i:忽略中断信号(SIGINT),即使收到中断信号也继续运行。 + -p:使用原始数据块大小,而不是按行缓冲输出。 + -u:禁用输出缓冲区,立即将数据写入文件。 === "`touch`" ``` touch [OPTION]... FILE... ``` - 创建一个空文件,或者更新已存在文件的最后更改时间。 - 常用选项包括: - -a:仅更改访问时间。 - -c:仅在文件不存在时才创建文件。 - -d:使用指定的日期时间,而不是当前时间。 - -m:仅更改修改时间。 - -r:使用指定文件的日期时间,而不是当前时间。 + 创建一个空文件,或者更新已存在文件的最后更改时间。 + 常用选项包括: + -a:仅更改访问时间。 + -c:仅在文件不存在时才创建文件。 + -d:使用指定的日期时间,而不是当前时间。 + -m:仅更改修改时间。 + -r:使用指定文件的日期时间,而不是当前时间。 -t:使用指定的日期时间,而不是当前时间。 === "`cat`" ``` @@ -211,12 +211,12 @@ comments: true ### SheBang -Bash脚本通常以shebang作为脚本文件的第一行,指定要用于解释脚本的解释器。常见的shebang为#!/bin/bash,表示使用Bash解释器解释脚本。 +Bash 脚本通常以 shebang 作为脚本文件的第一行,指定要用于解释脚本的解释器。常见的 shebang 为#!/bin/bash,表示使用 Bash 解释器解释脚本。 !!! tip "环境变量路径" - 如果要在脚本中使用shebang,最好使用`#!/usr/bin/env bash`,这样可以避免使用绝对路径,而是使用环境变量中的路径。 + 如果要在脚本中使用 shebang,最好使用`#!/usr/bin/env bash`,这样可以避免使用绝对路径,而是使用环境变量中的路径。 ### 变量 -Bash脚本中的变量不需要声明,直接使用即可。变量名和等号之间不能有空格,等号后面的值不能使用空格包围。变量名一般使用大写字母,但是不是必须的。 +Bash 脚本中的变量不需要声明,直接使用即可。变量名和等号之间不能有空格,等号后面的值不能使用空格包围。变量名一般使用大写字母,但是不是必须的。 ### 命令替换 @@ -265,21 +265,21 @@ Bash脚本中的变量不需要声明,直接使用即可。变量名和等号 - `[:graph:]`:匹配任意一个图形字符。 - `[:print:]`:匹配任意一个可打印字符。 - `[:cntrl:]`:匹配任意一个控制字符。 -- `[:ascii:]`:匹配任意一个ASCII字符。 +- `[:ascii:]`:匹配任意一个 ASCII 字符。 ### 算术运算 -Bash脚本中的算术运算使用`$((expression))`语法,例如:`echo $((1+1))` +Bash 脚本中的算术运算使用`$((expression))`语法,例如:`echo $((1+1))` ### 逻辑运算 -Bash脚本中的逻辑运算使用`&&`、`||`和`!`,例如:`[ -d /tmp ] && echo "Directory exists"` +Bash 脚本中的逻辑运算使用`&&`、`||`和`!`,例如:`[ -d /tmp ] && echo "Directory exists"` ### 条件判断 -Bash脚本中的条件判断使用`if`语句,语法如下: +Bash 脚本中的条件判断使用`if`语句,语法如下: -``` +``` if [[ condition ]]; then #statements elif [[ condition ]]; then @@ -291,7 +291,7 @@ fi ### 循环 -Bash脚本中的循环使用`for`和`while`语句,语法如下: +Bash 脚本中的循环使用`for`和`while`语句,语法如下: ``` for (( i = 0; i < 10; i++ )); do @@ -313,7 +313,7 @@ done ### 函数 -Bash脚本中的函数使用`function`语句,语法如下: +Bash 脚本中的函数使用`function`语句,语法如下: ``` function name { @@ -323,26 +323,26 @@ function name { ### 数组 -Bash脚本中的数组使用`array=(element1 element2 element3)`语法,例如:`array=(1 2 3)` -数组元素使用`array[index]`语法访问,例如:`echo ${array[1]}` -数组长度使用`${#array[@]}`语法获取,例如:`echo ${#array[@]}` -数组元素使用`${array[@]:index:length}`语法获取,例如:`echo ${array[@]:1:2}`,这会获取数组中从第二个元素开始的两个元素 -数组元素使用`${array[@]/pattern/string}`语法获取,例如:`echo ${array[@]/2/4}`,这会将数组中的所有2替换为4 +Bash 脚本中的数组使用`array=(element1 element2 element3)`语法,例如:`array=(1 2 3)` +数组元素使用`array[index]`语法访问,例如:`echo ${array[1]}` +数组长度使用`${#array[@]}`语法获取,例如:`echo ${#array[@]}` +数组元素使用`${array[@]:index:length}`语法获取,例如:`echo ${array[@]:1:2}`,这会获取数组中从第二个元素开始的两个元素 +数组元素使用`${array[@]/pattern/string}`语法获取,例如:`echo ${array[@]/2/4}`,这会将数组中的所有 2 替换为 4 ### 字符串 -Bash脚本中的字符串使用`'string'`或者`"string"`语法,例如:`echo 'Hello World!'` -字符串长度使用`${#string}`语法获取,例如:`echo ${#string}` -字符串使用`${string:position:length}`语法获取,例如:`echo ${string:1:2}` -字符串使用`${string/substring/replacement}`语法获取,例如:`echo ${string/Hello/Hi}`,这会将字符串中的第一个Hello替换为Hi +Bash 脚本中的字符串使用`'string'`或者`"string"`语法,例如:`echo 'Hello World!'` +字符串长度使用`${#string}`语法获取,例如:`echo ${#string}` +字符串使用`${string:position:length}`语法获取,例如:`echo ${string:1:2}` +字符串使用`${string/substring/replacement}`语法获取,例如:`echo ${string/Hello/Hi}`,这会将字符串中的第一个 Hello 替换为 Hi -### Here文档 +### Here 文档 -Here文档用于将多行文本赋值给变量。 +Here 文档用于将多行文本赋值给变量。 -Bash脚本中的Here文档使用`<<`语法,例如: +Bash 脚本中的 Here 文档使用`<<`语法,例如: ``` read -d '' string <回到normal。阅读模式 + 默认初始模式,任何模式都可以按回到 normal。阅读模式 === "insert" - `i`进入,进行连续的输入,只用i可以无缝退化回原先什么功能都没有的编辑器。输入模式 + `i`进入,进行连续的输入,只用 i 可以无缝退化回原先什么功能都没有的编辑器。输入模式 === "replace" `R`进入,进行连续的替换。替换模式 === "visual" - `v`进入,进行选择,V进入行模式,按行选择, C-v进入块模式,按任意边长选择长方形。选择模式 + `v`进入,进行选择,V 进入行模式,按行选择, C-v 进入块模式,按任意边长选择长方形。选择模式 === "command-line" - `:`进入,处理命令行操作(最基本的有 :w保存 :q退出 :wq保存退出 :q!强制退出)。命令行模式 - + `:`进入,处理命令行操作(最基本的有 :w 保存 :q 退出 :wq 保存退出 :q!强制退出)。命令行模式 + ### 结构 -一个Vim进程可以有多个标签页,一个标签页可以有多个窗口,而一个窗口像只眼睛看向一个特定的文件(Buffer) +一个 Vim 进程可以有多个标签页,一个标签页可以有多个窗口,而一个窗口像只眼睛看向一个特定的文件(Buffer) ## 操作 !!! info "Normal move" - - 上下左右: hjkl - - 以单词为界: w (下一个单词), b (单词开头), e (单词结尾) - - 以行为界: 0 (行开头), ^ (行首个非空字符), $ (行尾) - - 以屏为界: H (屏幕开头), M (屏幕中间), L (屏幕底部) - - 滚动: Ctrl-u (上), Ctrl-d (下) - - 以文件为界: gg (文件开头), G (文件尾), G(对应行) - - 以左右为界: % (对应的另一半括号或者类似的) - - 行内寻找: f{character}, t{character}, F{cracter}, T{character} 小写往后大写往前 - - 搜索: /{regex},?{regex} 往后往前搜索 ,按n继续搜下一个,按N反向继续 + - 上下左右:hjkl + - 以单词为界:w (下一个单词), b (单词开头), e (单词结尾) + - 以行为界:0 (行开头), ^ (行首个非空字符), $ (行尾) + - 以屏为界:H (屏幕开头), M (屏幕中间), L (屏幕底部) + - 滚动:Ctrl-u (上), Ctrl-d (下) + - 以文件为界:gg (文件开头), G (文件尾), G(对应行) + - 以左右为界:% (对应的另一半括号或者类似的) + - 行内寻找:f{character}, t{character}, F{cracter}, T{character} 小写往后大写往前 + - 搜索:/{regex},?{regex} 往后往前搜索 ,按 n 继续搜下一个,按 N 反向继续 !!! info "Normal edit" - o / O :在下/上新建一行并进入插入模式 - - d{motion} :按照motion删除,motion见 move 部分 - - c{motion} :比d{motion}多一步进入插入模式 + - d{motion} :按照 motion 删除,motion 见 move 部分 + - c{motion} :比 d{motion}多一步进入插入模式 - x : 删除当前光标字符 - s : 以代替当光标字符 - Visual mode + manipulation : 这些操作也适用于选择模式选中后 - - u 撤回, 取消撤回 + - u 撤回, 取消撤回 - y 复制 - p 粘贴 - manipulation : 重复次操作 - - i/a : inside/around ,在什么之内/周围操作。例如:di( 在()之内删除; da( 包括()删除 + - i/a : inside/around ,在什么之内/周围操作。例如:di( 在()之内删除;da( 包括()删除 !!! info "Commandline mode" - :w 保存 - :q 退出 @@ -66,5 +66,5 @@ comments: true - :, s///g 从第行到第行替换 ## Advanced Vim -- Vim 是高度可定制化的。只要要改变用户目录下的配置文件即可(~/.vimrc)。也可参考我非常简单的的[:octicons-link-16:配置文件](https://github.com/stormckey/dotfiles/blob/main/dot_vimrc) -- Vim也有许多优质的插件,我几乎没有添加任何插件,而是把Vim作为一个插件在VSCode上使用 \ No newline at end of file +- Vim 是高度可定制化的。只要要改变用户目录下的配置文件即可(~/.vimrc)。也可参考我非常简单的的[:octicons-link-16:配置文件](https://github.com/stormckey/dotfiles/blob/main/dot_vimrc) +- Vim 也有许多优质的插件,我几乎没有添加任何插件,而是把 Vim 作为一个插件在 VSCode 上使用 diff --git a/docs/Note/Missing Semester/commandline_env.md b/docs/Note/Missing Semester/commandline_env.md index 37fe583c..d3d46a63 100644 --- a/docs/Note/Missing Semester/commandline_env.md +++ b/docs/Note/Missing Semester/commandline_env.md @@ -3,7 +3,7 @@ comments: true --- # Commandline Enviroment -!!! abstract "记录missing semester[:octicons-link-16:此堂课](https://missing-semester-cn.github.io/2020/command-line/)的一些笔记" +!!! abstract "记录 missing semester[:octicons-link-16:此堂课](https://missing-semester-cn.github.io/2020/command-line/)的一些笔记" ## Job Control @@ -38,66 +38,66 @@ comments: true ## Terminal Multiplexer -首先理解tmux的自上向下三个不同层级: session,window,pane +首先理解 tmux 的自上向下三个不同层级:session,window,pane !!! info "" === "session" - session是tmux的最高层级,可以理解为一个tmux的实例,可以有多个session,每个session可以有多个window,每个window可以有多个pane,每个pane可以有多个tty + session 是 tmux 的最高层级,可以理解为一个 tmux 的实例,可以有多个 session,每个 session 可以有多个 window,每个 window 可以有多个 pane,每个 pane 可以有多个 tty === "window" - window是session的第二层级,可以理解为一个终端,可以有多个window,每个window可以有多个pane,每个pane可以有多个tty + window 是 session 的第二层级,可以理解为一个终端,可以有多个 window,每个 window 可以有多个 pane,每个 pane 可以有多个 tty === "pane" - pane是window的第三层级,可以理解为一个分屏,可以有多个pane,每个pane可以有多个tty + pane 是 window 的第三层级,可以理解为一个分屏,可以有多个 pane,每个 pane 可以有多个 tty -### 新建一个session +### 新建一个 session !!! info "" === "tmux" - 直接进入一个新的session + 直接进入一个新的 session === "tmux new -t NAME" - 新建一个名为NAME的session + 新建一个名为 NAME 的 session === "tmux a NAME" - 重新连接到名为NAME的session + 重新连接到名为 NAME 的 session === "tmux ls" - 列出所有session + 列出所有 session === "Ctrl-b d" - detach当前session + detach 当前 session -### session以内的操作 +### session 以内的操作 !!! info "" === "C-b c" - 创建一个新的window + 创建一个新的 window === "C-b n/p/NUMBER" - 切换到下一个/上一个/第x个window + 切换到下一个/上一个/第 x 个 window === "C-b ," - 重命名当前window + 重命名当前 window === "C-b &" - 关闭当前window + 关闭当前 window -### window以内的操作 +### window 以内的操作 !!! info "" === "C-b \"" - 上下分裂pane,这会是新的进程和新的tty + 上下分裂 pane,这会是新的进程和新的 tty ![](images/commandline_env/2023-03-27-01-41-57.png#pic) ![](images/commandline_env/2023-03-27-01-43-10.png#pic) === "C-b %" - 左右分裂pane + 左右分裂 pane ![](images/commandline_env/2023-03-27-01-44-35.png#pic) === "C-b o" - 切换到下一个pane + 切换到下一个 pane === "C-b x" - 关闭当前pane + 关闭当前 pane === "C-b z" - 放大缩小当前pane + 放大缩小当前 pane === "C-b ARROW" - 在pane之间移动 + 在 pane 之间移动 === "C-b SPACE" 一键切换下一个布局模式 ## Dotfiles -Dotfile 是以点(.)开头的配置文件,在Unix-like系统中被广泛使用。它们通常位于用户的主目录下,用于存储个人化和自定义的配置选项,以及其他应用程序和工具的设置。 +Dotfile 是以点(.)开头的配置文件,在 Unix-like 系统中被广泛使用。它们通常位于用户的主目录下,用于存储个人化和自定义的配置选项,以及其他应用程序和工具的设置。 Dotfile 的名称以一个或多个点开头,例如 `.bashrc`、`.vimrc`、`.gitconfig` 等。由于在默认情况下,Unix-like 系统会将以点开头的文件视为隐藏文件,因此这些配置文件在文件管理器中默认是不可见的。但可以通过特定的选项或命令查看和编辑它们。 @@ -111,42 +111,42 @@ Dotfile 的用途因文件名和所针对的应用程序而异,以下是一些 通过编辑和定制 Dotfile,用户可以按照个人偏好和需求来配置各种应用程序和工具。它们允许用户修改默认设置、添加快捷键、定义别名、设置环境变量等,以提升工作效率和个人化体验。 -~/.zshrc是zsh的默认配置文件,可以理解为每次启动zsh,都会执行其中的语句。比如你在里面写上一句`echo Hello`,就会在每次启动zsh的时候自动问候你一句 +~/.zshrc 是 zsh 的默认配置文件,可以理解为每次启动 zsh,都会执行其中的语句。比如你在里面写上一句`echo Hello`,就会在每次启动 zsh 的时候自动问候你一句 -在github上可以找到许多人分享的配置文件,这里也贴上[:octicons-link-16:我自己的](https://github.com/stormckey/dotfiles) +在 github 上可以找到许多人分享的配置文件,这里也贴上[:octicons-link-16:我自己的](https://github.com/stormckey/dotfiles) ## 符号连接 -很多时候把配置文件放在~目录下并不方便,也不好混乱,也不好建立GitHub仓库进行管理,配置文件的读取位置往往是定死的,移动到别处就失效了,我们可以利符号连接来整理他们。 +很多时候把配置文件放在~目录下并不方便,也不好混乱,也不好建立 GitHub 仓库进行管理,配置文件的读取位置往往是定死的,移动到别处就失效了,我们可以利符号连接来整理他们。 -`ln -s TRUE_PATH VIRTUAL_PATH`: 软连接,VIRTUAL_PATH上实际上什么文件都没有,但我们试图读写这个文件的时候,会被导向TRUE_PATH上那个真实存在的文件,利用这个就可以统一转移我们的配置文件了。 +`ln -s TRUE_PATH VIRTUAL_PATH`: 软连接,VIRTUAL_PATH 上实际上什么文件都没有,但我们试图读写这个文件的时候,会被导向 TRUE_PATH 上那个真实存在的文件,利用这个就可以统一转移我们的配置文件了。 -注意创建符号连接时VIRTUAL_PATH不能存在 +注意创建符号连接时 VIRTUAL_PATH 不能存在 -若删去TRUE_PATH,符号连接仍然存在,但已不可访问(显示文件不存在) +若删去 TRUE_PATH,符号连接仍然存在,但已不可访问(显示文件不存在) ## Remote Machine -详情可以看[:octicons-link-16:这一篇](https://stormckey.github.io/Blog/Environment/ssh_wsl/),是一个具体的ssh连接实践。在[:ocitons-link-16:这一篇](http://stormckey.github.io/Blog/Minisql/docker_minisql/)中有关于docker的远程连接的实践,更加详细。 +详情可以看[:octicons-link-16:这一篇](https://stormckey.github.io/Blog/Environment/ssh_wsl/),是一个具体的 ssh 连接实践。在[:ocitons-link-16:这一篇](http://stormckey.github.io/Blog/Minisql/docker_minisql/)中有关于 docker 的远程连接的实践,更加详细。 !!! info "常用指令" === "ssh USERNAME@IP_ADDRESS" - 连接remote machine + 连接 remote machine === "ssh-keygen" - 自动生成迷药,注意keyphrase应该为空(直接回车) + 自动生成迷药,注意 keyphrase 应该为空(直接回车) === "ssh-copy-id USERNAME@IP_ADDRESS" - 复制公钥到remote machine的指定文件中 + 复制公钥到 remote machine 的指定文件中 === "scp -p xxxx LOCAL_PATH USERNAME@IP_ADDRESS:REMOTE_PATH" - 将本地文件复制到remote machine + 将本地文件复制到 remote machine === "scp -p xxxx USERNAME:IP_ADDRESS LOCAL_PATH" - 将remote machine文件复制到本地 + 将 remote machine 文件复制到本地 -~/.ssh/config 里面可以设置remote machine别名 默认端口 默认ip地址等属性 +~/.ssh/config 里面可以设置 remote machine 别名 默认端口 默认 ip 地址等属性 ![](images/commandline_env/2023-03-27-02-36-41.png#pic) !!! tip - 在remote machine使用tmux,可以在连接关闭后,连接回来,再重新attach,之前运行的程序都会仍然存在。 - 在远程的tmux的快捷键需要按两次C-a + 在 remote machine 使用 tmux,可以在连接关闭后,连接回来,再重新 attach,之前运行的程序都会仍然存在。 + 在远程的 tmux 的快捷键需要按两次 C-a !!! tip - VSCode的Remote ssh相当好用,可以让你用VSCode对远程机器上操作,包括debug啥的 \ No newline at end of file + VSCode 的 Remote ssh 相当好用,可以让你用 VSCode 对远程机器上操作,包括 debug 啥的 diff --git a/docs/Note/Missing Semester/index.md b/docs/Note/Missing Semester/index.md index 528b3d54..1bb21f91 100644 --- a/docs/Note/Missing Semester/index.md +++ b/docs/Note/Missing Semester/index.md @@ -4,7 +4,7 @@ comments: true # Missing Smester !!! abstract - Missing Semester是来自MIT的一门计算机入么课程,这门课程不介绍具体的语言算法,而是介绍一些可以提高效率的工具的使用方法,普及计算机常识 + Missing Semester 是来自 MIT 的一门计算机入么课程,这门课程不介绍具体的语言算法,而是介绍一些可以提高效率的工具的使用方法,普及计算机常识 !!! warning - 原课程很优秀,如果您有空的话可以直接前往[:octicons-link-16:课程网站]()进行学习。这里存的是我的笔记,它们是为了在需要的时候能够方便的被查找而撰写的,请勿直接学习 \ No newline at end of file + 原课程很优秀,如果您有空的话可以直接前往【:octicons-link-16:课程网站】()进行学习。这里存的是我的笔记,它们是为了在需要的时候能够方便的被查找而撰写的,请勿直接学习 diff --git a/docs/PeiPei/index.md b/docs/PeiPei/index.md index 00ac48eb..5cdc1864 100644 --- a/docs/PeiPei/index.md +++ b/docs/PeiPei/index.md @@ -6,4 +6,4 @@ nostatistics: true 欢迎来到 [PeiPei](https://github.com/PeiPei233) 寄居在大神 Stormckey 的博客上! -这里会放一些怕自己忘记的小 Tips,以及一些有趣的东西! \ No newline at end of file +这里会放一些怕自己忘记的小 Tips,以及一些有趣的东西! diff --git a/docs/PeiPei/markdown.md b/docs/PeiPei/markdown.md index b9bc8c41..2fce82a0 100644 --- a/docs/PeiPei/markdown.md +++ b/docs/PeiPei/markdown.md @@ -41,4 +41,4 @@ comments: true ```regex $1 -``` \ No newline at end of file +``` diff --git a/docs/Research/Diffusion Model/DDIM.md b/docs/Research/Diffusion Model/DDIM.md index 1981f419..d02f776e 100644 --- a/docs/Research/Diffusion Model/DDIM.md +++ b/docs/Research/Diffusion Model/DDIM.md @@ -1,23 +1,23 @@ ---- +--- comments: true --- # DDIM !!! abstract - 对于DDIM,首先还是推荐阅读[:octicons-link-16:苏剑林](https://link.zhihu.com/?target=https%3A//kexue.fm/archives/9181)的博客。这篇文章可以跟读,文章中有我却没有提的部分就是我认为没什么好补充的了。 + 对于 DDIM,首先还是推荐阅读[:octicons-link-16:苏剑林](https://link.zhihu.com/?target=https%3A//kexue.fm/archives/9181)的博客。这篇文章可以跟读,文章中有我却没有提的部分就是我认为没什么好补充的了。 ## 清洗 -从DDPM那篇博客中,我们就已经可以看到$p(x_t|x_{t-1})$这一前后连续时间的状态转移已经没有使用到了,尽管我们当时给定了这一状态转移的表达式,并以此推出了$p(x_t|x_0)$。但是既然没有用到也可以完成后续推导推导的话,我们可以在保留后一个状态转移的前提下,不再定死前面的状态转移函数了,先将其当作待定,看看这一新的自由度会带来什么。 +从 DDPM 那篇博客中,我们就已经可以看到$p(x_t|x_{t-1})$这一前后连续时间的状态转移已经没有使用到了,尽管我们当时给定了这一状态转移的表达式,并以此推出了$p(x_t|x_0)$。但是既然没有用到也可以完成后续推导推导的话,我们可以在保留后一个状态转移的前提下,不再定死前面的状态转移函数了,先将其当作待定,看看这一新的自由度会带来什么。 于是在贝叶斯公式中,我们将这一项积掉,随后保持我们走出的每一步都是正态分布的假设,用待定系数法求解。 -然后我们就看见,我们的方程书少了另一个,这事因为我们不再限制$p(x_t|x_{t-1})$自然就多了一个关于这个函数可以是什么的自由度(当然这个函数不一定还是DDPM的形式了,但他还是要满足其他给定的性质,比如保证$p(x_t|x_0)$形式如前),我们调节这个新的参数,就是换不同的满足条件的$p(x_t|x_{t-1})$解,使其表现出不同的特性。 +然后我们就看见,我们的方程书少了另一个,这事因为我们不再限制$p(x_t|x_{t-1})$自然就多了一个关于这个函数可以是什么的自由度(当然这个函数不一定还是 DDPM 的形式了,但他还是要满足其他给定的性质,比如保证$p(x_t|x_0)$形式如前),我们调节这个新的参数,就是换不同的满足条件的$p(x_t|x_{t-1})$解,使其表现出不同的特性。 -随后的自然就是几个不同的例子了。首先,一定存在某个$\sigma_t$使得$p(x_t|x_{t-1})$还是跟DDPM一样的取值,我们把DDPM中的方差带入,就得到了跟DDPM中一样的结果。以及文章中建议的另一个方差,都能得到不错的结果。也可以取一些特殊的值,比如完全去掉方差,使得往回走的每一步都是一个向量而不再是一个分布,这样走的效果很好。 +随后的自然就是几个不同的例子了。首先,一定存在某个$\sigma_t$使得$p(x_t|x_{t-1})$还是跟 DDPM 一样的取值,我们把 DDPM 中的方差带入,就得到了跟 DDPM 中一样的结果。以及文章中建议的另一个方差,都能得到不错的结果。也可以取一些特殊的值,比如完全去掉方差,使得往回走的每一步都是一个向量而不再是一个分布,这样走的效果很好。 ## 加速 -这部分原论文的思想实在是精妙,用类比而言,我们从起点出发走了1000步,如果我们每5步记一步的话,我们也可以看作是200步走到了同一个地方,只要我们的模型预测的足够好,完全理解我们是沿着那条路往外走的,那么这200步也足以让我们走回来,这就实现了加速。这一过程是有点像C++里的upcasat,我原先当你是个Shape类,但我知道你实际上是个Circle,那我们就把指针改成Circle*来把你当做一个circle对待,对象并没有变,只是我们处理他的方式变了,那我们就修改好适合于200步的$\alpha,\beta$来反向采样。 +这部分原论文的思想实在是精妙,用类比而言,我们从起点出发走了 1000 步,如果我们每 5 步记一步的话,我们也可以看作是 200 步走到了同一个地方,只要我们的模型预测的足够好,完全理解我们是沿着那条路往外走的,那么这 200 步也足以让我们走回来,这就实现了加速。这一过程是有点像 C++里的 upcasat,我原先当你是个 Shape 类,但我知道你实际上是个 Circle,那我们就把指针改成 Circle*来把你当做一个 circle 对待,对象并没有变,只是我们处理他的方式变了,那我们就修改好适合于 200 步的$\alpha,\beta$来反向采样。 -最后一段把DDPM作为一个阶微分方程的过程,值得一看。 \ No newline at end of file +最后一段把 DDPM 作为一个阶微分方程的过程,值得一看。 diff --git a/docs/Research/Diffusion Model/DDPM.md b/docs/Research/Diffusion Model/DDPM.md index 21830216..6694c65c 100644 --- a/docs/Research/Diffusion Model/DDPM.md +++ b/docs/Research/Diffusion Model/DDPM.md @@ -4,70 +4,70 @@ comments: true # DDPM -!!! abstract "关于DDPM的三种理解方式和一些直观的解释" +!!! abstract "关于 DDPM 的三种理解方式和一些直观的解释" -## 认识DDPM +## 认识 DDPM -首先,认识DDPM最好的方式就是先去读一读大佬对于直观理解DDPM的讲解博客,这里引用[[:octicons-link-16:苏剑林](https://kexue.fm/archives/9119)]{原文中一些\bar显示不全,可能引起阅读障碍,也可选择阅读博客的知乎版本} 大佬的博客,建议大家先读完第一篇扩散模型漫谈,明白DDPM是做什么的,再回到本文。 +首先,认识 DDPM 最好的方式就是先去读一读大佬对于直观理解 DDPM 的讲解博客,这里引用[【:octicons-link-16:苏剑林](https://kexue.fm/archives/9119)]{原文中一些、bar 显示不全,可能引起阅读障碍,也可选择阅读博客的知乎版本} 大佬的博客,建议大家先读完第一篇扩散模型漫谈,明白 DDPM 是做什么的,再回到本文。 ## 在高维空间中游走 -DDPM,按照原文的介绍,不只可以用于处理图像信息,但是原文的分析主要是从图像来讲的(是吧),所以我也从图像分析的角度来说一下吧。 +DDPM,按照原文的介绍,不只可以用于处理图像信息,但是原文的分析主要是从图像来讲的(是吧),所以我也从图像分析的角度来说一下吧。 -什么是图像?按照最简单的角度理解,图像就是像素值矩阵,我们只要把一幅图从左上角到右下角的所有像素值(可能分RGB三个矩阵)都存储起来,就记录了这个个图像的所有信息。 +什么是图像?按照最简单的角度理解,图像就是像素值矩阵,我们只要把一幅图从左上角到右下角的所有像素值(可能分 RGB 三个矩阵)都存储起来,就记录了这个个图像的所有信息。 -如果我们再把这个图像从矩阵拼接成一个向量,图像就成了一个很高维度的空间中的一个点(比如1024*1024维),在这个空间中,有些点是有意义的图像(因为我们总能拿来一个有意义的图像,把图像映射到点上),大部分却是无意义的噪声图(想象一下电视花屏,我们随机在空间里取一个点大概就是这样的),DDPM就是试图从这个空间的随机一个点出发,希望找到一个有意义的点,也就是在高维空间中游走。 +如果我们再把这个图像从矩阵拼接成一个向量,图像就成了一个很高维度的空间中的一个点(比如 1024*1024 维),在这个空间中,有些点是有意义的图像(因为我们总能拿来一个有意义的图像,把图像映射到点上),大部分却是无意义的噪声图(想象一下电视花屏,我们随机在空间里取一个点大概就是这样的),DDPM 就是试图从这个空间的随机一个点出发,希望找到一个有意义的点,也就是在高维空间中游走。 ## 图像的概率分布 -我们很好理解作为一个点的图像,因为我们把这个点坐标拿出来,还原成矩阵,就可以还原到图像了,那么什么是图像的概率分布? +我们很好理解作为一个点的图像,因为我们把这个点坐标拿出来,还原成矩阵,就可以还原到图像了,那么什么是图像的概率分布? 想象一个坐标为(1,2)的点,和一个均值为(1,2)的二维正态分布,这其实就是二者的区别,一个点可以准确还原到一幅图像,但概率分布并不准确,他只是告诉我们这幅图是(1,2)的概率最高,它也可能是其他图像,它是其他图像的概率可以通过概率分布算出,比如我们可以确定他是(1,3)的概率是多少。 -那么,给定一个图像概率分布,我们如何获取图像呢?我们可以直接取均值的到图像,那就是(1,2),这么做的道理是:它是这幅图的概率最高,我们也可以按照概率去一个点,可能是(1,2),也可能是(2,4),但(1,2)的概率最高,一些很离谱的点(偏离均值很远)的概率就很低。 +那么,给定一个图像概率分布,我们如何获取图像呢?我们可以直接取均值的到图像,那就是(1,2),这么做的道理是:它是这幅图的概率最高,我们也可以按照概率去一个点,可能是(1,2),也可能是(2,4),但(1,2)的概率最高,一些很离谱的点(偏离均值很远)的概率就很低。 -回到DDPM的向前过程,我们的起点是空间中的一个点,比如说(1,2),我们走了一步之后,就不再得到一个点,而是得到一个概率分布,比如说可以近似看成均值为(1,2)的概率分布,可以想像我们从空间中的一个点出发,走了一步后,可能在以其为圆心的任何一个地方上,不同的距离,概率都不同(可以类比电子云)。我们再走第二步,距离就会更远一些,概率分布更分散一些。 +回到 DDPM 的向前过程,我们的起点是空间中的一个点,比如说(1,2),我们走了一步之后,就不再得到一个点,而是得到一个概率分布,比如说可以近似看成均值为(1,2)的概率分布,可以想像我们从空间中的一个点出发,走了一步后,可能在以其为圆心的任何一个地方上,不同的距离,概率都不同(可以类比电子云)。我们再走第二步,距离就会更远一些,概率分布更分散一些。 -按照原文走出一千步,我们的图像就会变成一个以原图为圆心的弥散的广阔的类似球的概率分布内了。因其广阔,我们大概最终会停在某一个无意义的点上。注意,这里我说的停在一个噪点上,是指从最终的分布中取均值或者随机采样得到一个点,以从分布跌回确定值。 +按照原文走出一千步,我们的图像就会变成一个以原图为圆心的弥散的广阔的类似球的概率分布内了。因其广阔,我们大概最终会停在某一个无意义的点上。注意,这里我说的停在一个噪点上,是指从最终的分布中取均值或者随机采样得到一个点,以从分布跌回确定值。 -原文中给出了每步怎么走的公式,其具有的良好性质就是:我们可以直接从给订的起点,$\alpha$,$\beta$中直接推出第N步我们的分布,可以看到,1k步后$\bar \alpha$接近于林,我们的分布取均值也是取不到原图的了,均值已经在0附近。总体分布接近高斯分布。 +原文中给出了每步怎么走的公式,其具有的良好性质就是:我们可以直接从给订的起点,$\alpha$,$\beta$中直接推出第 N 步我们的分布,可以看到,1k 步后$\bar \alpha$接近于林,我们的分布取均值也是取不到原图的了,均值已经在 0 附近。总体分布接近高斯分布。 ## 回到起点 -从有意义的点走出1000步,到达的终点,近乎服从高斯分布,那么我们直接从高斯分布采样,就能得到近似从某个/任何一个有意义的点出走所达到的终点了,现在我们想回去,怎么回? +从有意义的点走出 1000 步,到达的终点,近乎服从高斯分布,那么我们直接从高斯分布采样,就能得到近似从某个/任何一个有意义的点出走所达到的终点了,现在我们想回去,怎么回? -到这里我们就可以解答原模型中一个可能会令人困惑的点了,假如我们走了500步,到了一个点,我们走下一步,就是走到500为圆心的一个概率分布上,如果我们训练一个神经网络来拟合的话,不就是在拟合高斯吗,高斯又何须拟合呢? +到这里我们就可以解答原模型中一个可能会令人困惑的点了,假如我们走了 500 步,到了一个点,我们走下一步,就是走到 500 为圆心的一个概率分布上,如果我们训练一个神经网络来拟合的话,不就是在拟合高斯吗,高斯又何须拟合呢? -问题就在这里了,现在我们随机采了一个点,我们说是终点,我们要走回去,当然不能以每一步都是高斯走,那最终走到的还是无意义的点,我们希望知道,我现在在这里,那我上一步最有可能是从哪里来的?我要回到那个地方去。 +问题就在这里了,现在我们随机采了一个点,我们说是终点,我们要走回去,当然不能以每一步都是高斯走,那最终走到的还是无意义的点,我们希望知道,我现在在这里,那我上一步最有可能是从哪里来的?我要回到那个地方去。 -想象一下,如果我们采样的点在起点那个圆的上方,那么我们希望的回答是:我们最有可能从下面来,要回去的话,往下走。如果我们在下面,我们最有可能从上面来,往上走。所以,我们最有可能从哪里来会随着我现在在哪里而变化,所以,神经网络预测的时候需要我们现在的位置($x_t$)和时间,来拟合我们最有可能来的位置。 +想象一下,如果我们采样的点在起点那个圆的上方,那么我们希望的回答是:我们最有可能从下面来,要回去的话,往下走。如果我们在下面,我们最有可能从上面来,往上走。所以,我们最有可能从哪里来会随着我现在在哪里而变化,所以,神经网络预测的时候需要我们现在的位置($x_t$)和时间,来拟合我们最有可能来的位置。 -于是我们开始训练,第一次训练可能网络一步步往上走,使得模型倾向于在这些路径点上输出:嘿,我是从下面来的,往下走就可以回去。第二次,我们可能往左走,同样让神经网络在这条路径上懂得如何回归。最终,训练完毕后,神经网络就懂得如何从任意一个点走回去了。 +于是我们开始训练,第一次训练可能网络一步步往上走,使得模型倾向于在这些路径点上输出:嘿,我是从下面来的,往下走就可以回去。第二次,我们可能往左走,同样让神经网络在这条路径上懂得如何回归。最终,训练完毕后,神经网络就懂得如何从任意一个点走回去了。 所以我们要设计合适的损失函数让训练过程可以更好的领路回去,这就是文章中数学部分分析的工作了。 ## 神奇的语意融合 -我也不知道在这里适用于以融合对不对,但事实就是,输入的起点不唯一,我们最后走回来的话,不仅可以走回起点,而且可以走回起点之间的有意义的点,比如输入满月和半月,可以生成3/4月,这两幅图在空间中的不同点上,相聚有一段距离,他们中间的点大部分都是无意义的噪点,但是却能被成功走到,实在是神奇。 +我也不知道在这里适用于以融合对不对,但事实就是,输入的起点不唯一,我们最后走回来的话,不仅可以走回起点,而且可以走回起点之间的有意义的点,比如输入满月和半月,可以生成 3/4 月,这两幅图在空间中的不同点上,相聚有一段距离,他们中间的点大部分都是无意义的噪点,但是却能被成功走到,实在是神奇。 ## 进一步的学习 -以上是对DDPM的一个理解的角度,大佬的博客还给出了对于DDPM的两种不同的理解的视角[[:octicons-link-16:](https://spaces.ac.cn/archives/9152)[:octicons-link-16:](https://kexue.fm/archives/9164)]{符号问题如前} +以上是对 DDPM 的一个理解的角度,大佬的博客还给出了对于 DDPM 的两种不同的理解的视角[[:octicons-link-16:](https://spaces.ac.cn/archives/9152)[:octicons-link-16:](https://kexue.fm/archives/9164)]{符号问题如前} 我们先读第一篇,这篇可以跟读。首先文章说明了把问题分解成多步可以大幅度提高拟合能力,这是很有教义的观察。 -联合散度的最消化目标也很好理解,首先要知道KL散度是衡量两个分布之间相近程度的非负函数,KL散度为零当且仅当两个分布完全相同。我们希望走出来的路跟走回去的路是尽可能相近的,所以要最小化KL散度。 +联合散度的最消化目标也很好理解,首先要知道 KL 散度是衡量两个分布之间相近程度的非负函数,KL 散度为零当且仅当两个分布完全相同。我们希望走出来的路跟走回去的路是尽可能相近的,所以要最小化 KL 散度。 随后就是数学处理,去掉最小化目标中的无关常数项。并化简损失函数使之可用。 -超参设置中,要求边缘分布相等,其实就是要求终点的分布要近似于高斯,那就是$\bar \alpha$近乎0就可以了。 +超参设置中,要求边缘分布相等,其实就是要求终点的分布要近似于高斯,那就是$\bar \alpha$近乎 0 就可以了。 有了上述的铺垫,我认为这篇文章的脉络是相当清晰的,我们进入下一篇。 -第三篇的前面一大部分都跟第一篇完全一样,但到了贝叶斯的部分,开始有了不一样,我们要知道,在DDPM中,$p(x_{t-1}|x_t) = p(x_{t-1}|x_t,x_0)$,因为这是一个马尔可夫过程,也就是每一个状态仅与前一状态有关,而与更前的状态无关,我们也可以理解成,我们只需要知道500步到哪里了,对于给定的参数,我们就能有501步的分布,第0-499步,给不给都无所谓,不改变分布,但是引入了起点后,我们是可以从起点直接推$x_t,x_{t-1}$的,这就让我们的贝叶斯公式中许多项成为已知。 +第三篇的前面一大部分都跟第一篇完全一样,但到了贝叶斯的部分,开始有了不一样,我们要知道,在 DDPM 中,$p(x_{t-1}|x_t) = p(x_{t-1}|x_t,x_0)$,因为这是一个马尔可夫过程,也就是每一个状态仅与前一状态有关,而与更前的状态无关,我们也可以理解成,我们只需要知道 500 步到哪里了,对于给定的参数,我们就能有 501 步的分布,第 0-499 步,给不给都无所谓,不改变分布,但是引入了起点后,我们是可以从起点直接推$x_t,x_{t-1}$的,这就让我们的贝叶斯公式中许多项成为已知。 随后我们就可以一路推导出损失函数。注意,在这个推导流程下$x_0$给定,我们能直接得到往回走的方向,所以我们唯一需要训练的是模型猜原点的能力,而这一损失函数,正如推导出来的那样,是跟前面几个视角一样的。 到了预估修正一节,我们的行为有可以被解释为,先猜出一个起点,往回走,并通过损失函数修正起点,然后走下一次,这样我们起点猜的越来越准,回到起点的能力也越来越强了。 -此处的第三种理解是与后来的DDIM有很强的关联性的,比如说我们利用了贝叶斯公式之后其实只需要各个时间点对于$x_0$的分布而不需要其对于前一个时间点的分布了,但是要注意,我们从后往前推仍然需要一步一步走,如果我们一步走完的话,就会退化回VAE了。 +此处的第三种理解是与后来的 DDIM 有很强的关联性的,比如说我们利用了贝叶斯公式之后其实只需要各个时间点对于$x_0$的分布而不需要其对于前一个时间点的分布了,但是要注意,我们从后往前推仍然需要一步一步走,如果我们一步走完的话,就会退化回 VAE 了。 diff --git a/docs/Research/index.md b/docs/Research/index.md index 51b9a07b..f7f26274 100644 --- a/docs/Research/index.md +++ b/docs/Research/index.md @@ -3,7 +3,7 @@ nostatistics: true --- # Research -!!! info "虽然是科研菜🐶但还是把一些笔记放在这里好了QaQ" +!!! info "虽然是科研菜🐶但还是把一些笔记放在这里好了 QaQ" !!! abstract "To do list" - [ ] pytorch @@ -15,13 +15,13 @@ nostatistics: true !!! abstract "Done list" - [x] batch nomarlization - [x] basic pytorch - - [x] [:octicons-link-16:Stochastic Gradient Descent with momentum](https://towardsdatascience.com/stochastic-gradient-descent-with-momentum-a84097641a5d) - - [x] [:octicons-link-16:KL散度](https://www.bilibili.com/video/BV1JY411q72n/?spm_id_from=333.337.search-card.all.click&vd_source=3bf0a9181b6c28910c810d7e49b5e64c) - - [x] 重参数 + - [x] [:octicons-link-16:Stochastic Gradient Descent with momentum](https://towardsdatascience.com/stochastic-gradient-descent-with-momentum-a84097641a5d) + - [x] [:octicons-link-16:KL 散度](https://www.bilibili.com/video/BV1JY411q72n/?spm_id_from=333.337.search-card.all.click&vd_source=3bf0a9181b6c28910c810d7e49b5e64c) + - [x] 重参数 - [x] [:octicons-link-16:VAE](https://www.gwylab.com/note-vae.html) [:octicons-link-16:还有一个很优秀的解答](https://zhuanlan.zhihu.com/p/348498294) -Useful pages: +Useful pages: -- [:octicons-link-16:Reverse-mode automatic differentiation from scratch, in Python](https://sidsite.com/posts/autodiff/) -- [:octicons-link-16:Example implementation of reverse-mode autodiff](https://colab.research.google.com/drive/1VpeE6UvEPRz9HmsHh1KS0XxXjYu533EC#scrollTo=erjC686T4S4c) +- [:octicons-link-16:Reverse-mode automatic differentiation from scratch, in Python](https://sidsite.com/posts/autodiff/) +- [:octicons-link-16:Example implementation of reverse-mode autodiff](https://colab.research.google.com/drive/1VpeE6UvEPRz9HmsHh1KS0XxXjYu533EC#scrollTo=erjC686T4S4c) diff --git a/docs/index.md b/docs/index.md index 4057b455..ad6f68aa 100644 --- a/docs/index.md +++ b/docs/index.md @@ -18,11 +18,11 @@ hide: 欢迎来到我的主页!随便逛逛吧 -!!! info - 本站为浙江大学gch的个人主页,此为证明声明 +!!! info + 本站为浙江大学 gch 的个人主页,此为证明声明 - 注意本站中的PeiPei页面是好朋友peipei写的,可以不纳入评选范围 + 注意本站中的 PeiPei 页面是好朋友 peipei 写的,可以不纳入评选范围 -[:material-clock-time-two-outline: 更新日志](changelog) | [:eyes:样式一览](Format) | [:material-book-plus:建站指南](Build_this_website) +[:material-clock-time-two-outline: 更新日志](changelog) | [:eyes:样式一览](Format) | [:material-book-plus:建站指南](Build_this_website) diff --git a/docs/universal_format.vim b/docs/universal_format.vim new file mode 100644 index 00000000..f7cd1546 --- /dev/null +++ b/docs/universal_format.vim @@ -0,0 +1 @@ +PanguAll | update \ No newline at end of file