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 @@ $$