统计学习方法(1)- 概论

统计学习三要素

方法 = 模型 + 策略 +算法。当我们想使用统计学习方法对数据进行建模时,首先考虑要用哪种模型建模(如线性模型);而策略是在给定模型的假设空间下(如线性函数构成的集合),如何选择最优模型(即模型参数的确定);算法则是指学习模型的具体计算方法(通常解析解不存在)。

策略

【损失函数与风险函数】

  • 损失函数:度量模型一次预测的好坏
  • 风险函数:度量平均意义下模型预测的好坏

监督学习问题是在假设空间 $\mathcal{F}$ 中选取模型 $f$ 作为决策函数,对于给定的输入$X$,由$f(X)$给出相应的输出$Y$,这个输出的预测值$f(X)$ 与真实值$Y$可能一致也可能不一致,用一个损失函数来度量预测错误的程度,记作$L(Y,f(X))$。

常用的损失函数有:

  • 0-1损失函数
  • 平方损失函数
  • 绝对损失函数
  • 对数损失函数

【经验风险最小化与结构风险最小化】

假设给定一个训练数据集

模型$f(X)$关于训练数据集的平均损失称为经验风险经验损失,记作${R_{emp}}(f)$:

损失函数值越小,模型就越好,而我们学习的目标就是选择期望风险最小的模型。根据大数定律,当样本容量$N$ 趋于无穷时,经验风险趋于期望风险(基于全量)。但由于现实中样本数量有限,预估通常并不理想,要对经验风险进行一定的矫正

结构风险最小化(structural risk minimization, SRM)是为了防止当样本容量过小产生“过拟合”的解决策略,等价于正则化 ,是在经验风险基础上加上了表示模型复杂度的正则化项,结构风险的定义是:

其中$J(f)​$ 表示模型的复杂度,模型$f​$ 越复杂,复杂度$J(f)​$ 就越大,表示了对复杂模型的惩罚。

模型选择

在模型选择时,不仅要考虑在训练集上的误差,还要考虑对未知数据的预测能力。如果一味追求在训练数据的预测能力,模型的复杂度往往会比真实模型更高,即产生过拟合。模型选择的方法通常有正则化交叉验证。这里我们详细的讲一下“交叉验证”

交叉验证用于给定数据不是很充足的时候,如果样本量相对充足(>1万条),我们一般随机的把数据分成三份,一份训练集(Trainning Set),一份验证集(Validation Set),最后一份测试集(Test Set)。训练集用于训练模型,验证集用于选择模型及其对应的参数,测试集用于最终对学习方法的评估。

【简单交叉验证】

首先将样本数据随机分成两部分(70%训练,30%测试),然后用训练集训练模型,在测试集上验证模型与参数。接着,再将模型打乱,重新选择训练集与测试集,继续训练和检验模型。最后用损失函数评估最优的模型与参数。

【S折交叉验证】

将样本数据随机分成S个互不相交且大小相同的子集,每次随机的选择S-1份最为训练集,剩下的一份做测试集。将这一过程可能的S种选择重复进行,最后平均误差最小的模型(充分利用了所有样本)

【留一交叉验证】

就是S折交叉验证的特殊情况,S等于样本数N,仅留下1个样本用于测试(即留一),通常用于N小于50的情况下。

最后

Hexo-Next中输入数学公式还是遇到了麻烦,要注意的是:在markdown语法中下划线_代表斜体,而mathjax中的_表示下标,所以使用下标_时,一定要在前面加个反斜杠\_,否则无法解析。

更新(最佳决绝方案,且不用考虑下划线_的问题)

第一步:使用Kramed代替 Marked

1
2
npm uninstall hexo-renderer-marked --save
npm install hexo-renderer-kramed --save

第二步:停止使用 hexo-math

1
2
npm uninstall hexo-math --save
npm install hexo-renderer-mathjax --save

第三步:更新 Mathjax 的 CDN 链接
首先打开/node_modules/hexo-renderer-mathjax/mathjax.html,然后把<script>更改为:

1
<script src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.1/MathJax.js?config=TeX-MML-AM_CHTML"></script>

第四步:更改默认转义规则
因为 hexo 默认的转义规则会将一些字符进行转义,所以我们需要对默认的规则进行修改。先找到../node_modules/kramed/lib/rules/inline.js文件,

1
2
3
4
5
6
7
8
9
# 把
escape: /^\\([\\`*{}\[\]()#$+\-.!_>])/,
# 更改为:
escape: /^\\([`*\[\]()# +\-.!_>])/,
# 再把
em: /^\b_((?:__|[\s\S])+?)_\b|^\*((?:\*\*|[\s\S])+?)\*(?!\*)/,
# 更改为:
em: /^\*((?:\*\*|[\s\S])+?)\*(?!\*)/,

第五步:开启mathjax
在主题_config.yml中开启Mathjax,即修改如下代码:

1
2
mathjax:
enable: true

并在博客中开启Mathjax,即添加以下内容:

1
2
3
4
5
6
---
title: Testing Mathjax with Hexo
category: Uncategorized
date: 2017/05/03
mathjax: true
---

详细可参考

如何在 hexo 中支持 Mathjax?

其余参考资料

如何在Hexo博客中插入数学公式
Hexo-NexT主题使用mathjax输入数学公式注意事项
hexo在Next主题下输入数学公式