Sklearn 总体介绍
Mac——环境变量配置.md
Mac环境变量配置文件
/etc/profile
- 全局的
~/.bash_profile
- 用户自己的,可能需要自己生成
- 生效方式
1
source ~/.bash_profile
Terminal自动导入环境变量
默认Terminal打开后不会导入用户自定义的环境变量
自动导入可以设置为
在
~/.zshrc
(这个文件没有的话需要自己生成)中添加一行1
source ~/.bash_profile
也可直接在
~/.zshrc
中直接定义环境变量,使用~/.bash_profile
是为了和Linux匹配且方便切换不同的Bash工具原理:Terminal打开的是zsh工具,这个工具启动时会自动执行
~/.zshrc
Idea
- Idea中Terminal打开后可能不会跟系统一样自动导入环境变量
- 如果使用的Terminal是zsh的话,也会自动导入
- 可以自己手动添加(一次添加,以后都可以自动使用)
- 或者每次打开Terminal后执行
source ~/.bash_profile
ML——MLE和MAP的区别举例说明
本文用一个简单的例子在直观上说明极大似然估计与最大后验估计的区别
举例说明
事件定义
- A = 好好学习
- B = 作弊
- C = 班级第一
条件概率
- P(C|A) = 0.1
- P(C|B) = 0.5
已知某同学考了年级第一
- 此时可得概率:
- P(C) = 1
- ML(极大似然估计,找一个使得结果发生可能性最大的条件
计算条件概率P(结果|条件)- 参数为e
- P(C|e = A) = 0.1
- P(C|e = B) = 0.5
- 该同学更可能是作弊了
- 若此时添加先验:
- P(A) = 0.99
- P(B) = 0.01
- MAP(计算后验概率,在结果发生时,最可能是什么产生的?
计算后验概率:P(条件|结果),令P(C)=1- P(A|C) = P(C|A)P(A)/P(C) = 0.1*0.99/1 = 0.099
- P(B|C) = P(C|B)P(B)/P(C) = 0.5*0.01/1 = 0.005
- 此时可发现该同学更可能是好好学习了
- 此时可得概率:
深入分析:MLE与MAP的区别
- MAP比MLE多考虑了一个先验概率,这个先验概率指明了条件概率的条件(例如 P(C|A)的先验是P(A))
- MAP的是比较后验概率,ML的是比较条件概率,但是两者本质上都是找一个使得结果发生的最可能的原因
- MLE可以认为是特殊的MAP
- ML是先验概率为均匀分布时的MAP(上例中: 若P(A) = P(B), 则MLE等价于MAP)
ML——参数估计MLE-MAP-BEP
极大似然估计(Maximum Likelihood Estimation,MLE)
最大后验概率估计(Maximum a posteriori Estimation,MAP)
贝叶斯估计(Bayesian Parameter Estimation,BPE)
一般理解
- 极大似然估计(MLE): 频率学派(参数为固定的某个值)
- 贝叶斯估计(BPE): 贝叶斯学派(参数服从某个分布)
- 最大后验概率估计(MAP): 一般的书籍认为属于频率学派
- 个人理解:MAP前半部分是贝叶斯学派,后半部分是频率学派
- 前半部分认为参数\(\theta\))有先验分布,此时参数服从一个分布,而不是确定的值,是贝叶斯学派的
- 后半部分认为参数不是服从后验分布,而是一个具体的使得后验概率最大的值,这里是频率学派的做法
- 个人理解:MAP前半部分是贝叶斯学派,后半部分是频率学派
- 三者的终极目标都是估计模型参数\(\theta\),MAP和MLE估计参数\(\theta\)为具体某个值,BPE估计参数\(\theta\)为一个分布
- 其他贝叶斯网络模型(有向图概率图模型)参数估计的方法还有吉布斯采样,变分推断,EM算法等
极大似然估计与最大后验概率估计
- 比较MLE与MAP直观理解见我的另一篇博客:MLE-vs-MAP——一个简单的例子说明二者的区别
- 都只关注参数的具体某个最优值
- 极大似然估计相当于是参数\(\theta\)的先验分布\(P(\theta)\)为均匀分布的最大后验概率估计
最大后验概率估计与贝叶斯估计
- 相似点:
- 都考虑了参数的先验分布(贝叶斯学派)
- 最大后验概率估计是贝叶斯估计的一种简化实现(认为\(\theta\)都是出现在最可能出现的地方,牺牲一点精度,不用求复杂的分母积分)
- 二者都围绕下面的公式进行估计
$$P(\theta|X)=\frac{P(X|\theta)P(\theta)}{P(X)}$$
- 区别:
- 贝叶斯估计:求得的结果估计参数\(\theta\)服从一个分布,不能忽略归一化因子\(P(X)\),此时\(P(X)=\int_{\theta}P(X|\theta)P(\theta)d_{\theta}\),贝叶斯估计要计算后验分布,所以需要计算归一化因子,虽然对不同参数值,分母积分结果是相同的,但是计算分布时需要这个归一化因子,否则后续得到的不是分布,也无法求取参数的期望等
- 最大后验概率估计:求得的结果估计参数\(\theta\)是一个具体的值,把分母\(P(X)\)给忽略了,直接对分子极大化求得最优的参数\(\theta^{\star}\),由于跟贝叶斯估计一样,对不同参数值,分母积分结果是相同的,所以\(P(X)\)的值不影响最优参数值的选取【不求参数\(\theta\)的分布,所以不用求分母,分母是不影响求参数最优值的】,不用计算归一化因子(很复杂,需要积分),速度会快很多
- 最大后验概率估计相当于是参数后验分布\(P(\theta|X)\)被最可能的参数值\(\theta^{\star}=\arg\max_{\theta}P(\theta|X)\)替代的贝叶斯估计
估计模型 | 目标值 | 关心对象 | 求值方式 |
---|---|---|---|
MLE | $$\theta^{\star}=\arg\max_{\theta}(P(X\mid \theta)$$ | \(P(X\mid \theta)\) | 最大化似然函数\(P(X\mid \theta)\) |
MAP | $$\theta^{\star}=\arg\max_{\theta}(P(\theta\mid X)$$ | \(P(X\mid \theta)P(\theta)\) | 最大化后验概率\(P(\theta\mid X)=\frac{P(X\mid \theta)P(\theta)}{P(X)}\) 只需最大化分子\(P(X,\theta)=P(X\mid \theta)P(\theta)\) |
BPE | \(P(\theta\mid X)\) (\(\theta\)的后验概率分布) |
\(\frac{P(X\mid \theta)P(\theta)}{P(X)}\) | 求参数\(\theta\)的后验概率分布\(P(\theta\mid X)\) \(P(\theta\mid X)=\frac{P(X\mid \theta)P(\theta)}{\int_{\theta}P(X\mid\theta)P(\theta)d_{\theta}}\) |
一个容易理解的角度
问题描述
已知数据集为\(X=(x_{1}, x_{2},,,x_{n})\)
极大似然估计
- 已知数据集\(X\)的情况下,求参数最优值\(\theta^{\star}\),使得似然函数\(P(X|\theta)\)最大
最大后验概率估计
- 已知数据集\(X\)的情况下,求参数最优值\(\theta^{\star}\),使得后验概率\(P(\theta|X)\)最大,实际只需使得\(P(X,\theta)=P(X|\theta)P(\theta)\)最大
贝叶斯估计
- 已知数据集\(X\)的情况下,求参数\(\theta\)的后验分布\(P(\theta|X)\)
极大似然估计(MLE)
- 推导
$$P(\theta|X)=\frac{P(X|\theta)P(\theta)}{P(X)}$$- \(P(\theta)\)的取值与参数\(\theta\)无关【认为每个参数\(\theta\)出现的概率相等】
- \(P(\theta)\)与参数\(\theta\)无关可以理解为参数\(\theta\)服从均匀分布: 假设参数\(\theta\)有k个离散取值\(\theta_{1}, \theta_{2},,,\theta_{k}\),那么\(P(\theta_{1})=P(\theta_{2})=…=P(\theta_{k})=\frac{1}{k}\)
- \(P(X)\)的取值与\(\theta\)无关,设置为\(P(X)=1\)即可
- 所以得到下面的表达式
$$\arg\max_{\theta}P(\theta|X)=\arg\max_{\theta}P(X|\theta)$$- 式子中\(P(X|\theta)\)被称为似然函数
- \(P(\theta)\)的取值与参数\(\theta\)无关【认为每个参数\(\theta\)出现的概率相等】
- 结论
- 极大似然估计: \(\theta^{\star}=\arg\max_{\theta}P(X|\theta)\)
- 文字解释: 极大似然估计的目标是找一个参数\(\theta\),使得在参数\(\theta\)对应的概率分布模型下,数据集\(X\)出现的概率最大(似然函数最大)
最大后验概率估计(MAP)
- 推导
$$P(\theta|X)=\frac{P(X|\theta)P(\theta)}{P(X)}$$- \(P(\theta)\)为的取值与参数\(\theta\)相关,是关于\(\theta\)的一个先验概率【不同的参数\(\theta\)出现的概率可能不同】
- \(P(\theta)\)与参数\(\theta\)相关可以理解为: 假设参数\(\theta\)有k个取值\(\theta_{1}, \theta_{2},,,\theta_{k}\),那么\(\sum_{i=1}^{k}P(\theta_{i})=1\),但\(P(\theta_{1}),P(\theta_{2}),,,P(\theta_{k})\)的取值不能确定,也不一定相等
- \(P(X)=\int_{\theta}P(X|\theta)P(\theta)d_{\theta}\)积分结果与\(\theta\)不相关,分母的值不影响后验概率最大值的参数值,直接忽略(设置为\(P(X)=1\))即可
- 所以得到
$$\arg\max_{\theta}P(\theta|X)=\arg\max_{\theta}P(X|\theta)P(\theta)=\arg\max_{\theta}P(X,\theta)$$
- \(P(\theta)\)为的取值与参数\(\theta\)相关,是关于\(\theta\)的一个先验概率【不同的参数\(\theta\)出现的概率可能不同】
- 结论
- 最大后验概率估计: \(\theta^{\star}=\arg\max_{\theta}P(X|\theta)P(\theta)\)
- 文字解释: 最大后验概率估计的目标是找一个参数\(\theta\),使得在参数\(\theta\)服从已知先验分布\(P(\theta)\)和数据集\(X\)的情况下,对应的后验概率\(P(\theta|X)\)最大(等价于\(P(X,\theta)=P(X|\theta)P(\theta)\)最大)
贝叶斯估计(BPE)
- 推导
$$P(\theta|X)=\frac{P(X|\theta)P(\theta)}{P(X)}$$- \(P(\theta)\)为的取值与参数\(\theta\)相关,是关于\(\theta\)的一个先验概率
- \(P(\theta)\)与参数\(\theta\)相关可以理解为: 假设参数\(\theta\)有k个取值\(\theta_{1}, \theta_{2},,,\theta_{k}\),那么\(\sum_{i=1}^{k}P(\theta_{i})=1\),但\(P(\theta_{1}),P(\theta_{2}),,,P(\theta_{k})\)的取值不确定,也不一定相等
- \(P(X)\)的取值与\(\theta\)本身不相关,但是为了求出后验分布\(P(\theta|X)\),\(P(X)\)作为归一化因子需要计算
- \(P(X)\)的值与参数的先验分布,模型的定义(高斯分布还是贝塔分布等)和数据集\(X\)有关系
- 没有分母作为归一化因子的话单独的分子是联合分布\(P(X,\theta)\),这个分布对\(\theta\)积分结果不为1(而是\(P(X)\)),联合分布不能确定\(\theta\)的后验分布
- \(P(X)=\int_{\theta}P(X|\theta)P(\theta)d_{\theta}\)
- 所以得到
$$P(\theta|X)=\frac{P(X|\theta)P(\theta)}{\int_{\theta}P(X|\theta)P(\theta)d_{\theta}}$$
- \(P(\theta)\)为的取值与参数\(\theta\)相关,是关于\(\theta\)的一个先验概率
- 结论
- 贝叶斯估计: \(P(\theta|X)=\frac{P(X|\theta)P(\theta)}{\int_{\theta}P(X|\theta)P(\theta)d_{\theta}}\)
- 文字解释: 贝叶斯估计的目标是求参数的后验分布\(P(\theta|X)\),参数\(\theta\)服从先验分布\(P(\theta)\),在已知数据集\(X\)修正后,参数\(\theta\)的后验概率分布为\(P(\theta|X)\)
- 缺点
- 计算\(P(X)=\int_{\theta}P(X|\theta)P(\theta)d_{\theta}\)比较耗时
一个更深入的理解
问题描述
- 已知数据集为\(X=(x_{1}, x_{2},,,x_{n})\),新数据集为\(D=(d_{1}, d_{2},,,d_{m})\)
- 求已知数据集\(X\)的情况下,假设数据集\(X\)由某个模型M(参数为\(\theta\))生成,那么数据集\(D\)也由模型M生成的概率\(P(D|X)\)
- 模型M的确定因素:
- 由三个因素唯一确定
- 参数\(\theta\)的先验分布\(P(\theta)\)
- 模型的类型定义\(f(\theta)\)(高斯分布,贝塔分布,二项分布还是其他什么分布)
- 模型的已知观察数据集\(X\)
- 由两个因素唯一确定
- 模型的类型定义\(f(\theta)\)(高斯分布,贝塔分布,二项分布还是其他什么分布)
- 参数\(\theta\)的后验分布\(P(\theta|X)\)
- 由三个因素唯一确定
- 模型M的确定因素:
- 另一种表述: 用模型M(参数为\(\theta\))生成数据,在已观察到模型M生成了数据集\(X\)后,预测模型M接下来生成数据集\(D\)的概率
极大似然估计(MLE)
特点:假设模型M(参数\(\theta\))没有先验分布
模型参数估计
- 模型参数为一个确定的最优值
- \(\theta^{\star}=\arg\max_{\theta}P(X|\theta)\)
概率计算
- \(P(D|X)=P(D|\theta^{\star})\)
优点
- 计算速度快
缺点
- 不够精确,特别是当观察到的数据集\(X\)太小时,这种情况不考虑参数的先验分布可能会造成过拟合
- 举例: 判断一个学校男女比例,在观察到两个男生,一个女生走出校门后就判断男女比例为2:1显然不合适
- 注意:单个同学是男生或者女生的概率服从伯努利分布,多个同学中男生的数量服从二项分布,整个学校的某个学生是男生的概率服从贝塔分布
- 举例: 判断一个学校男女比例,在观察到两个男生,一个女生走出校门后就判断男女比例为2:1显然不合适
- 不够精确,特别是当观察到的数据集\(X\)太小时,这种情况不考虑参数的先验分布可能会造成过拟合
贝叶斯估计(BPE)
- 特点:假设模型M(参数\(\theta\))有先验分布\(P(\theta)\),计算观察到数据集\(X\)后\(\theta\)的后验分布\(P(\theta|X)\),然后求\(P(D|\theta)\)关于后验分布\(P(\theta|X)\)的期望(这个期望也就是模型M生成数据集\(D\)的概率)
- 这里可以理解为观察到的数据集是对先验分布的修正,修正后的后验分布会更符合模型实际情况(因为先验分布很可能是瞎猜的)
- 模型参数估计
- 模型参数为一个分布
- \(P(\theta|X)=\frac{P(X|\theta)P(\theta)}{\int_{\theta}P(X|\theta)P(\theta)d_{\theta}}\)
- 分子为归一化因子\(P(X)\)
- 必须计算,该值与参数的先验分布\(P(\theta)\),模型的类型定义(\(f(\theta)\))以及数据集\(X\)有关系,不计算\(P(X)\)的话后面计算得到的\(P(D|X)\)也将是一个不确定的值(不是概率值,是\(P(X)\)的函数)
- 概率计算
- \(P(D|X)=\int_{\theta}P(D,\theta|X)d_{\theta}=\int_{\theta}P(D|\theta,X)P(\theta|X)d_{\theta}=\int_{\theta}P(D|\theta)P(\theta|X)d_{\theta}\)
- 式子中\(P(D|\theta,X)=P(D|\theta)\),在通过\(X\)确定\(\theta\)后模型也就确定了,\(X\)不会继续影响\(D\)的生成
- 这里\(P(D|X)\)相当于\(P(D|\theta)\)关于后验分布\(P(\theta|X)\)的期望
- \(P(D|X)=\int_{\theta}P(D,\theta|X)d_{\theta}=\int_{\theta}P(D|\theta,X)P(\theta|X)d_{\theta}=\int_{\theta}P(D|\theta)P(\theta|X)d_{\theta}\)
- 优点
- 计算结果最精确,能根据参数的先验分布和数据集\(X\)的知识,准确计算模型生成数据集\(D\)的概率
- 缺点
- 计算\(P(X)=\int_{\theta}P(X|\theta)P(\theta)d_{\theta}\)比较耗时,不常用
关于\(P(X)\)是否需要计算?
- 无需计算的情况
- 判断两个数据集\(D_{1},D_{2}\)由同一个模型M生成的概率谁大,可以不用计算\(P(X)\)
- 因为对于同一模型M,\(P(X)\)相同大小,此时只需要比较\(P(D_{1},X)\)和\(P(D_{2},X)\)谁大即可知道\(P(D_{1}|X)\)和\(P(D_{2}|X)\)谁大
- 判断两个数据集\(D_{1},D_{2}\)由同一个模型M生成的概率谁大,可以不用计算\(P(X)\)
- 必须计算的情况
- 判断数据集\(D\)由两个模型\(M_{1},M_{2}\)生成的概率谁大,必须计算\(P(X)\)
- 因为对于不同模型\(M_{1},M_{2}\),\(P(X)\)不相同【每个模型生成\(X\)的概率不同】,此时仅仅比较\(P(D_{1},X)\)和\(P(D_{2},X)\)谁大不能确定\(P(D_{1}|X)\)和\(P(D_{2}|X)\)谁大
- 利用模型M采样生成新数据(预测问题),必须计算\(P(X)\)
- 这时候每次采样时需要根据参数\(\theta\)的后验分布采样生成\(\theta_{i}\),然后再根据\(\theta_{i}\)确定的模型\(M_{i}\)采样生成观测数据,两次采样的过程都必须知道准确的分布(积分为1,也就是归一化后的),所以此时必须计算\(P(X)\)
- 判断数据集\(D\)由两个模型\(M_{1},M_{2}\)生成的概率谁大,必须计算\(P(X)\)
最大后验概率估计(MAP)
特点:假设模型M(参数\(\theta\))有先验分布\(P(\theta)\),但不计算模型的后验分布\(P(\theta|X)\),只用最可能的\(\theta\)代替后验分布来确定模型M
模型参数估计
- 模型参数为一个确定的最优值
- \(\theta^{\star}=\arg\max_{\theta}P(\theta|X)=\arg\max_{\theta}P(X|\theta)P(\theta)\)
- 这里与贝叶斯估计作对比可以发现,MAP相当于把参数后验分布简化为最可能的那个参数值,用最可能的参数值代替参数后验分布,这样做对最终预测结果\(P(D|X)\)可能有点误差,但是不用计算复杂的积分\(P(X)=\int_{\theta}P(X|\theta)P(\theta)d_{\theta}\)
- 这里能够用最优值替代分布的前提是分布是很集中的(也就是要\(P(\theta|X)\)方差小,比如贝塔分布,狄利克雷分布和高斯分布等钟型分布的塔尖要尖),不然误差可能会比较大
- 注意后验分布\(P(\theta|X)\)最可能值的参数值是概率最大的地方 \(\theta^{\star}=\arg\max_{\theta}P(\theta|X)\),而不是参数\(\theta\)关于后验分布的期望\(E_{P(\theta|X)}[\theta]=\int_{\theta}\theta P(\theta|X)d_{\theta}\) (期望对应平均值,而不是最可能的值,特例:对称钟型分布的期望同时也是它最可能的值)
概率计算
- \(P(D|X)=P(D|\theta^{\star})\)
计算速度和精确度都介于MLE和BPE之间
总结
- 贝叶斯估计可以退化成最大后验概率估计
- 最大后验概率估计相当于是参数后验分布\(P(\theta|X)\)被最可能的参数值\(\theta^{\star}=\arg\max_{\theta}P(\theta|X)\)替代的贝叶斯估计
- 最大后验概率估计可以退化成极大似然估计
- 极大似然估计相当于是参数\(\theta\)的先验分布\(P(\theta)\)为均为分布的最大后验概率估计
Python——环境之版本和库以及搜索路径管理总结
关于Python版本与pip的关系
pip相关命令
查看pip版本和安装位置
pip --version
列出pip安装库
pip list
查看安装库详细信息(安装目录和版本等)
pip show <lib name>
pip安装库
pip install <lib name>
pip安装(指定版本version)的库(libname)(到指定路径dir)
pip install libname==version -t dir
Mac自带的python:
python: /usr/bin/python
pip: /usr/local/bin/pip
libs: /Library/Python/2.7/site-packages(可通过pip --verison查看到)
anaconda
- Python2为主安装Python3版本
1
2
3
4
5
6python2
python: /anaconda2/bin/python
pip: /anaconda2/bin/pip
python3
python: /anaconda2/envs/python3/bin/python
pip /anaconda2/envs/python3/bin/pip
anaconda版本切换命令
默认在python2环境下(对于安装时选择以python2.7版本为基础的anaconda而言)
source activate python3
source deactivate python3
Python 搜索路径与包(package)
不同Python版本的搜索路径不一样
查看搜索路径
查看该Python版本的搜索路径
1 | python #在终端打开对应版本python(如果是在程序中则不需要这个命令) |
运行时追加路径
运行时我们可以通过向sys.path追加路径来添加自己的库
- 通过sys模块来添加
1
sys.path.append('./python')
如果项目需要添加自定义的库,比如z3py这样的库,我们可以通过在项目中包含该库的源码,然后获取当前程序文件的绝对地址,然后计算出z3py库的绝对地址,并在程序中添加z3py库的绝对路径到sys.path
(为什么是绝对地址而不是相对地址:因为我们的代码(比如z3schedule.py)可能在不同的工作目录下被执行,不同的工作目录自然得到的相对路径也就不同,所以如果我们在其他目录下运行当前python文件,那么我们在这个文件下添加到sys.path的z3py对应的库就访问不到了,所以要读取当前文件的绝对路径而不是使用当前路径)
- 通过
__buildin__
来添加环境变量1
2import __builtin__
__builtin__.Z3_LIB_DIRS = /z3py/bin
注意:PYTHONPATH环境变量指定的目录会自动被添加到搜索路径,这个环境变量与sys.path没关系!!!
Mac——HomeBrew简介
HomeBrew是什么?
- HomeBrew是一个Mac OS上的软件包管理器,命令是brew,类似于Ubuntu上的DPKG(apt-get)或者Centos上的RPM(yum)等
HomeBrew的安装
安装命令
1
/usr/bin/ruby -e"$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
查看安装结果
1
brew -v
HomeBrew管理软件包
- HomeBrew的安装的软件包默认在
/usr/local/Cellar
下 - HomeBrew用
@
指明版本号
搜索云端软件
返回结果中可以看到版本号,后续安装可指定版本号安装
1 | brew search key_str |
安装
1 | brew install pkg_name |
卸载
1 | brew remove pkg_name |
更新
1 | brew upgrade pkg_name |
列出所有已安装软件
1 | brew list |
查看某个云端软件包信息
1 | brew info pkg_name |
HomeBrew管理服务
启动服务
1 | brew services start service_name |
停止服务
1 | brew services stop service_name |
重启服务
1 | brew services restart service_name |
列出所有HomeBrew管理的服务
1 | brew services list |
Ubuntu——添加自定义的软件到启动器
日常使用Ubuntu时,某些自己编写的脚本(程序)或者下载的程序不能从启动器搜索到
问题描述
- 自己编写的脚本
- 自己编写的程序
- 网上自己下载的程序(不是通过apt-get或者APPStore安装)
解决问题
编写程序启动脚本
如果需要运行的就是脚本这一步可以不用
- 编写shell脚本,脚本内容为启动运行程序
- 涉及到程序的名称这里应该用绝对路径
- 脚本可以放到任意地方,一般和当前程序在一个文件夹下即可
添加脚本执行权限
1 | chmod +x exmaple.sh |
新建启动
新建文件到指定文件夹
1
2cd /usr/share/applications
sudo gedit example.desktop编辑文件如下格式
- Name是程序搜索时会出现的名字
- Exec是执行脚本路径,必须有执行权限,否则在启动器中仍然搜索不到该程序
- Icon是软件的图标,这里可以任意自定义图标,从网上下载或者自己生成均可
1
2
3
4
5
6
7
8[Desktop Entry]
Version=1.0
Name=Example
Exec=/home/username/example.sh
Terminal=false
Icon=/home/username/example.png
Type=Application
Categories=Development
测试
- 按键: Win键
- 输入Example
- 如果出现图标和名字对应的程序,说明成功
- 如果不成功,复查以下问题
- 启动脚本路径是否正确且为绝对路径
- 执行权限是否已经成功设置
- Name是否设置正确
Markdown——基本语法
Markdown基本语法
上下标
<sup>上标</sup>
文字上标
<sub>下标</sub>
文字下标
删除线
~~删除线~~
删除线
引用
> 一级引用
>> 二级引用
>>> 三级引用
一级引用
二级引用
三级引用
列表
* 一级列表
* 二级列表
- 二级列表
+ 二级列表
* 一级列表
- 一级列表
+ 一级列表
- 一级列表
- 二级列表
- 二级列表
- 二级列表
- 一级列表
- 一级列表
一级列表
- 有序列表
- 无序列表
- 无序列表
- 有序列表
- 有序列表
- 有序列表
- 无序列表
- 无序列表
- 有序列表
分割线
分割线
***
---
分割线
链接
[链接](https://joezjh.github.io/ "鼠标放到链接上显示此提示")
图片
![图片标题](图片链接 "鼠标放到图片上显示此提示")
表格
| 左对齐标题 | 右对齐标题 | 居中对齐标题 |
| :------| ------: | :------: |
| 短文本 | 中等文本 | 稍微长一点的文本 |
| 稍微长一点的文本 | 短文本 | 中等文本 |
左对齐标题 右对齐标题 居中对齐标题 短文本 中等文本 稍微长一点的文本 稍微长一点的文本 短文本 中等文本
Hexo——不显示post时间
方案
- 不同主题不同
next主题
去除正文页面的post时间:
- 在
./themes/next/layout/_macro/post.swig
中找到”post-time”相关的tag
,然后注释掉该tag
的所有内容(注释方式为``)
- 在
去除归档中每个文档的时间
- 在
./themes/next/layout/_macro/post-collapse.swig
中找到”post-time”相关的tag
,然后修改该tag
中的内容1
2{# {{ date(post.date, 'MM-DD') }} #}
{{ date(post.date, ' ') }}
- 在
去除归档中的年份
- 在
./themes/next/layout/archive.swig
中找到”archive-year”相关的tag
,然后修改该tag
中的内容,把关键信息注释掉1
2
- 在
Hexo——相关问题汇总
本文记录Hexo使用过程中可能遇到的问题
Hexo生成的html文件是空的
- 表现为部署到云端后,显示为空白页面
问题起因
由于node版本问题导致的,可能是node版本太新了
重新安装node为旧版本即可,本文使用的暂时是node 12版本
安装命令(注意:直接使用
brew install node@12
可能无法安装成功,会出现找不到指定版本的错误,12版本太老了,过期了):1
2
3brew install nvm ## 安装nvm后按照提示将相应启动脚本配置到~/.zshrc中
nvm install 12.14.0
nvm use 12.14.0nvm use
只是临时切换 node 版本,只适用于当前 terminal,如果打开新的 terminal,node 可能还是之前的旧版本。如果想要永久切换的话,可使用如下命令(实际上,本地切换到12.14.0后重启terminal也是该版本,未发现其他问题):1
nvm alias default 12.14.0