Skip to content

Commit 5c2021a

Browse files
Merge branch 'python-2.7' of https://github.com/apachecn/MachineLearning into python-2.7
2 parents 9c78fb5 + c2ef26c commit 5c2021a

File tree

10 files changed

+74
-8
lines changed

10 files changed

+74
-8
lines changed

docs/2.k-近邻算法.md

+57-1
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,13 @@
55

66
## KNN 概述
77

8-
`k-近邻(kNN, k-NearestNeighbor)算法主要是用来进行分类的.`
8+
`k-近邻(kNN, k-NearestNeighbor)算法是一种基本分类与回归方法,我们这里只讨论分类问题中的 k-近邻算法。`
9+
10+
**一句话总结:近朱者赤近墨者黑!**
11+
12+
`k 近邻算法的输入为实例的特征向量,对应于特征空间的点;输出为实例的类别,可以取多类。k 近邻算法假设给定一个训练数据集,其中的实例类别已定。分类时,对新的实例,根据其 k 个最近邻的训练实例的类别,通过多数表决等方式进行预测。因此,k近邻算法不具有显式的学习过程。`
13+
14+
`k 近邻算法实际上利用训练数据集对特征向量空间进行划分,并作为其分类的“模型”。 k值的选择、距离度量以及分类决策规则是k近邻算法的三个基本要素。`
915

1016
## KNN 场景
1117

@@ -34,6 +40,10 @@ knn 算法按照距离最近的三部电影的类型,决定未知电影的类
3440
3. 取前 k (k 一般小于等于 20 )个样本数据对应的分类标签。
3541
3. 求 k 个数据中出现次数最多的分类标签作为新数据的分类。
3642

43+
> KNN 通俗理解
44+
45+
给定一个训练数据集,对新的输入实例,在训练数据集中找到与该实例最邻近的 k 个实例,这 k 个实例的多数属于某个类,就把该输入实例分为这个类。
46+
3747
> KNN 开发流程
3848
3949
```
@@ -166,6 +176,32 @@ $$\sqrt{(0-67)^2 + (20000-32000)^2 + (1.1-0.1)^2 }$$
166176

167177
归一化特征值,消除特征之间量级不同导致的影响
168178

179+
**归一化定义:** 我是这样认为的,归一化就是要把你需要处理的数据经过处理后(通过某种算法)限制在你需要的一定范围内。首先归一化是为了后面数据处理的方便,其次是保正程序运行时收敛加快。 方法有如下:
180+
* 线性函数转换,表达式如下:  
181+
182+
y=(x-MinValue)/(MaxValue-MinValue)  
183+
184+
说明:x、y分别为转换前、后的值,MaxValue、MinValue分别为样本的最大值和最小值。  
185+
186+
* 对数函数转换,表达式如下:  
187+
188+
y=log10(x)  
189+
190+
说明:以10为底的对数函数转换。
191+
192+
如图:![对数函数图像](../images/2.KNN/knn_1.png)
193+
194+
* 反余切函数转换,表达式如下:
195+
196+
y=atan(x)*2/PI 
197+
198+
如图:![反余切函数图像](../images/2.KNN/knn_2.jpg)
199+
200+
* 式(1)将输入值换算为[-1,1]区间的值,在输出层用式(2)换算回初始值,其中和分别表示训练样本集中负荷的最大值和最小值。  
201+
202+
在统计学中,归一化的具体作用是归纳统一样本的统计分布性。归一化在0-1之间是统计的概率分布,归一化在-1--+1之间是统计的坐标分布。
203+
204+
169205
```python
170206
def autoNorm(dataSet):
171207
"""
@@ -359,6 +395,26 @@ def handwritingClassTest():
359395
360396
[完整代码地址](https://github.com/apachecn/MachineLearning/blob/master/src/python/2.KNN/kNN.py): <https://github.com/apachecn/MachineLearning/blob/master/src/python/2.KNN/kNN.py>
361397

398+
## KNN 小结
399+
400+
经过上面的介绍我们可以知道, k 近邻算法有 三个基本的要素:
401+
402+
* k 值的选择
403+
404+
* k 值的选择会对 k 近邻算法的结果产生重大的影响。
405+
* 如果选择较小的 k 值,就相当于用较小的邻域中的训练实例进行预测,“学习”的近似误差(approximation error)会减小,只有与输入实例较近的(相似的)训练实例才会对预测结果起作用。但缺点是“学习”的估计误差(estimation error)会增大,预测结果会对近邻的实例点非常敏感。如果邻近的实例点恰巧是噪声,预测就会出错。换句话说,k 值的减小就意味着整体模型变得复杂,容易发生过拟合。
406+
* 如果选择较大的 k 值,就相当于用较大的邻域中的训练实例进行预测。其优点是可以减少学习的估计误差。但缺点是学习的近似误差会增大。这时与输入实例较远的(不相似的)训练实例也会对预测起作用,使预测发生错误。 k 值的增大就意味着整体的模型变得简单。
407+
* 近似误差和估计误差,请看这里:https://www.zhihu.com/question/60793482
408+
409+
* 距离度量
410+
411+
* 特征空间中两个实例点的距离是两个实例点相似程度的反映。
412+
* k 近邻模型的特征空间一般是 n 维实数向量空间 ![向量空间](../images/2.KNN/knn_3.png) 。使用的距离是欧氏距离,但也可以是其他距离,如更一般的 ![Lp距离](../images/2.KNN/knn_4.png) 距离,或者 Minkowski 距离。
413+
414+
* 分类决策规则
415+
416+
* k 近邻算法中的分类决策规则往往是多数表决,即由输入实例的 k 个邻近的训练实例中的多数类决定输入实例的类。
417+
362418
* * *
363419

364420
* **作者:[羊三](http://www.apache.wiki/display/~xuxin) [小瑶](http://www.apache.wiki/display/~chenyao)**

docs/3.决策树.md

+11-1
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,11 @@
66

77
## 决策树 概述
88

9-
`决策树(Decision Tree)算法主要用来处理分类问题,是最经常使用的数据挖掘算法之一。`
9+
`决策树(Decision Tree)算法是一种基本的分类与回归方法,是最经常使用的数据挖掘算法之一。我们这章节只讨论用于分类的决策树。`
10+
11+
`决策树模型呈树形结构,在分类问题中,表示基于特征对实例进行分类的过程。它可以认为是 if-then 规则的集合,也可以认为是定义在特征空间与类空间上的条件概率分布。`
12+
13+
`决策树学习通常包括 3 个步骤:特征选择、决策树的生成和决策树的修剪。`
1014

1115
## 决策树 场景
1216

@@ -22,6 +26,12 @@
2226
如果不包含则将邮件归类到 "无需阅读的垃圾邮件" 。
2327
```
2428

29+
决策树的定义:
30+
31+
分类决策树模型是一种描述对实例进行分类的树形结构。决策树由结点(node)和有向边(directed edge)组成。结点有两种类型:内部结点(internal node)和叶结点(leaf node)。内部结点表示一个特征或属性,叶结点表示一个类。
32+
33+
用决策树分类,从根节点开始,对实例的某一特征进行测试,根据测试结果,将实例分配到其子结点;这时,每一个子结点对应着该特征的一个取值。如此递归地对实例进行测试并分配,直至达到叶结点。最后将实例分配到叶结点的类中。
34+
2535
## 决策树 原理
2636

2737
### 决策树 须知概念

images/2.KNN/knn_1.png

35 KB
Loading

images/2.KNN/knn_2.jpg

5.19 KB
Loading

images/2.KNN/knn_3.png

676 Bytes
Loading

images/2.KNN/knn_4.png

607 Bytes
Loading

src/python/2.KNN/kNN.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
#!/usr/bin/env python
2-
# encoding: utf-8
2+
# coding: utf-8
33
'''
44
Created on Sep 16, 2010
55
Update on 2017-05-18

src/python/3.DecisionTree/DecisionTree.py

+4-4
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
#!/usr/bin/python
2-
# coding:utf8
2+
# coding:utf-8
33
'''
44
Created on Oct 12, 2010
55
Update on 2017-05-18
@@ -70,7 +70,7 @@ def calcShannonEnt(dataSet):
7070
for key in labelCounts:
7171
# 使用所有类标签的发生频率计算类别出现的概率。
7272
prob = float(labelCounts[key])/numEntries
73-
# log base 2
73+
# log base 2
7474
# 计算香农熵,以 2 为底求对数
7575
shannonEnt -= prob * log(prob, 2)
7676
# print '---', prob, prob * log(prob, 2), shannonEnt
@@ -356,5 +356,5 @@ def ContactLensesTest():
356356

357357

358358
if __name__ == "__main__":
359-
# fishTest()
360-
ContactLensesTest()
359+
fishTest()
360+
# ContactLensesTest()
-8 Bytes
Binary file not shown.

src/python/3.DecisionTree/sklearn_dts_classify_demo.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
#!/usr/bin/python
2-
# coding:utf8
2+
# coding:utf-8
33

44
"""
55
Created on 2017-06-29

0 commit comments

Comments
 (0)