微石的碎碎念

  • 首页

  • 关于

  • 标签

  • 分类

  • 归档

  • 站点地图

  • 仓库

搭建博客的原理

发表于 2018-07-22 | 评论数:

不折腾毋宁死,为了更好地魔改博客,对hexo工作原理还是需要有一定地了解,本文节选自【掘金】sunshine小小倩

Hexo

使用 Hexo + github pages 搭建博客,刚刚我们简单介绍了 github pages,那么现在我们就该介绍一下 Hexo,我们了解到 Hexo 是用来生成 HTML 的,那么这篇文章我们就主要来讲一下 Hexo 是怎样生成 HTML 的。

什么是 Hexo

hexo官网在 Hexo 的官网,我们可以直观的看到对 Hexo 的介绍:快速、简洁且高效的博客框架
在 Hexo 的文档中,我们可以找到官方对 Hexo 的定义:

Hexo 是一个快速、简洁且高效的博客框架。Hexo 使用 Markdown(或其他渲染引擎)解析文章,在几秒内,即可利用靓丽的主题生成静态网页。

在官方文档中安装了 Hexo 中我们就安装了 Hexo,然后我们就可以看到文档结构如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
.
├── _config.yml // 站点配置文件
├── db.json // 缓存文件
├── node_modules // 安装的插件以及hexo所需的一些nodejs模块
├── package.json // 项目的依赖文件
├── scaffolds // 模版文件
├── source // 源文件,用来存放你的文章 md 文件
└── themes // 主题文件复制代码然后我们可以安装主题,比我我安装的 NexT 主题,安装完之后会在 themes 下面产生一个 next 文件存放主题中的内容,文档结构如下:
.
├── LICENSE
├── README.en.md // READEME 英文版
├── README.md // READEME 中文文件
├── _config.yml // 主题配置文件
├── bower.json
├── gulpfile.coffee
├── languages // 多语言配置文件
├── layout // 模板文件
├── package.json // 项目的依赖文件
├── scripts // 主题的脚本文件
├── source // 主题的资源文件 CSS IMG
└── test

阅读全文 »

【转载】Hexo - 修改永久链接的默认格式

发表于 2018-07-19 | 评论数:

本文转载自https://lewky.cn/posts/ff4321d8.html ,大佬博客里面由许多魔改教程的,强烈推荐。

Hexo的永久链接的默认格式是 :year/:month/:day/:title/,比如访问站点下某一篇文章时,其路径是 2018/04/12/xxxx/,如果我们的文章标题是中文的,那么该路径就会出现中文字符。在路径中出现了中文字符很容易引发各种问题,而且也不利于seo,因为路径包含了年月日三个层级,层级太深不利于百度蜘蛛抓取。

解决办法就是利用其它的插件来生成唯一的路径,这样就算我们的文件标题随意修改,而不会导致原本的链接失效而造成站点下存在大量的死链。

安装插件
在站点根目录使用 git bash 执行命令:

1
npm install hexo-abbrlink --save

修改站点配置文件
打开根目录下的 _config.yml 文件,修改如下配置:

1
2
3
4
5
6
# permalink: :year/:month/:day/:title/
# permalink_defaults:
permalink: posts/:abbrlink.html
abbrlink:
alg: crc32 # 算法:crc16(default) and crc32
rep: hex # 进制:dec(default) and hex

这里将页面都添加了 .html 的后缀,用来伪装成静态页面(虽说Hexo的页面本身就是静态页面),这样可以直接从路径就知道这是个静态页面,方便seo。

接下来重新部署三连,可以看到我们的文章路径变成了 /posts/xxxxx.html,接下来就算我们将文字标题命名为中文也没问题了。

机器学习之模型整理

发表于 2018-07-19 | 更新于 2018-08-18 | 评论数:

马上开始秋招了,自己总结了一份算法常用知识点,如有错误,欢迎指教。如有遗漏,欢迎补充。

逻辑回归

模型总结

  1. 简介:LR回归是一个线性的二分类模型,可计算样本发生的概率。LR的最终结果是通过使用sigmoid函数(指数族函数)将线性回归的结果与分类任务的真实标记结合起来。
  2. 基本假设:假设数据服从伯努利分布,且样本为正概率为 $p=\dfrac{1}{1+e^{-\theta^{T} x}}$
  3. 损失函数:极大似然函数 : $L _ \theta\left(x\right )= \prod _ {i=1}^{m}h _ \theta(x^{i};\theta )^{y{i}}*(1-h _\theta(x^{i};\theta))^{1-y^{i}}$
  4. 求解方法:梯度下降法(拓展知识点:随机梯度下降,批梯度下降,small batch 梯度下降,Adam,动量法等优化方法)
  5. 为什么LR要使用sigmoid函数:LR属于广义线性模型,sigmoid函数则是指数族函数,
  6. 优点:
    1. 适用于二分类问题,以概率形式输出结果,可以通过取阈值得到分类结果。
    2. 判别模型:LR模型直接对分类可能性进行建模,无需事先假设数据分布,这样就避免了假设分布不准确所带来的问题
    3. 实现简单,分类时计算量非常小,速度快,存储资源低
    4. 可解释性强:线性回归的参数取值反应特征的强弱。
  7. 缺点:
    1. 准确性不高,容易过拟合
    2. 只能处理两分类问题(在此基础上衍生出来的softmax可以用于多分类),且必须线性可分;
  8. 适用场景:
    1. 是否支持大规模数据:支持,并且有分布式实现
    2. 特征维度:可以很高
    3. 是否有 Online 算法:有(参考自)
    4. 特征处理:支持数值型数据,类别型类型
    5. 预估问题场景(如推荐、广告系统中的点击率预估,转化率预估等)
    6. 分类场景(如用户画像中的标签预测,判断内容是否具有商业价值,判断点击作弊等
  9. 多分类问题:
    1. 对k个类别的分类,建立k个二元分类器
    2. 将逻辑回归推广到多元逻辑回归(Multinomial Logistic Regression),模型使用softmax对概率建模,$P(y=i|x, \theta) = \dfrac{e^{\theta_i^T x}}{\sum_j^K{e^{\theta_j^T x}}}$,其中决策函数为$y^* = argmax_i P(y=i|x,\theta)$,损失函数为$J(\theta)=-\dfrac{1}{N} \sum_i^N \sum_j^K {1[y_i=j] \log{\dfrac{e^{\theta_i^T x}}{\sum {e^{\theta_k^T x}}}}}$
    3. 如何选择:如果如果类别之间互斥,则使用softmax.如果类别间有联系,则选用k个二元分类器。
  10. 模型比较:
    1. 与线性回归比较:
      • 相同点:都是广义线性模型
      • 不同点:
        1. 经典线性模型的优化目标函数是最小二乘,而逻辑回归则是似然函数
        2. 线性回归输出连续值,分布范围在整个实数域。逻辑回归通过sigmoid函数将预测值限定为[0,1]间,输出值代表真实标记概率,因而对于这类问题来说,逻辑回归的鲁棒性比线性回归的要好。
    2. 与svm比较,答案2
      • 相同点:
        1. LR和SVM都可以处理分类问题,且一般都用于处理线性可分的二分类问题(在改进的情况下可以处理多分类问题)
      • 不同点:
        1. LR是参数模型,SVM是非参数模型。
        2. 逻辑回归采用的是Logistical Loss,SVM采用的是hinge loss.这两个损失函数的目的都是增加对分类影响较大的数据点的权重,减少与分类关系较小的数据点的权重。
        3. SVM的处理方法是只考虑Support Vectors,也就是和分类最相关的少数点,去学习分类器。而逻辑回归通过非线性映射,大大减小了离分类平面较远的点的权重,相对提升了与分类最相关的数据点的权重。
        4. 逻辑回归相对来说模型更简单,好理解,特别是大规模线性分类时比较方便。而SVM的理解和优化相对来说复杂一些,只需要计算与少数几个支持向量的距离,这个在进行复杂核函数计算时优势很明显,能够大大简化模型和计算。
    3. 与感知机比较
      • 相同点:
        1. 都是线性分类模型,原始模型都只能处理二分类问题
        2. 模型的形式相似(都是在线性模型外通过联系函数映射到另外的空间,只不过感知机是符号函数,LR是sigmoid(或者说Logistic)函数)
        3. 训练方法都是使用梯度下降法
      • 不同点:
        1. LR输出为仅是概率的值,而感知机输出为1/-1
阅读全文 »

【转载】如何正确的选择图床

发表于 2018-07-19 | 评论数:

本文由 Torther 创作,转载自https://www.torther.club/33

说到图床,一些建站的朋友都不陌生吧,图床支撑着网站的图像储存,是不可缺少的东西之一。

镇楼图

镇楼图

正文

图床,说白了就是在网络上存储图片的地方,目的是为了节省本地服务器空间,加快图片打开速度。

本文为大家介绍以下几款图床,不保证能够完全适合你,仅供参考,希望你能找到适合自己的图床。

阅读全文 »

C++Python字符串处理合集

发表于 2018-07-16 | 更新于 2018-07-19 | 评论数:

char

定义

1
2
3
4
char a,b[10]; //定义字符变量a与字符数组b
char c[]="hello,world",d[]={'h','e','l','l','o',',','w','o','r','l','d'}; //字符数组的初始化,未指明数组长度,且数组中没有终止符,数组末尾将生成终止符\0,代表字符串结束,此时sizeof=strlen+1
char e[10]={'h','e','l','l','o'}; //初始化数据小于指定长度,剩余部分自动填充终止符
char f[10]={'h','e','l','l','o',',','w','o','r','l','d'}; //初始化数据大于指定长度,超过部分将被丢弃,此时数组中不含终止符,可能回造成不可预期的后果

长度计算

  1. strlen:strlen函数只计算可见的字符,从字符串开头到第一个终止符为止
  2. sizeof:计算整个数组长度

字符串比较

strcmp(st1,st2)

比较2个字符串,设这两个字符串为str1,str2:

  1. 若str1==str2,则返回零;
  2. 若str1 > str2,则返回正数;
  3. 若str1< str2,则返回负数。
  4. ==,>,<,是通过比较对应位置字符的ASCII码大小实现。

    strncmp(st1,st2,n)

    把st1,st2的前n个进行比较。
阅读全文 »

git版本回退

发表于 2018-07-15 | 更新于 2018-07-19 | 评论数:

由于多电脑使用一个版本仓库,经常出现版本冲突的情况,错误提示error: Your local changes to 'example.py' would be overwritten by merge. Aborting.Please, commit your changes or stash them before you can merge.,然后本次我的错误commit导致问题一直没解决,于是直接使用版本回退功能解决问题。

版本回退 git reset

使用git reset commit_id可以将版本号回到指定版本,commit_id如何指定?可以使用以下方法:

commit_id

git log

通过用git log可以查看提交历史,以便确定要回退到哪个版本。此方法一半适用与比较回退版本较少情况,因为git bash里输出的信息太多,不方便查看。

git log -n可查看最近n此提交,git log状态下按q键可退出。

HEAD

在git中,HEAD指向当前版本,上一版本HEAD^,上上版本HEAD^^,依次类推,也可使用HEAD~n来回退n个版本。

git GUI

可在git GUI中点击菜单上的 repository – visualize master’s History/visualize all branch History 查看历史版本。

git reset参数

git reset参数在git reset后输入,比如git reset --hard commit_id

mixed

将本地版本库的头指针全部重置到指定版本,且会重置暂存区,即这次提交之后的所有变更都移动到未暂存阶段

soft

软回退表示将本地版本库的头指针全部重置到指定版本,且将这次提交之后的所有变更都移动到暂存区

hard

将本地版本库的头指针全部重置到指定版本,也会重置暂存区,并且会将工作区代码也回退到这个版本

追加提交

回退版本之后可以使用git commit --amend进行追加提交,优点是不会产生新的commit-id,

leetcode 刷题总结

发表于 2018-07-13 | 更新于 2018-07-19 | 评论数:

leetcode 刷题总结

开始刷 leetcode 和剑指 offer 大概一周多了吧,从最开始最简单的代码也要敲 30 mins,各种 bug 不断,到现在简单的可以10 mins 敲完(当然也有些没有思路的),还是有些进步的,另外发现还是需要把一些题解记录下来,总结一下,因为目前按 tags 和难度分开刷的,题目编号可能不连续,打算长期更新,加油吧!

进度更新(6月4日):跌跌撞撞也做了80+题,从开始只做简单到现在开始做些中等题,也算有些进步吧,不足的是代码bug太多,总体接受率才28%,加油,接下来想办法提升接受率,不要一直改bug!

更新(6月26号):最近一段时间没怎么刷题,开始刷题一个多月了,现在leetcode上才刷97题,blog上才更了不到70题,不知道为什么有些题没有记录上来。另外做了一下牛客网的校招编程题,感觉还是不会做。

阅读全文 »

使用python在文本文件中添加特定内容

发表于 2018-07-13 | 更新于 2018-07-19 | 评论数:

昨天折腾博客折腾了一整天,什么事情都没干,好气啊,于是又水了一篇blog。
主要就是加入了版权信息,具体效果可以看结尾。操作可参考此教程。这教程写的很不错,欢迎大家一起折腾。
其实还有些改动,比如想加入导航页,最后也没成功,哎,不多说了。开始吧。

需要在页面尾部显示版权信息,需要在开头加入copyright: true,效果如下:

---
title: 使用python在文本文件中添加特定内容
copyright: true
date: 2018-07-13 09:08:39
tags:
---

于是想用python写个脚本,批量在md文件开头加入copyright,代码也不难,直接贴了。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#!/usr/bin/python
import os
def file_name(file_dir):
# 获取所有md文件名
filelist = []
for root, dirs, files in os.walk(file_dir):
for fileName in files:
if(fileName[-3:]=='.md'):
filelist.append(fileName) #当前路径下所有非目录子文件
return filelist
path = './'
file_list = file_name(path)
print(file_list)
content_add='copyright: true \n' # 需要加入的信息
for i in file_list:
file = open(i,'r',encoding='utf-8')
content = file.read() # 读取文件
if(content.find('copyright: true')==-1):
# 如果没有copyright信息,则找到tags位置,并将copyright信息插入
pos=content.find('tags:')
content = content[:pos] + content_add + content[pos:]
file.close()
file = open(i,'w',encoding='utf-8') # 保存文件
file.write( content )

昨天瞎改完,发现文章的图片已经不能正常显示了,然后折腾了一下也没解决,以后有机会再找个图床吧。

又开心地水了篇博客。

机器学习之模型评估

发表于 2018-07-11 | 更新于 2018-08-05 | 评论数:

过拟合与欠拟合

过拟合(over-fitting)

过拟合其实就是所建的机器学习模型或者是深度学习模型在训练样本中过度学习,将训练样本的误差等特点也当作样本的一般特性,导致在验证数据集以及测试数据集中表现不佳。

欠拟合

欠拟合值机器学习模型并没有将样本的一般性质学好。

模型评估

使用实验测试来对模型的泛化能力做出评估进而做出选择,通常使用测试集对模型识别新样本能力进行测试。

留出法

“留出法”(hold-out)直接将数据集D划分为两个互斥的集合,其中一个集合作为训练集S,另一个作为测试集T。在S上训练出模型后,用T来评估其测试误差,作为对泛化误差的估计。

需注意的是,训练/测试集的划分要尽可能保持数据分布的一致性,避免因数据划分过程引入额外的偏差而对最终结果产生影响,例如在分类任务中至少要保持样本的类别比例相似。另一个需注意的问题是,即便在给定训练/测试集的样本比例后,仍存在多种划分方式对初始数据集D进行分割,这些不同的划分将导致不同的训练/测试集,相应的,模型评估的结果也会有差别。因此,单次使用留出法得到的估计结果往往不够稳定可靠,在使用留出法时,一般要采用若干次随机划分、重复进行实验评估后取平均值作为留出法的评估结果。

另外使用留出法会导致一个窘境:若令训练集S包含绝大多数样本,则训练出的模型可能更接近于用D训练出的模型,但由于T比较小,评估结果可能不够稳定准确;若令测试集T多包含一些样本,则训练集S与D差别更大了,被评估的模型与用D训练出的模型相比可能有较大差别,从而降低了评估结果的保真性(fidelity)。这个问题没有完美的解决方案,常见做法是将大约2/3~4/5的样本用于训练,剩余样本用于测试。可从“偏差-方差”的角度来理解:测试集小时,评估结果的方差较大;训练集小时,评估结果的偏差较大。

这个问题没有完美的解决方案,常见做法是将大约2/3~4/5的样本用于训练,剩余样本用于测试。

阅读全文 »

机器学习竞赛大杀器-xgboost

发表于 2018-07-10 | 更新于 2018-07-19 | 评论数:

有关决策树与集成学习的介绍:决策树、集成学习

XGB

XGB 同随机森林一样,通过构建一系列决策树(准确说应该是CART树)来组成最终的预测模型,由 $K$ 棵函数为 $f _ k(x _ i)$ 树组成的 XGB 模型可写成:

$$\hat y _ i = \sum _ {k=1}^K f _ k(x _ i), \quad f _ k \in \mathcal{F}$$

模型的目标函数为:
$$Obj(\Theta) = \sum _ i^n l(y _ i,\hat y _ i) +\sum _ {k=1}^K\Omega(f _ k)$$
这个目标函数的第一部分就是损失函数,第二部分就是正则项。

阅读全文 »
123…7
微石

微石

吾本逍遥

65 日志
28 标签
GitHub E-Mail
© 2018 微石
由 Hexo 强力驱动 v3.3.9
|
主题 — NexT.Gemini v6.2.0