diff --git a/AGNES.md b/AGNES.md index 17cc77b..1f05b7a 100644 --- a/AGNES.md +++ b/AGNES.md @@ -1,4 +1,4 @@ -# 以距离为尺-AGNES算法 +# AGNES算法 `AGNES`算法是一种聚类算法,最初将每个对象作为一个簇,然后这些簇根据某些距离准则被一步步地合并。两个簇间的相似度有多种不同的计算方法。聚类的合并过程反复进行直到所有的对象最终满足簇数目。所以理解`AGNES`算法前需要先理解一些距离准则。 @@ -44,7 +44,7 @@ 举个例子,现在先要将西瓜数据聚成两类,数据如下表所示: | 编号 | 体积 | 重量 | -| ------------ | ------------ | ------------ | +| :-: | :-: | :-:| | 1 | 1.2 | 2.3 | | 2 | 3.6 | 7.1 | | 3 | 1.1 | 2.2 | diff --git a/algorithm.md b/algorithm.md index e7c667b..80373d8 100644 --- a/algorithm.md +++ b/algorithm.md @@ -15,6 +15,8 @@ - AGNES -本章的所有实训已在`educoder`平台上提供,若您感兴趣可以通过扫码查看整套课程。 +本章的所有实训已在`educoder`平台上提供,若感兴趣可以输入链接进行体验:https://www.educoder.net/paths/194 + +也通过扫码查看整套课程。
\ No newline at end of file diff --git a/bayes.md b/bayes.md index 909b677..af0fa10 100644 --- a/bayes.md +++ b/bayes.md @@ -1,4 +1,4 @@ -# 用概率说话-朴素贝叶斯分类器 +# 朴素贝叶斯分类器 朴素贝叶斯分类算法是基于贝叶斯理论和特征条件独立假设的分类算法。对于给定的训练集,首先基于特征条件独立假设学习数据的概率分布。然后基于此模型,对于给定的特征数据`x`,利用贝叶斯定理计算出标签`y`。朴素贝叶斯分类算法实现简单,预测的效率很高,是一种常用的分类算法。 @@ -25,7 +25,7 @@ 举个例子,**现在有一个表格,表格中统计了甲乙两个厂生产的产品中合格品数量、次品数量的数据。数据如下:** | | 甲厂 |乙厂 |合计 | -| ------------ | ------------ | ------------ | ------------ | +| :-: | :-: | :-:| :-: | | 合格品 | 475 | 644 | 1119 | | 次品| 25 | 56 | 81 | | 合计| 500 | 700 | 1200 | @@ -58,13 +58,13 @@ 但是每条路每天拥堵的可能性不太一样,由于路的远近不同,选择每条路的概率如下表所示: | L1 | L2 | L3 | -| ------------ | ------------ | ------------ | +| :-: | :-: | :-: | | 0.5 | 0.3 | 0.2 | 每天从上述三条路去公司时不堵车的概率如下表所示: | L1不堵车 | L2不堵车 | L3不堵车 | -| ------------ | ------------ | ------------ | +| :-: | :-: | :-: | | 0.2 | 0.4 | 0.7 | 如果不堵车就不会迟到,现在小明想要算一算去公司上班不会迟到的概率是多少,应该怎么办呢? @@ -129,7 +129,7 @@ $$ 假如现在一个西瓜的数据如下表所示: | 颜色 | 声音 | 纹理 | 是否为好瓜 | -| ------------ | ------------ | ------------ | ------------ | +| :-: | :-: | :-: | :-: | | 绿 | 清脆 | 清晰 | ? | 若想使用朴素贝叶斯分类算法的思想,根据这条数据中`颜色`、`声音`和`纹理`这三个特征来推断是不是好瓜,我们需要计算出这个西瓜是好瓜的概率和不是好瓜的概率。 @@ -180,7 +180,7 @@ $$ 训练的流程非常简单,主要是计算各种**条件概率**。假设现在有一组西瓜的数据,如下表所示: | 编号 | 颜色 | 声音 | 纹理 | 是否为好瓜 | -| ------------ | ------------ | ------------ | ------------ | ------------ | +| :-: | :-: | :-: | :-: | :-: | | 1 | 绿 | 清脆 | 清晰 | 是 | | 2 | 黄 | 浑厚 | 模糊 | 否 | | 3 | 绿 | 浑厚 | 模糊 | 是 | @@ -208,7 +208,7 @@ $$ 当得到以上概率后,训练阶段的任务就已经完成了。我们不妨再回过头来预测一下这个西瓜是不是好瓜。 | 颜色 | 声音 | 纹理 | 是否为好瓜 | -| ------------ | ------------ | ------------ | ------------ | +| :-: | :-: | :-: | :-: | | 绿 | 清脆 | 清晰 | ? | 假设事件`A1`为好瓜,事件`B`为绿,事件`C`为清脆,事件`D`为清晰。则有: diff --git a/classification_metrics.md b/classification_metrics.md index efb83ac..53b60a4 100644 --- a/classification_metrics.md +++ b/classification_metrics.md @@ -6,7 +6,7 @@ 准确度这个概念相信对于大家来说肯定并不陌生,就是正确率。例如模型的预测结果与数据真实结果如下表所示: | 编号 | 预测结果 | 真实结果 | -| ------------ | ------------ | ------------ | +| :-: | :-: | :-: | | 1 | 1 | 2 | | 2 | 2 | 2 | | 3 | 3 | 3 | @@ -33,21 +33,21 @@ 如果我们把这些结果组成如下矩阵,则该矩阵就成为**混淆矩阵**。 | 真实\预测 | 0 | 1 | -| ------------ | ------------ | ------------ | +| :-: | :-: | :-: | | 0 | 9978 | 12 | | 1 | 2 | 8 | 混淆矩阵中每个格子所代表的的意义也很明显,意义如下: | 真实\预测 | 0 | 1 | -| ------------ | ------------ | ------------ | +| :-: | :-: | :-: | | 0 | 预测 0 正确的数量 | 预测 1 错误的数量 | | 1 | 预测 0 错误的数量 | 预测 1 正确的数量 | 如果将正确看成是`True`,错误看成是`False`, `0`看成是 `Negtive`,`1`看成是`Positive`。然后将上表中的文字替换掉,混淆矩阵如下: | 真实\预测 | 0 | 1 | -| ------------ | ------------ | ------------ | +| :-: | :-: | :-: | | 0 | TN | FP | | 1 | FN | TP | @@ -56,7 +56,7 @@ 很明显,当`FN`和`FP`都等于`0`时,模型的性能应该是最好的,因为模型并没有在预测的时候犯错误。即如下混淆矩阵: | 真实\预测 | 0 | 1 | -| ------------ | ------------ | ------------ | +| :-: | :-: | :-: | | 0 | 9978 | 0 | | 1 | 0 | 22 | @@ -76,7 +76,7 @@ $$ 假如癌症检测系统的混淆矩阵如下: | 真实\预测 | 0 | 1 | -| ------------ | ------------ | ------------ | +| :-: | :-: | :-: | | 0 | 9978 | 12 | | 1 | 2 | 8 | @@ -99,7 +99,7 @@ $$ 假如癌症检测系统的混淆矩阵如下: | 真实\预测 | 0 | 1 | -| ------------ | ------------ | ------------ | +| :-: | :-: | :-: | | 0 | 9978 | 12 | | 1 | 2 | 8 | @@ -180,7 +180,7 @@ $$ 从图中可以看出,**当模型的 TPR 越高 FPR 也会越高, TPR 越低 FPR 也会越低。这与精准率和召回率之间的关系刚好相反。**并且,模型的分类阈值一但改变,就有一组对应的`TPR`与`FPR`。假设该模型在不同的分类阈值下其对应的`TPR`与`FPR`如下表所示: | TPR | FPR | -| ------------ | ------------ | +| :-: | :-: | | 0.2 | 0.08 | | 0.35 | 0.1 | | 0.37 | 0.111 | @@ -219,7 +219,7 @@ $$ 举个例子,现有预测概率与真实类别的表格如下所示(其中`0`表示 `Negtive` ,`1`表示`Positive`): | 编号 | 预测概率 | 真实类别 | -| ------------ | ------------ | ------------ | +| :-: | :-: | :-: | | 1 | 0.1 | 0 | | 2 | 0.4 | 0 | | 3 | 0.3 | 1 | @@ -228,7 +228,7 @@ $$ 想要得到公式中的`rank` ,就需要将预测概率从小到大排序,排序后如下: | 编号 | 预测概率 | 真实类别 | -| ------------ | ------------ | ------------ | +| :-: | :-: | :-: | | 1 | 0.1 | 0 | | 3 | 0.3 | 1 | | 2 | 0.4 | 0 | diff --git a/cluster_metrics.md b/cluster_metrics.md index d2844fb..4d81ef4 100644 --- a/cluster_metrics.md +++ b/cluster_metrics.md @@ -39,7 +39,7 @@ $$ 举个例子,参考模型给出的簇与聚类模型给出的簇划分如下: | 编号 | 参考簇 | 聚类簇 | -| ------------ | ------------ | ------------ | +| :-: | :-: | :-: | | 1 | 0 | 0 | | 2 | 0 | 0 | | 3 | 0 | 1 | @@ -115,7 +115,7 @@ $$ 举个例子,现在有$$6$$条西瓜数据$$\{x_1,x_2,...,x_6\}$$,这些数据已经聚类成了$$2$$个簇。 | 编号 | 体积 | 重量 | 簇 | -| ------------ | ------------ | ------------ | ------------ | +| :-: | :-: | :-: | :-: | | 1 | 3 | 4 | 1 | | 2 | 6 | 9 | 2 | | 3 | 2 | 3 | 1 | @@ -196,7 +196,7 @@ $$ 还是这个例子,现在有`6`条西瓜数据$$\{x_1,x_2,...,x_6\}$$,这些数据已经聚类成了 2 个簇。 | 编号 | 体积 | 重量 | 簇 | -| ------------ | ------------ | ------------ | ------------ | +| :-: | :-: | :-: | :-: | | 1 | 3 | 4 | 1 | | 2 | 6 | 9 | 2 | | 3 | 2 | 3 | 1 | diff --git a/decision_tree.md b/decision_tree.md index c132154..504c012 100644 --- a/decision_tree.md +++ b/decision_tree.md @@ -1,4 +1,4 @@ -# 最接近人类思维的分类算法-决策树 +# 决策树 ## 什么是决策树 @@ -33,11 +33,11 @@ $$ **当然条件熵的一个性质也熵的性质一样,我概率越确定,条件熵就越小,概率越五五开,条件熵就越大**。 -现在已经知道了什么是熵,什么是条件熵。接下来就可以看看什么是信息增益了。所谓的信息增益就是表示我已知条件 $$X$$ 后能得到信息 $$Y$$ 的不确定性的减少程度。就好比,我在玩读心术。您心里想一件东西,我来猜。我已开始什么都没问你,我要猜的话,肯定是瞎猜。这个时候我的熵就非常高对不对。然后我接下来我会去试着问你是非题,当我问了是非题之后,我就能减小猜测你心中想到的东西的范围,这样其实就是减小了我的熵。那么我熵的减小程度就是我的**信息增益**。 +现在已经知道了什么是熵,什么是条件熵。接下来就可以看看什么是信息增益了。所谓的信息增益就是表示我已知条件 $$X$$ 后能得到信息 $$Y$$ 的不确定性的减少程度。就好比,我在玩读心术。您心里想一件东西,我来猜。我一开始什么都没问你,我要猜的话,肯定是瞎猜。这个时候我的熵就非常高对不对。然后我接下来我会去试着问你是非题,当我问了是非题之后,我就能减小猜测你心中想到的东西的范围,这样其实就是减小了我的熵。那么我熵的减小程度就是我的**信息增益**。 所以信息增益如果套上机器学习的话就是,如果把特征 $$A$$ 对训练集 $$D$$ 的信息增益记为 $$g(D, A)$$ 的话,那么 $$g(D, A)$$ 的计算公式就是:$$g(D,A)=H(D)-H(D|A)$$。 -如果看到这一堆公式可能会懵逼,那不如举个栗子来看看信息增益怎么算。假设我现在有这一个数据表,第一列是性别,第二列是活跃度, 第三列是客户是否流失的 $$label$$。 +如果看到这一堆公式可能会比较烦,那不如举个栗子来看看信息增益怎么算。假设我现在有这一个数据表,第一列是性别,第二列是活跃度, 第三列是客户是否流失的 $$label$$。
diff --git a/img/10.jpg b/img/10.jpg index 7e391c8..0dbd7e9 100644 Binary files a/img/10.jpg and b/img/10.jpg differ diff --git a/img/11.jpg b/img/11.jpg index 189dd4a..13d0325 100644 Binary files a/img/11.jpg and b/img/11.jpg differ diff --git a/img/12.jpg b/img/12.jpg index 50b50e3..bfc0076 100644 Binary files a/img/12.jpg and b/img/12.jpg differ diff --git a/img/13.jpg b/img/13.jpg index f5da8a1..8f13053 100644 Binary files a/img/13.jpg and b/img/13.jpg differ diff --git a/img/14.jpg b/img/14.jpg index 2cc130f..61a1205 100644 Binary files a/img/14.jpg and b/img/14.jpg differ diff --git a/img/16.jpg b/img/16.jpg index 9bd06e3..400d6bf 100644 Binary files a/img/16.jpg and b/img/16.jpg differ diff --git a/img/17.jpg b/img/17.jpg index 29d4fdf..9303321 100644 Binary files a/img/17.jpg and b/img/17.jpg differ diff --git a/img/21.jpg b/img/21.jpg index 13166f8..c0e7c16 100644 Binary files a/img/21.jpg and b/img/21.jpg differ diff --git a/kMeans.md b/kMeans.md index d580286..a8464c4 100644 --- a/kMeans.md +++ b/kMeans.md @@ -1,4 +1,4 @@ -# 物以类聚人以群分-k Means +# k Means **k Means**是属于机器学习里面的非监督学习,通常是大家接触到的第一个聚类算法,其原理非常简单,是一种典型的基于**距离**的聚类算法。**距离**指的是每个样本到质心的距离。那么,这里所说的质心是什么呢? diff --git a/kNN.md b/kNN.md index d056c9b..2341789 100644 --- a/kNN.md +++ b/kNN.md @@ -1,4 +1,4 @@ -# 近朱者赤近墨者黑-kNN +# kNN **kNN算法**其实是众多机器学习算法中最简单的一种,因为该算法的思想完全可以用`8`个字来概括:**“近朱者赤,近墨者黑”**。 @@ -17,14 +17,14 @@ 现在使用**kNN算法**来鉴别一下我是宅男还是文艺青年。首先需要计算我与样本空间中所有样本的距离。假设计算得到的距离表格如下: | 样本编号 | 1 | 2 | ... | 13 | 14 | -| ------------ | ------------ | ------------ | ------------ | ------------ | ------------ | +| :-: | :-: | :-: | :-: | :-: | :-: | | 标签 | 宅男 | 宅男 | ... | 文艺青年 | 文艺青年 | | 距离 | 11.2 | 9.5 | ... | 23.3 | 37.6 | 然后找出与我距离最小的`k`个样本(`k`是一个超参数,需要自己设置,一般默认为`5`),假设与我离得最近的`5`个样本的标签和距离如下: | 样本编号 | 4 | 5 | 6 | 7 | 8 | -| ------------ | ------------ | ------------ | ------------ | ------------ | ------------ | +| :-: | :-: | :-: | :-: | :-: | :-: | | 标签 | 宅男 | 宅男 | 宅男 | 宅男 | 文艺青年 | | 距离 | 11.2 | 9.5 | 7.7 | 5.8 | 15.2 | @@ -33,7 +33,7 @@ **注意**:有的时候可能会有票数一致的情况,比如`k = 4`时与我离得最近的样本如下: | 样本编号 | 4 | 9 | 11 | 13 | -| ------------ | ------------ | ------------ | ------------ | ------------ | +| :-: | :-: | :-: | :-: | :-: | | 标签 | 宅男 | 宅男 | 文艺青年 | 文艺青年 | | 距离 | 4.2 | 9.5 | 7.7 | 5.8 | @@ -46,7 +46,7 @@ 在使用`kNN`算法解决回归问题时的思路和解决分类问题的思路基本一致,只不过预测标签值是多少的的时候是将距离最近的`k`个样本的标签值加起来再算个平均,而不是投票。例如离待预测样本最近的`5`个样本的标签如下: | 样本编号 | 4 | 9 | 11 | 13 | 15 | -| ------------ | ------------ | ------------ | ------------ | ------------ | ------------ | +| :-: | :-: | :-: | :-: | :-: | :-: | | 标签 | 1.2 | 1.5 | 0.8 | 1.33 | 1.19| 所以待预测样本的标签为:`(1.2+1.5+0.8+1.33+1.19)/5=1.204` diff --git a/linear_regression.md b/linear_regression.md index 73b268b..d5fb878 100644 --- a/linear_regression.md +++ b/linear_regression.md @@ -1,12 +1,12 @@ -# 最简单的回归算法-线性回归 +# 线性回归 ## 什么是线性回归 -线性回归是什么意思?我们可以拆字释义。回归肯定不用我多说了,那什么是线性呢?我们可以回忆一下初中时学过的直线方程:$$y=k*x+b$$ +线性回归是什么意思?可以拆字释义。回归肯定不用我多说了,那什么是线性呢?我们可以回忆一下初中时学过的直线方程:$$y=k*x+b$$ 这个式子表达的是,当我知道 k(参数)和 b(参数)的情况下,我随便给一个 x 我都能通过这个方程算出 y 来。而且呢,这个式子是线性的,为什么呢?因为从直觉上来说,你都知道,这个式子的函数图像是条直线。 -从理论上来说,这式子满足线性系统的性质(至于线性系统是什么,可以查阅相关资料,这里就不多做赘述了,不然没完没了)。您可能会觉得疑惑,这一节要说的是线性回归,我说个这么 low 直线方程干啥?其实,说白了,线性回归就是在 N 维空间中找一个形式像直线方程一样的函数来拟合数据而已。比如说,我现在有这么一张图,横坐标代表房子的面积,纵坐标代表房价。 +从理论上来说,这式子满足线性系统的性质(至于线性系统是什么,可以查阅相关资料,这里就不多做赘述了,不然没完没了)。你可能会觉得疑惑,这一节要说的是线性回归,我说个这么 low 直线方程干啥?其实,说白了,线性回归就是在 N 维空间中找一个形式像直线方程一样的函数来拟合数据而已。比如说,我现在有这么一张图,横坐标代表房子的面积,纵坐标代表房价。
@@ -28,15 +28,15 @@ ## 损失函数 -那既然是找直线,那肯定是要有一个评判的标准,来评判哪条直线才是最好的。OK,道理我们都懂,那咋评判呢?其实只要算一下实际房价和我找出的直线根据房子大小预测出来的房价之间的差距就行了。说白了就是算两点的距离。当我们把所有实际房价和预测出来的房价的差距(距离)算出来然后做个加和,我们就能量化出现在我们预测的房价和实际房价之间的误差。例如下图中我画了很多条小数线,每一条小数线就是实际房价和预测房价的差距(距离)。 +那既然是找直线,那肯定是要有一个评判的标准,来评判哪条直线才是最好的。OK,道理我们都懂,那咋评判呢?其实只要算一下实际房价和我找出的直线根据房子大小预测出来的房价之间的差距就行了。说白了就是算两点的距离。当把所有实际房价和预测出来的房价的差距(距离)算出来然后做个加和,就能量化出现在预测的房价和实际房价之间的误差。例如下图中我画了很多条小数线,每一条小数线就是实际房价和预测房价的差距(距离)。
-然后把每条小竖线的长度加起来就等于我们现在通过这条直线预测出的房价与实际房价之间的差距。那每条小竖线的长度的加和怎么算?其实就是欧式距离加和,公式为:$$\sum_{i=1}^m(y^{(i)}-y\hat{^{(i)}})^2$$(其中$$y(i)$$表示的是实际房价,$$y \hat (i)$$表示的是预测房价)。 +然后把每条小竖线的长度加起来就等于现在通过这条直线预测出的房价与实际房价之间的差距。那每条小竖线的长度的加和怎么算?其实就是欧式距离加和,公式为:$$\sum_{i=1}^m(y^{(i)}-y\hat{^{(i)}})^2$$(其中$$y(i)$$表示的是实际房价,$$y \hat (i)$$表示的是预测房价)。 -这个欧氏距离加和其实就是用来量化预测结果和真实结果的误差的一个函数。在机器学习中称它为**损失函数**(说白了就是计算误差的函数)。那有了这个函数,我们就相当于有了一个评判标准,当这个函数的值越小,就越说明我们找到的这条直线越能拟合我们的房价数据。所以说啊,线性回归就是通过这个损失函数做为评判标准来找出一条直线。 +这个欧氏距离加和其实就是用来量化预测结果和真实结果的误差的一个函数。在机器学习中称它为**损失函数**(说白了就是计算误差的函数)。那有了这个函数,就相当于有了一个评判标准,当这个函数的值越小,就越说明找到的这条直线越能拟合房价数据。所以说啊,线性回归就是通过这个损失函数做为评判标准来找出一条直线。 如果假设$$h_{(\theta)}(x)$$表示当权重为$$\theta$$,输入为$$x$$时计算出来的$$y \hat (i)$$,那么线性回归的损失函数$$J(\theta)$$就是: @@ -49,17 +49,17 @@ $$ ## 怎样计算出线性回归的解? -现在您应该已经弄明白了一个事实,那就是我只要找到一组参数(也就是线性方程每一项上的系数)能让我的损失函数的值最小,那我这一组参数就能最好的拟合我现在的训练数据。OK,那怎么来找到这一组参数呢?其实有两种套路,一种就是用大名鼎鼎的**梯度下降**,其大概思想就是根据每个参数对损失函数的偏导来更新参数。另一种是线性回归的**正规方程解**,这名字听起来高大上,其实本质就是根据一个固定的式子计算出参数。由于**正规方程解**在数据量比较大的时候时间复杂度比较高,所以在这一部分中,主要聊聊怎样使用梯度下降的方法来更新参数。 +现在你应该已经弄明白了一个事实,那就是我只要找到一组参数(也就是线性方程每一项上的系数)能让我的损失函数的值最小,那我这一组参数就能最好的拟合我现在的训练数据。OK,那怎么来找到这一组参数呢?其实有两种套路,一种就是用大名鼎鼎的**梯度下降**,其大概思想就是根据每个参数对损失函数的偏导来更新参数。另一种是线性回归的**正规方程解**,这名字听起来高大上,其实本质就是根据一个固定的式子计算出参数。由于**正规方程解**在数据量比较大的时候时间复杂度比较高,所以在这一部分中,主要聊聊怎样使用梯度下降的方法来更新参数。 ### 什么是梯度下降 -其实梯度下降不是一个机器学习算法,而是一种基于搜索的最优化方法。因为很多算法都没有正规解的,所以需要通过一次一次的迭代来找到找到一组参数能让我们的损失函数最小。损失函数的大概套路可以参看这个图: +其实梯度下降不是一个机器学习算法,而是一种基于搜索的最优化方法。因为很多算法都没有正规解的,所以需要通过一次一次的迭代来找到找到一组参数能让损失函数最小。损失函数的大概套路可以参看这个图:
所以说,梯度下降的作用是不断的寻找靠谱的权重是多少。 -现在我们已经知道了梯度下降就是用来找权重的,那怎么找权重呢?瞎猜?不可能的。。这辈子都不可能猜的。想想都知道,权重的取值范围可以看成是个实数空间,那 100 个特征就对应着 100 个权重,10000 个特征就对应着 10000 个权重。如果靠瞎猜权重的话。应该这辈子都猜不中了。所以找权重的找个套路来找,这个套路就是**梯度**。**梯度**其实就是让函数值为 0 时其中各个变量的偏导所组成的向量,而且**梯度方向**是使得**函数值增长最快的方向**。 +现在已经知道了梯度下降就是用来找权重的,那怎么找权重呢?瞎猜?不可能的....这辈子都不可能猜的。想想都知道,权重的取值范围可以看成是个实数空间,那`100`个特征就对应着 `100`个权重,`10000`个特征就对应着`10000`个权重。如果靠瞎猜权重的话,应该这辈子都猜不中了。所以找权重的找个套路来找,这个套路就是**梯度**。**梯度**其实就是让函数值为 0 时其中各个变量的偏导所组成的向量,而且**梯度方向**是使得**函数值增长最快的方向**。 这个性质怎么理解呢?举个栗子。假如我是个想要成为英雄联盟郊区王者的死肥宅,然后要成为郊区王者可能有这么几个因素,一个是英雄池的深浅,一个是大局观,还有一个是骚操作。他们对我成为王者来说都有一定的权重。如图所示,每一个因素的箭头都有方向(也就是因素对于我成为王者的偏导的方向)和长度(偏导的值的大小)。然后在这些因素的共同作用下,我最终会朝着一个方向来训练(好比物理中分力和合力的关系),这个时候我就能以最快的速度向郊区王者更进一步。 @@ -68,7 +68,7 @@ $$ 也就是说我如果一直朝着最终的那个方向努力的话,理论上来说我就能以最快的速度成为郊区王者。 -现在我们知道了梯度的方向是函数增长最快的方向,那我在梯度前面取个负号(反方向),那不就是函数下降最快的方向了么。所以,梯度下降它的本质就是更新权重的时候是沿着梯度的反方向更新。好比下面这个图,假如我是个瞎子,然后莫名其妙的来到了一个山谷里。现在我要做的事情就是走到山谷的谷底。因为我是瞎子,所以我只能一点一点的挪。要挪的话,那我肯定是那我的脚在我四周扫一遍,觉得哪里感觉起来更像是在下山那我就往哪里走。然后这样循环反复一发我最终就能走到山谷的谷底。 +现在你知道了梯度的方向是函数增长最快的方向,那我在梯度前面取个负号(反方向),那不就是函数下降最快的方向了么。所以,梯度下降它的本质就是更新权重的时候是沿着梯度的反方向更新。好比下面这个图,假如我是个瞎子,然后莫名其妙的来到了一个山谷里。现在我要做的事情就是走到山谷的谷底。因为我是瞎子,所以我只能一点一点的挪。要挪的话,那我肯定是那我的脚在我四周扫一遍,觉得哪里感觉起来更像是在下山那我就往哪里走。然后这样循环反复一发我最终就能走到山谷的谷底。
@@ -86,7 +86,7 @@ $$ $$ \frac{\partial J(\theta_j)}{\theta_J} = (h_\theta(x)-y)x_j -$$。 +$$ 所以很自然的可以想到,使用梯度下降求解线性回归的解的流程如下: diff --git a/logistic_regression.md b/logistic_regression.md index b3c322f..b5d218e 100644 --- a/logistic_regression.md +++ b/logistic_regression.md @@ -1,6 +1,6 @@ -# 使用回归的思想进行分类-逻辑回归 +# 逻辑回归 -逻辑回归是属于机器学习里面的监督学习,它是以回归的思想来解决分类问题的一种非常经典的二分类分类器。由于其训练后的参数有较强的可解释性,在诸多领域中,逻辑回归通常用作 baseline模型,以方便后期更好的挖掘业务相关信息或提升模型性能。 +逻辑回归是属于机器学习里面的监督学习,它是以回归的思想来解决分类问题的一种非常经典的二分类分类器。由于其训练后的参数有较强的可解释性,在诸多领域中,逻辑回归通常用作 `baseline`模型,以方便后期更好的挖掘业务相关信息或提升模型性能。 ## 逻辑回归大体思想 @@ -30,7 +30,7 @@ $$ $$sigmoid$$ 函数的公式为:$$\sigma(t)=1/1+e^{-t}$$。函数图像如下图所示: -
+
从$$sigmoid$$函数的图像可以看出当$$t$$趋近于$$-\infty$$时函数值趋近于$$0$$,当$$t$$趋近于$$+\infty$$时函数值趋近于$$1$$。可见$$sigmoid$$函数的值域是$$(0,1)$$,满足我们要将$$(-\infty,+\infty)$$的实数转换成$$(0,1)$$的概率值的需求。因此**逻辑回归**在预测时可以看成$$\hat p=1/(1+e^{-Wx+b})$$,如果$$\hat p>0.5$$时预测为一种类别,否则预测为另一种类别。 @@ -39,11 +39,11 @@ $$sigmoid$$ 函数的公式为:$$\sigma(t)=1/1+e^{-t}$$。函数图像如下 在预测样本属于哪个类别时取决于算出来的$$\hat p$$。从另外一个角度来说,假设现在有一个样本的真实类别为 $$1$$ ,模型预测样本为类别 $$1$$ 的概率为 $$0.9$$ 的话,就意味着这个模型认为当前样本的类别有 $$90\%$$ 的可能性为 $$1$$ ,有 $$10\%$$ 的可能性为 $$0$$ 。所以从这个角度来看,逻辑回归的损失函数与 $$\hat p$$ 有关。 -当然逻辑回归的损失函数不仅仅与 $$\hat p$$ 有关,它还与真实类别有关。假设现在有两种情况,**情况 A** :现在有个样本的真实类别是 $$0$$ ,但是模型预测出来该样本是类别 $$1$$ 的概率是 $$0.7$$(也就是说类别 $$0$$ 的概率为 $$0.3$$ );**情况 B** :现在有个样本的真实类别是 $$0$$ ,但是模型预测出来该样本是类别 $$1$$ 的概率是 $$0.6$$(也就是说类别 $$0$$ 的概率为 $$0.4$$ );请您思考 $$2$$ 秒钟,**AB** 两种情况哪种情况的误差更大?很显然,**情况 A** 的误差更大!因为**情况 A** 中模型认为样本是类别 $$0$$ 的可能性只有 $$30\%$$,而 **情况 B** 有 $$40\%$$。 +当然逻辑回归的损失函数不仅仅与 $$\hat p$$ 有关,它还与真实类别有关。假设现在有两种情况,**情况 A** :现在有个样本的真实类别是 $$0$$ ,但是模型预测出来该样本是类别 $$1$$ 的概率是 $$0.7$$(也就是说类别 $$0$$ 的概率为 $$0.3$$ );**情况 B** :现在有个样本的真实类别是 $$0$$ ,但是模型预测出来该样本是类别 $$1$$ 的概率是 $$0.6$$(也就是说类别 $$0$$ 的概率为 $$0.4$$ );请你思考 $$2$$ 秒钟,**AB** 两种情况哪种情况的误差更大?很显然,**情况 A** 的误差更大!因为**情况 A** 中模型认为样本是类别 $$0$$ 的可能性只有 $$30\%$$,而 **情况 B** 有 $$40\%$$。 -假设现在又有两种情况,**情况A:** 现在有个样本的真实类别是 $$0$$ ,但是模型预测出来该样本是类别 $$1$$ 的概率是 $$0.7$$(也就是说类别 $$0$$ 的概率为 $$0.3$$);**情况B:**现在有个样本的真实类别是 $$1$$,但是模型预测出来该样本是类别 $$1$$ 的概率是 $$0.3$$(也就是说类别 $$0$$ 的概率为 $$0.7$$ );请您再思考 $$2$$ 秒钟,**AB**两种情况哪种情况的误差更大?很显然,**一样大!** +假设现在又有两种情况,**情况A:** 现在有个样本的真实类别是 $$0$$ ,但是模型预测出来该样本是类别 $$1$$ 的概率是 $$0.7$$(也就是说类别 $$0$$ 的概率为 $$0.3$$);**情况B:**现在有个样本的真实类别是 $$1$$,但是模型预测出来该样本是类别 $$1$$ 的概率是 $$0.3$$(也就是说类别 $$0$$ 的概率为 $$0.7$$ );请你再思考 $$2$$ 秒钟,**AB**两种情况哪种情况的误差更大?很显然,**一样大!** -所以逻辑回归的损失函数如下,其中 $$cost$$ 表示损失函数的值,$y$ 表示样本的真实类别: +所以逻辑回归的损失函数如下,其中 $$cost$$ 表示损失函数的值,$$y$$ 表示样本的真实类别: $$ cost=-ylog(\hat p)-(1-y)log(1-\hat p) diff --git a/machine_learning.md b/machine_learning.md index 9fdc42e..8a6e792 100644 --- a/machine_learning.md +++ b/machine_learning.md @@ -1,6 +1,6 @@ # 机器学习概述 -近年来,全球新一代信息技术创新浪潮迭起。作为全球信息领域产业竞争的新一轮焦点,人工智能的发展也迎来了第三次浪潮,它正在推动工业发展进入新的阶段,掀起第四次工业革命的序幕。而作为人工智能的重要组成部分,机器习也成了炙手可热的概念。本章将向您介绍机器学习的基础知识,为后面的学习打好基础。 +近年来,全球新一代信息技术创新浪潮迭起。作为全球信息领域产业竞争的新一轮焦点,人工智能的发展也迎来了第三次浪潮,它正在推动工业发展进入新的阶段,掀起第四次工业革命的序幕。而作为人工智能的重要组成部分,机器学习也成了炙手可热的概念。本章将向您介绍机器学习的基础知识,为后面的学习打好基础。 本章主要涉及的知识点有: diff --git a/multi-class-learning.md b/multi-class-learning.md index 1a9bb71..e12ae3b 100644 --- a/multi-class-learning.md +++ b/multi-class-learning.md @@ -1,4 +1,4 @@ -# 二分类算法解决多分类问题 +# 多分类学习 现实中常遇到多分类学习任务。有些二分类算法可以直接推广到多分类,但在更多情形下,我们是基于一些策略,利用二分类算法来解决多分类问题。例如:OvO、OvR。 diff --git a/pingpong/Policy Gradient.md b/pingpong/Policy Gradient.md index 708ae5d..db715a8 100644 --- a/pingpong/Policy Gradient.md +++ b/pingpong/Policy Gradient.md @@ -26,7 +26,7 @@
-那么怎样评价这`10`把游戏打的好还是不好呢?也很明细,把`10`把游戏的所有反馈全部都加起来就好了。如果把这些反馈的和称为总反馈(总得分),那么就有**总反馈(总得分)=第1把反馈1+第1把反馈2+...+第10把反馈m**。也就是说总反馈越高越好。 +那么怎样评价这`10`把游戏打的好还是不好呢?也很明显,把`10`把游戏的所有反馈全部都加起来就好了。如果把这些反馈的和称为总反馈(总得分),那么就有**总反馈(总得分)=第1把反馈1+第1把反馈2+...+第10把反馈m**。也就是说总反馈越高越好。 说到这,有一个问题需要弄清楚:假设总共玩了`100`把,每`10`把计算一次总反馈,那么这`10`次的总反馈会不会是一模一样的呢?其实仔细想想会发现不会一摸一样,因为: diff --git a/pingpong/what is reinforce learning.md b/pingpong/what is reinforce learning.md index 18d4b6d..5a25e07 100644 --- a/pingpong/what is reinforce learning.md +++ b/pingpong/what is reinforce learning.md @@ -7,7 +7,7 @@ 让我们想象一下比赛现场: -计算机有一位虚拟的裁判,这个裁判他不会告诉你如何行动,如何做决定,他为你做的事只有给你的行为打分,最开始,计算机完全不知道该怎么做,行为完全是随机的,那计算机应该以什么形式学习这些现有的资源,或者说怎么样只从分数中学习到我应该怎样做决定呢?很简单,只需要记住那些高分,低分对应的行为,下次用同样的行为拿高分, 并避免低分的行为。 +计算机有一位虚拟的裁判,这个裁判他不会告诉你如何行动,如何做决定,他为你做的事只有给你的行为打分,最开始,计算机完全不知道该怎么做,行为完全是随机的,那计算机应该以什么形式学习这些现有的资源,或者说怎么样只从分数中学习到我应该怎样做决定呢?很简单,只需要记住那些高分,低分对应的行为,下次用同样的行为拿高分,并避免低分的行为。 计算机就是`Agent`,他试图通过采取行动来操纵环境,并且从一个状态转变到另一个状态,当他完成任务时给高分(奖励),但是当他没完成任务时,给低分(无奖励)。这也是强化学习的核心思想。 diff --git a/ppt/机器学习.ppt b/ppt/机器学习.ppt new file mode 100644 index 0000000..95e8df0 Binary files /dev/null and b/ppt/机器学习.ppt differ diff --git a/random_forest.md b/random_forest.md index 350e03a..b638546 100644 --- a/random_forest.md +++ b/random_forest.md @@ -1,4 +1,4 @@ -# 群众的力量是伟大的-随机森林 +# 随机森林 既然有决策树,那有没有用多棵决策树组成森林的算法呢?有!那就是**随机森林**。随机森林是一种叫**Bagging**的算法框架的变体。所以想要理解**随机森林**首先要理解**Bagging**。 @@ -6,11 +6,11 @@ ### 什么是Bagging -**Bagging** 是 Bootstrap Aggregating 的英文缩写,刚接触的您不要误认为 **Bagging** 是一种算法,**Bagging** 是集成学习中的学习框架, **Bagging** 是并行式集成学习方法。大名鼎鼎的随机森林算法就是在 $Bagging$ 的基础上修改的算法。 +**Bagging** 是 Bootstrap Aggregating 的英文缩写,刚接触的您不要误认为 **Bagging** 是一种算法,**Bagging** 是集成学习中的学习框架, **Bagging** 是并行式集成学习方法。大名鼎鼎的随机森林算法就是在**Bagging**的基础上修改的算法。 ** Bagging 方法的核心思想就是三个臭皮匠顶个诸葛亮**。如果使用 **Bagging** 解决分类问题,就是将多个分类器的结果整合起来进行投票,选取票数最高的结果作为最终结果。如果使用 **Bagging** 解决回归问题,就将多个回归器的结果加起来然后求平均,将平均值作为最终结果。 -那么 **Bagging** 方法如此有效呢,举个例子。狼人杀我相信您应该玩过,在天黑之前,村民们都要根据当天所发生的事和别人的发现来投票决定谁可能是狼人。 +那么 **Bagging** 方法为什么如此有效呢,举个例子。狼人杀我相信您应该玩过,在天黑之前,村民们都要根据当天所发生的事和别人的发现来投票决定谁可能是狼人。 如果我们将每个村民看成是一个分类器,那么每个村民的任务就是二分类,假设 $$h_i(x)$$ 表示第 $$i$$ 个村民认为 $$x$$ 是不是狼人( $$-1$$ 代表不是狼人, $$1$$ 代表是狼人),$$f(x)$$ 表示 $$x$$ 真正的身份(是不是狼人),$$\epsilon$$ 表示为村民判断错误的错误率。则有 $$P(h_i(x)\neq f(x))=\epsilon$$。 diff --git a/sklearn.md b/sklearn.md index cb3b495..b00b586 100644 --- a/sklearn.md +++ b/sklearn.md @@ -2,11 +2,11 @@ ## 写在前面 -这是一个 sklearn 的 hello world 级教程,想要更加系统更加全面的学习 sklearn 建议查阅 sklearn 的[官方网站](https://scikit-learn.org/stable/)。 +这是一个`sklearn`的`hello world`级教程,想要更加系统更加全面的学习`sklearn`建议查阅`sklearn`的[官方网站](https://scikit-learn.org/stable/)。 ## sklearn简介 -scikit-learn(简记sklearn),是用 python 实现的机器学习算法库。sklearn 可以实现数据预处理、分类、回归、降维、模型选择等常用的机器学习算法。基本上只需要知道一些 python 的基础语法知识就能学会怎样使用 sklearn 了,所以 sklearn 是一款非常好用的 python 机器学习库。 +`scikit-learn`(简记`sklearn`),是用`python`实现的机器学习算法库。`sklearn`可以实现数据预处理、分类、回归、降维、模型选择等常用的机器学习算法。基本上只需要知道一些`python`的基础语法知识就能学会怎样使用`sklearn`了,所以`sklearn`是一款非常好用的`python`机器学习库。 ## sklearn的安装 @@ -14,17 +14,17 @@ scikit-learn(简记sklearn),是用 python 实现的机器学习算法库。skl ## sklearn的目录结构 -sklearn 提供的接口都封装在不同的目录下的不同的 py 文件中,所以对 sklearn 的目录结构有一个大致的了解,有助于我们更加深刻地理解 sklearn 。目录结构如下: +`sklearn`提供的接口都封装在不同的目录下的不同的`py`文件中,所以对`sklearn`的目录结构有一个大致的了解,有助于我们更加深刻地理解`sklearn`。目录结构如下:
-其实从目录名字可以看出目录中的 py 文件是干啥的。比如 cluster 目录下都是聚类算法接口, ensem 目录下都是集成学习算法的接口。 +其实从目录名字可以看出目录中的`py`文件是干啥的。比如`cluster`目录下都是聚类算法接口, `ensemble`目录下都是集成学习算法的接口。 ## 使用sklearn识别手写数字 -接下来不如通过一个实例来感受一下 sklearn 的强大。 +接下来不如通过一个实例来感受一下`sklearn`的强大。 -想要识别手写数字,首先需要有数据。sklearn 中已经为我们准备好了一些比较经典且质量较高的数据集,其中就包括手写数字数据集。该数据集有 1797 个样本,每个样本包括 8*8 像素(实际上是一条样本有 64 个特征,每个像素看成是一个特征,每个特征都是 float 类型的数值)的图像和一个 [0, 9] 整数的标签。比如下图的标签是 2 : +想要识别手写数字,首先需要有数据。`sklearn`中已经为我们准备好了一些比较经典且质量较高的数据集,其中就包括手写数字数据集。该数据集有`1797`个样本,每个样本包括`8*8` 像素(实际上是一条样本有`64`个特征,每个像素看成是一个特征,每个特征都是`float`类型的数值)的图像和一个`[0, 9]`整数的标签。比如下图的标签是`2`:
@@ -42,7 +42,7 @@ X = digits.data y = digits.target ``` -得到 X,y 数据之后,我们还需要将这些数据进行划分,划分成两个部分,一部分是训练集,另一部分是测试集。因为如果没有测试集的话,我们并不知道我们的手写数字识别程序识别得准不准。数据集划分代码如下: +得到`X`,`y`数据之后,我们还需要将这些数据进行划分,划分成两个部分,一部分是训练集,另一部分是测试集。因为如果没有测试集的话,我们并不知道我们的手写数字识别程序识别得准不准。数据集划分代码如下: ```python # 将X,y划分成训练集和测试集,其中训练集的比例为80%,测试集的比例为20% @@ -68,7 +68,7 @@ clf.fit(X_train, Y_train) result = clf.predict(X_test) ``` -得到预测结果后,我们需要将其与测试集的真实答案进行比对,计算出预测的准确率。sklearn 已经为我们提供了计算准确率的接口,使用代码如下: +得到预测结果后,我们需要将其与测试集的真实答案进行比对,计算出预测的准确率。`sklearn`已经为我们提供了计算准确率的接口,使用代码如下: ```python # 导入计算准确率的接口 @@ -80,7 +80,7 @@ acc = accuracy_score(y_test, result) print(acc) ``` -此时您会发现我们短短的几行代码实现的手写数字识别程序的准确率高于 **0.95**。 +此时你会发现我们短短的几行代码实现的手写数字识别程序的准确率高于**0.95**。 而且我们不仅可以使用随机森林来实现手写数字识别,我们还可以使用别的机器学习算法实现,比如逻辑回归,代码如下: @@ -95,7 +95,7 @@ clf.fit(X_train, Y_train) result = clf.predict(X_test) ``` -细心的您可能已经发现,不管使用哪种分类算法来进行手写数字识别,不同的只是创建的算法对象不一样而已。有了算法对象后,就可以`fit`,`predict`大法了。 +细心的你可能已经发现,不管使用哪种分类算法来进行手写数字识别,不同的只是创建的算法对象不一样而已。有了算法对象后,就可以`fit`,`predict`大法了。 下面是使用随机森林识别手写数字的完整代码: @@ -133,18 +133,18 @@ print(acc) ## 更好地验证算法性能 -在划分训练集与测试集时会有这样的情况,可能模型对于数字 1 的识别准确率比较低 ,而测试集中没多少个数字为 1 的样本,然后用测试集测试完后得到的准确率为 0.96 。然后您可能觉得哎呀,我的模型很厉害了,但其实并不然,因为这样的测试集让您的模型的性能有了误解。那有没有更加公正的验证算法性能的方法呢?有,那就是**k-折验证**! +在划分训练集与测试集时会有这样的情况,可能模型对于数字`1`的识别准确率比较低 ,而测试集中没多少个数字为`1`的样本,然后用测试集测试完后得到的准确率为`0.96`。然后你可能觉得哎呀,我的模型很厉害了,但其实并不然,因为这样的测试集让你的模型的性能有了误解。那有没有更加公正的验证算法性能的方法呢?有,那就是**k-折验证**! -**k-折验证**的大体思路是将整个数据集分成 k 份,然后试图让每一份子集都能成为测试集,并循环 k 次,总后计算 k 次模型的性能的平均值作为性能的估计。一般来说 k 的值为 5 或者 10。 +**k-折验证**的大体思路是将整个数据集分成`k`份,然后试图让每一份子集都能成为测试集,并循环`k`次,总后计算`k`次模型的性能的平均值作为性能的估计。一般来说`k`的值为 `5`或者`10`。 **k-折验证**的流程如下: -1. 不重复抽样将整个数据集随机拆分成 k 份 -2. 每一次挑选其中 1 份作为测试集,剩下的 k-1 份作为训练集 - 2.1. 在每个训练集上训练后得到一个模型 - 2.2. 用这个模型在相应的测试集上测试,计算并保存模型的评估指标 -3. 重复第 2 步 k 次,这样每份都有一次机会作为测试集,其他机会作为训练集 -4. 计算 k 组测试结果的平均值作为算法性能的估计。 +`1`. 不重复抽样将整个数据集随机拆分成`k`份 +`2`. 每一次挑选其中`1`份作为测试集,剩下的`k-1`份作为训练集 +  `2.1`. 在每个训练集上训练后得到一个模型 +  `2.2`. 用这个模型在相应的测试集上测试,计算并保存模型的评估指标 +`3`. 重复第`2`步`k`次,这样每份都有一次机会作为测试集,其他机会作为训练集 +`4`. 计算`k`组测试结果的平均值作为算法性能的估计。 sklearn 为我们提供了将数据划分成 k 份类 KFold ,使用示例如下: diff --git a/some term.md b/some term.md index 24f5a06..4f335c0 100644 --- a/some term.md +++ b/some term.md @@ -5,7 +5,7 @@ 假设我们收集了一份西瓜数据: | 色泽 | 纹理 | 声音 | 甜不甜 | -| ------------ | ------------ | ------------ | ------------ | +| :-: | :-: | :-: | :-: | | 青绿 | 清晰 | 清脆 | 不甜 | | 青绿 | 模糊 | 浑浊 | 甜| | 乌黑 | 清晰 | 清脆 | 不甜 | diff --git a/svm.md b/svm.md index da2abd4..e9b840b 100644 --- a/svm.md +++ b/svm.md @@ -43,7 +43,7 @@ $$
-其中$$w=(w_1,w_2,..,w_d)$$为法向量,决定了决策边界的方向。`b`为位移项,决定了决策边界与原点之间的距离。显然,决策边界可被法向量和位移确定,我们将其表示为`(w,b)`。样本空间中的任意一个点`x`,到决策边界`(w,b)`的距离可写为: +其中$$w=(w_1,w_2,..,w_d)$$为法向量,决定了决策边界的方向。$$b$$为位移项,决定了决策边界与原点之间的距离。显然,决策边界可被法向量和位移确定,我们将其表示为$$(w,b)$$。样本空间中的任意一个点$$x$$,到决策边界$$(w,b)$$的距离可写为:
$$ @@ -52,11 +52,11 @@ $$

-假设决策边界`(w,b)`能够将训练样本正确分类,即对于任何一个样本点$$(x_i,y_i)$$,若它为正类,即$$y_i=+1$$时,$$w^Tx+b\geq +1$$。若它为负类,即$$y_i=-1$$时,$$w^Tx+b\leq -1$$。 +假设决策边界##(w,b)$$能够将训练样本正确分类,即对于任何一个样本点$$(x_i,y_i)$$,若它为正类,即$$y_i=+1$$时,$$w^Tx+b\geq +1$$。若它为负类,即$$y_i=-1$$时,$$w^Tx+b\leq -1$$。
-如图中,距离最近的几个点使两个不等式的等号成立,它们就被称为 **支持向量** ,即图中两条黄色的线。两个异类支持向量到超平面的距离之和为: +如图中,距离最近的几个点使两个不等式的等号成立,它们就被称为**支持向量**,即图中两条黄色的线。两个异类支持向量到超平面的距离之和为:
$$ @@ -65,7 +65,7 @@ $$

-它被称为 **间隔** ,即蓝线的长度。欲找到具有“最大间隔”的决策边界,即黑色的线,也就是要找到能够同时满足如下式子的`w`与`b`: +它被称为**间隔**,即蓝线的长度。欲找到具有“最大间隔”的决策边界,即黑色的线,也就是要找到能够同时满足如下式子的$$w$$与$$b$$:
@@ -84,7 +84,8 @@ $$
-这就是**线性可分支持向量机**的基本型。 +这就是线性可分支持向量机的基本型。 + ### 对偶问题 @@ -103,7 +104,7 @@ $$
-对两式子使用拉格朗日乘子法可得到其 **对偶问题** 。具体为,对式子的每条约束添加拉格朗日乘子$$\alpha\geq0$$,则该问题的拉格朗日函数可写为: +对两式子使用拉格朗日乘子法可得到其**对偶问题**。具体为,对式子的每条约束添加拉格朗日乘子$$\alpha\geq0$$,则该问题的拉格朗日函数可写为:
$$ @@ -127,7 +128,7 @@ $$

-将式子`2`带入式子`1`,则可将`w`和`b`消去,再考虑式子`3`的约束,就可得到原问题的 **对偶问题** : +将式子$$2$$带入式子$$1$$,则可将$$w$$和$$b$$消去,再考虑式子$$3$$的约束,就可得到原问题的**对偶问题** :
$$ @@ -157,7 +158,7 @@ $$

-从对偶问题解出的$$\alpha_i$$是拉格朗日乘子,它恰对应着训练样本$$(x_i,y_i)$$,由于原问题有不等式的约束,因此上述过程需满足`KKT(Karush-Kuhn-Tucker)`条件,即要求: +从对偶问题解出的$$\alpha_i$$是拉格朗日乘子,它恰对应着训练样本$$(x_i,y_i)$$,由于原问题有不等式的约束,因此上述过程需满足**KKT(Karush-Kuhn-Tucker)**条件,即要求:
$$ @@ -170,19 +171,20 @@ $$

-于是,对任意训练样本$$(x_i,y_i)$$,总有$$\alpha_i=0$$或$$y_if(x_i)=1$$。若$$\alpha_i=0$$,则该样本将不会出现在式子`4`中,也就不会对$$f(x)$$,有任何影响。若$$\alpha_i>0$$,则必有$$y_if(x_i)=1$$,所对应的样本点位于最大间隔边界上,是一个支持向量。这显示出支持向量机的一个重要性质:**训练完后,大部分的训练样本都不需要保留,最终模型仅与支持向量有关** 。 +于是,对任意训练样本$$(x_i,y_i)$$,总有$$\alpha_i=0$$或$$y_if(x_i)=1$$。若$$\alpha_i=0$$,则该样本将不会出现在式子`4`中,也就不会对$$f(x)$$,有任何影响。若$$\alpha_i>0$$,则必有$$y_if(x_i)=1$$,所对应的样本点位于最大间隔边界上,是一个支持向量。这显示出支持向量机的一个重要性质:**训练完后,大部分的训练样本都不需要保留,最终模型仅与支持向量有关**。 + -## 线性支持向量机 +##线性支持向量机 假如现在有一份数据分布如下图:
-按照线性可分支持向量机的思想,黄色的线就是最佳的决策边界。很明显,这条线的泛化性不是很好,造成这样结果的原因就是数据中存在着异常点,那么如何解决这个问题呢,支持向量机引入了 **软间隔最大化** 的方法来解决。 +按照线性可分支持向量机的思想,黄色的线就是最佳的决策边界。很明显,这条线的泛化性不是很好,造成这样结果的原因就是数据中存在着异常点,那么如何解决这个问题呢,支持向量机引入了**软间隔最大化**的方法来解决。 -所谓的 **软间隔** ,是相对于硬间隔说的,刚刚在 **间隔与支持向量** 中提到的间隔就是硬间隔。 +所谓的**软间隔**,是相对于硬间隔说的,刚刚在**间隔与支持向量**中提到的间隔就是硬间隔。 -接着我们再看如何可以软间隔最大化呢?`SVM`对训练集里面的每个样本$$(x_i,y_i)$$引入了一个松弛变量$$\xi_i\geq0$$,使函数间隔加上松弛变量大于等于`1`,也就是说: +接着我们再看如何可以软间隔最大化呢?SVM 对训练集里面的每个样本$$(x_i,y_i)$$引入了一个松弛变量$$\xi_i\geq0$$,使函数间隔加上松弛变量大于等于$$1$$,也就是说:
$$ @@ -191,11 +193,11 @@ $$

-对比硬间隔最大化,可以看到我们对样本到超平面的函数距离的要求放松了,之前是一定要大于等于`1`,现在只需要加上一个大于等于`0`的松弛变量能大于等于`1`就可以了。也就是允许支持向量机在一些样本上出错,如下图: +对比硬间隔最大化,可以看到我们对样本到超平面的函数距离的要求放松了,之前是一定要大于等于$$1$$,现在只需要加上一个大于等于$$0$$的松弛变量能大于等于$$1$$就可以了。也就是允许支持向量机在一些样本上出错,如下图:
-当然,松弛变量不能白加,这是有成本的,每一个松弛变量$$\xi_i$$, 对应了一个代价$$\xi_i$$,这个就得到了我们的 **软间隔最大化的支持向量机** ,模型如下: +当然,松弛变量不能白加,这是有成本的,每一个松弛变量$$\xi_i$$, 对应了一个代价$$\xi_i$$,这个就得到了我们的**软间隔最大化的支持向量机**,模型如下:
$$ @@ -216,9 +218,9 @@ $$

-这里,`C>0`为惩罚参数,可以理解为我们一般回归和分类问题正则化时候的参数。`C`越大,对误分类的惩罚越大,`C`越小,对误分类的惩罚越小。也就是说,我们希望权值的二范数尽量小,误分类的点尽可能的少。`C`是协调两者关系的正则化惩罚系数。在实际应用中,需要调参来选择。 +这里,$$C>0$$为惩罚参数,可以理解为我们一般回归和分类问题正则化时候的参数。$$C$$越大,对误分类的惩罚越大,$$C$$越小,对误分类的惩罚越小。也就是说,我们希望权值的二范数尽量小,误分类的点尽可能的少。$$C$$是协调两者关系的正则化惩罚系数。在实际应用中,需要调参来选择。 -同样的,使用 **拉格朗日函数** 将软间隔最大化的约束问题转化为无约束问题,利用相同的方法得到数学模型: +同样的,使用**拉格朗日函数**将软间隔最大化的约束问题转化为无约束问题,利用相同的方法得到数学模型:
$$ @@ -239,7 +241,7 @@ $$

-这就是软间隔最大化时的 **线性支持向量机** 的优化目标形式,和之前的硬间隔最大化的线性可分支持向量机相比,我们仅仅是多了一个约束条件: +这就是软间隔最大化时的**线性支持向量机**的优化目标形式,和之前的硬间隔最大化的线性可分支持向量机相比,我们仅仅是多了一个约束条件:
$$ @@ -248,12 +250,12 @@ $$

-## smo算法 +##smo算法 -**序列最小优化算法** (`smo`算法)是一种启发式算法, `SVM`中的模型参数可以使用该算法进行求解。其基本思路是:如果所有变量的解都满足此最优化问题的`KKT`条件,那么这个最优化问题的解就得到了。因为`KKT`条件是该最优化问题的充分必要条件。否则,选择两个变量,固定其他变量,针对这两个变量构建一个二次规划问题。这个二次规划问题关于这两个变量的解应该更接近原始二次规划问题的解,因为这会使得原始二次规划问题的目标函数值变得更小。重要的是,这时子问题可以通过解析方法求解,这样就可以大大提高整个算法的计算速度。子问题有两个变量,一个是违反`KKT`条件最严重的那一个,另一个由约束条件自动确定。如此,`smo`算法将原问题不断分解为子问题并对子问题求解,进而达到求解原问题的目的。具体如下: +**序列最小优化算法** ($$smo$$算法)是一种启发式算法, $$SVM$$中的模型参数可以使用该算法进行求解。其基本思路是:如果所有变量的解都满足此最优化问题的$$KKT$$条件,那么这个最优化问题的解就得到了。因为$$KKT$$条件是该最优化问题的充分必要条件。否则,选择两个变量,固定其他变量,针对这两个变量构建一个二次规划问题。这个二次规划问题关于这两个变量的解应该更接近原始二次规划问题的解,因为这会使得原始二次规划问题的目标函数值变得更小。重要的是,这时子问题可以通过解析方法求解,这样就可以大大提高整个算法的计算速度。子问题有两个变量,一个是违反$$KKT$$条件最严重的那一个,另一个由约束条件自动确定。如此,$$smo$$算法将原问题不断分解为子问题并对子问题求解,进而达到求解原问题的目的。具体如下: 选择两个变量$$\alpha_1,\alpha_2$$,其它变量$$\alpha_i,i=3,4,..m$$是固定的。 -于是,`smo`的最优化问题的子问题可以写成: +于是,$$smo$$的最优化问题的子问题可以写成:
$$ @@ -276,17 +278,17 @@ $$ 其中:$$k_{ij}=k(x_i,x_j)$$ -### smo算法目标函数的优化 +###smo算法目标函数的优化 为了求解上面含有这两个变量的目标优化问题,我们首先分析约束条件,所有的$$\alpha_1,\alpha_2$$都要满足约束条件,然后在约束条件下求最小。 -根据上面的约束条件$$\alpha_1y_1+\alpha_2y_2=\xi,0\leq\alpha_i\leq C,i=1,2$$,又由于$$y_1,y_2$$均只能取值`1`或者`-1`, 这样$$\alpha_1,\alpha_2$$在`[0,C]`和`[0,C]`形成的盒子里面,并且两者的关系直线的斜率只能为`1`或者`-1`,也就是说$$\alpha_1,\alpha_2$$的关系直线平行于`[0,C]`和`[0,C]`形成的盒子的对角线,如下图所示: +根据上面的约束条件$$\alpha_1y_1+\alpha_2y_2=\xi,0\leq\alpha_i\leq C,i=1,2$$,又由于$$y_1,y_2$$均只能取值$$1$$或者$$-1$$, 这样$$\alpha_1,\alpha_2$$在$$[0,C]$$和$$[0,C]$$形成的盒子里面,并且两者的关系直线的斜率只能为$$1$$或者$$-1$$,也就是说$$\alpha_1,\alpha_2$$的关系直线平行于$$[0,C]$$和$$[0,C]$$形成的盒子的对角线,如下图所示:
由于$$\alpha_1,\alpha_2$$的关系被限制在盒子里的一条线段上,所以两变量的优化问题实际上仅仅是一个变量的优化问题。不妨我们假设最终是$$\alpha_2$$的优化问题。由于我们采用的是启发式的迭代法,假设我们上一轮迭代得到的解是$$\alpha^{old}_1,\alpha^{old}_2$$,假设沿着约束方向$$\alpha_2$$未经剪辑的解是$$\alpha_2^{new,unc}$$。本轮迭代完成后的解为$$\alpha^{new}_1,\alpha^{new}_2$$。 -由于$$\alpha_2^{new}$$必须满足上图中的线段约束。假设`L`和`H`分别是上图中$$\alpha_2^{new}$$所在的线段的边界。那么很显然我们有: +由于$$\alpha_2^{new}$$必须满足上图中的线段约束。假设$$L$$和$$H$$分别是上图中$$\alpha_2^{new}$$所在的线段的边界。那么很显然我们有:
$$ @@ -295,7 +297,7 @@ $$

-而对于`L`和`H`,我们也有限制条件如果是上面左图中的情况,则: +而对于$$L$$和$$H$$,我们也有限制条件如果是上面左图中的情况,则:
@@ -360,19 +362,19 @@ $$

-### smo算法两个变量的选择 +###smo算法两个变量的选择 -`smo`算法需要选择合适的两个变量做迭代,其余的变量做常量来进行优化,那么怎么选择这两个变量呢? +$$smo$$算法需要选择合适的两个变量做迭代,其余的变量做常量来进行优化,那么怎么选择这两个变量呢? -一般来说,我们首先选择违反$$0 < \alpha_i < C$$这个条件的点。如果这些支持向量都满足`KKT`条件,再选择违反$$\alpha_i=0$$和$$\alpha_i=C$$的点。 +一般来说,我们首先选择违反$$0 < \alpha_i < C$$这个条件的点。如果这些支持向量都满足$$KKT$$条件,再选择违反$$\alpha_i=0$$和$$\alpha_i=C$$的点。 -`smo`算法称选择第二一个变量为内层循环,假设我们在外层循环已经找到了$$\alpha_1$$, 第二个变量$$\alpha_2$$的选择标准是让`|E1−E2|`有足够大的变化。由于$$\alpha_1$$定了的时候,`E1`也确定了,所以要想`|E1−E2|`最大,只需要在`E1`为正时,选择最小的`Ei`作为`E2`, 在`E1`为负时,选择最大的`Ei`作为`E2`,可以将所有的`Ei`保存下来加快迭代。 +$$smo$$算法称选择第二一个变量为内层循环,假设我们在外层循环已经找到了$$\alpha_1$$, 第二个变量$$\alpha_2$$的选择标准是让$$|E_1−E_2|$$有足够大的变化。由于$$\alpha_1$$定了的时候,$$E_1$$也确定了,所以要想$$|E_1−E_2|$$最大,只需要在$$E_1$$为正时,选择最小的$$E_i$$作为`E2`, 在$$E_1$$为负时,选择最大的$$E_i$$作为$$E_2$$,可以将所有的$$E_i$$保存下来加快迭代。 如果内存循环找到的点不能让目标函数有足够的下降, 可以采用遍历支持向量点来做$$\alpha_2$$,直到目标函数有足够的下降, 如果所有的支持向量做$$\alpha_2$$都不能让目标函数有足够的下降,可以跳出循环,重新选择$$\alpha_1$$。 -### 计算阈值b和差值Ei +###计算阈值b和差值Ei -在每次完成两个变量的优化之后,需要重新计算阈值`b`。当$$0<\alpha_1^{new}< C$$时,我们有: +在每次完成两个变量的优化之后,需要重新计算阈值$$b$$。当$$0<\alpha_1^{new}< C$$时,我们有:
$$ @@ -424,9 +426,9 @@ E_i=\sum_sy_j\alpha_jk(x_i,x_j)+b^{new}-y_i $$
-其中`s`为所有支持向量$$x_j$$的集合。 +其中$$s$$为所有支持向量$$x_j$$的集合。 -### 序列最小优化算法流程 +###序列最小优化算法流程 `1`.取初始值$$\alpha^0=0,k=0$$ `2`.计算$$\alpha_2^{new,unc}$$,即: diff --git a/titanic/EDA.md b/titanic/EDA.md index 5a3f51b..28feaaf 100644 --- a/titanic/EDA.md +++ b/titanic/EDA.md @@ -25,7 +25,7 @@ data.head() | 特征 | 意义 | -|---|---| +|:-:|:-:| | Survived | 是否生还,1表示是,0表示否 | | PassengerId| 乘客ID| | Pclass| 船票类型, 总共3种类型:1(一等舱),2(二等舱),3(三等舱)| @@ -80,7 +80,7 @@ data.groupby(['Sex','Survived'])['Survived'].count()
-看上去好想女性船客的生还率高一些,我们不妨再可视化一下。 +看上去好像女性船客的生还率高一些,我们不妨再可视化一下。 ```python f,ax=plt.subplots(1,2,figsize=(18,8)) @@ -355,7 +355,7 @@ plt.show() 看了这么多特征对于生还的影响,可能有点懵,不妨先简单总结一下根据可视化结果所获得的信息。 -- 性别:女性的生还率高 +- 性别:女性的生还率高。 - 船舱等级:越有钱越容易活下来,头等舱的生还率最高,三等舱的生还率最低。 - 年龄:`10`岁以下的小朋友的存活率比较高,`15-35`岁的年轻人存活率低。可能年轻人就是炮灰吧。 - 口岸:即使大多数一等舱的船客在`S`号口岸上的船, 但生还率不是最高的。`Q`号口岸的基本上是三等舱的船客。 diff --git a/titanic/feature engerning.md b/titanic/feature engerning.md index a786852..554cafa 100644 --- a/titanic/feature engerning.md +++ b/titanic/feature engerning.md @@ -33,7 +33,7 @@ plt.show() ## 家庭成员数量与是否孤身一人 -由于家庭成员数量和是否孤身一人好想对于是否生还有影响,所以我们不妨添加新的特征。 +由于家庭成员数量和是否孤身一人好像对于是否生还有影响,所以我们不妨添加新的特征。 ```python data['Family_Size']=0 diff --git a/titanic/tuning.md b/titanic/tuning.md index 8709368..c6c0eb6 100644 --- a/titanic/tuning.md +++ b/titanic/tuning.md @@ -1,6 +1,6 @@ # 调参 -很多机器学习算法有很多可以调整的参数(即超参数),例如我们用的随机森林需要我们指定森林中有多少棵决策树,没棵决策树的最大深度等。这些超参数都或多或少的会影响这模型的性能。那么怎样才能找到合适的超参数,来让我们的模型性能达到比较好的效果呢?可以使用网格搜索! +很多机器学习算法有很多可以调整的参数(即超参数),例如我们用的随机森林需要我们指定森林中有多少棵决策树,每棵决策树的最大深度等。这些超参数都或多或少的会影响这模型的性能。那么怎样才能找到合适的超参数,来让我们的模型性能达到比较好的效果呢?可以使用网格搜索! 网格搜索的意思其实就是遍历所有我们想要尝试的参数组合,看看哪个参数组合的性能最高,那么这组参数组合就是模型的最佳参数。 diff --git a/what's machine_learning.md b/what's machine_learning.md index f986317..643cbcf 100644 --- a/what's machine_learning.md +++ b/what's machine_learning.md @@ -1,6 +1,6 @@ # 什么是机器学习 -机器学习的定义有很多种,但是最准确的定义是:`"A computer program is said to learn from experience E with respect to some class of tasks T and performance measure P, if its performance at tasks in T, as measured by P, improves with experience E."` +机器学习的定义有很多种,但是最准确的定义是:"A computer program is said to learn from experience E with respect to some class of tasks T and performance measure P, if its performance at tasks in T, as measured by P, improves with experience E." 这个定义除了非常押韵之外,还体现了机器学习的几个关键点,即:`task`, `experience` 和 `performance`。 @@ -30,7 +30,7 @@
-细心的您可能注意到了,**分类和回归问题的训练集中都是带有标签的**。也就是说数据已经告诉了机器学习算法我这条数据的答案是这个,那条数据的答案是那个,就像有老师在监督学生做题目一样,一看到学生做错了就告诉他题目做错了,看到学生做对了就鼓励他。所以用来解决**分类和回归**问题的机器学习算法又称为**监督学习**。而像用来解决**聚类**问题的机器学习算法又称为**无监督学习**。 +细心的你可能注意到了,**分类和回归问题的训练集中都是带有标签的**。也就是说数据已经告诉了机器学习算法我这条数据的答案是这个,那条数据的答案是那个,就像有老师在监督学生做题目一样,一看到学生做错了就告诉他题目做错了,看到学生做对了就鼓励他。所以用来解决**分类和回归**问题的机器学习算法又称为**监督学习**。而像用来解决**聚类**问题的机器学习算法又称为**无监督学习**。 ## experience diff --git a/work flow.md b/work flow.md index 46ec235..3358205 100644 --- a/work flow.md +++ b/work flow.md @@ -2,28 +2,28 @@ 当我们拿到一个项目需求想要使用机器学习来实现时,我们往往会按照**理解问题与问题转换、获取数据、数据清洗与预处理、特征工程、模型训练与调优**这`5`个步骤来走。 -## 1.理解实际问题,抽象为机器学习能处理的数学问题 +### 1.理解实际问题,抽象为机器学习能处理的数学问题 理解实际业务场景问题是机器学习的第一步。机器学习的特征工程和模型训练通常都是一件非常耗时的过程,胡乱尝试时间成本是非常高的。深入理解要处理的问题,能避免走很多弯路。 理解问题,包括明确可以获得什么样的数据,机器学习的目标是一个分类、回归还是聚类。如果都不是的话,要考虑将它们转变为机器学习问题。 -## 2.获取数据 +### 2.获取数据 获取数据包括获取原始数据以及从原始数据中经过特征工程从中提取训练、测试数据。机器学习比赛中原始数据都是直接提供的,但是实际问题需要自己获得原始数据。 有句名言是:**“数据决定机器学习结果的上限,而算法只是尽可能的逼近这个上限”**,可见数据在机器学习中的作用。总的来说数据要有具有 **“代表性”** ,否则必然会过拟合。对于分类问题,数据偏斜不能过于严重,不同类别的数据数量不要有数个数量级的差距。 -## 3.数据清洗与预处理 +### 3.数据清洗与预处理 **数据预处理、数据清洗是很关键的步骤**,往往能够使得算法的效果和性能得到显著提高。归一化、离散化、因子化、缺失值处理、去除共线性等,数据挖掘过程中很多时间就花在它们上面。这些工作简单可复制,收益稳定可预期,是机器学习的基础必备步骤。 -## 4.特征工程 +### 4.特征工程 特征工程包括从原始数据中**特征构建、特征提取、特征选择**,非常有讲究。深入理解实际业务场景下的问题,丰富的机器学习经验能帮助我们更好的处理特征工程。**特征工程做的好能发挥原始数据的最大效力,往往能够使得算法的效果和性能得到显著的提升,有时能使简单的模型的效果比复杂的模型效果好。** **筛选出显著特征、摒弃非显著特征,需要机器学习工程师反复理解业务**。这对很多结果有决定性的影响。特征选择需要运用特征有效性分析的相关技术,如**相关系数、卡方检验、平均互信息、条件熵、后验概率、逻辑回归权重**等方法。 -## 5.模型训练、诊断与调优 +### 5.模型训练、诊断与调优 现在有很多的机器学习算法的工具包,例如`sklearn`,使用非常方便,**真正考验水平的根据对算法的理解调节(超)参数,使模型达到最优**。