相关课程推荐:
Python数据分析与机器学习实战
课程观看地址:http://www.xuetuwuyou.com/course/167
-
1KNN
knn的主要思想是计算与特征最近的已知数据,选取照频率最大的特征。
注意计算距离的时候用的dataset的格式,否则可能报错
在计算距离时为避免部分特征权重过大,故将每个特征都归一化
在手写数字的辨别系统中,将32*32的图像转化为了有1024特征的数组,在读取训练样本中使用了from os import listdir来读取众多的文件名然后批量处理计算得到最近的类型
主要用的函数有tile sum(axis=1) argsort get(label,0)+1 sorted listdir 另外在读取文本的时候用的是readlines 在把图像转化为向量时在循环内部用的是readline 可以体会下不同点噢2决策树decision trees(ID3)
首先要了解概念,书里都有了就不敲了
-
什么是熵 shannon entropy
http://baike.baidu.com/link?url=j54qkVk75624IgzEO0wh4eKrg6D-VV2OtY7zJVvcQHwbEPPEUqr6-8fatj-CCpajPkL8NidbSSA7LqZDx6QWO_ -
延伸阅读
http://dataunion.org/5107.html
《通信的数学理论》
http://zhidao.baidu.com/share/748d0309785ff11ce4085128050d5643.html
决策树分为两部分,第一部分是创立决策树字典,第二部分是绘制决策树,可以看成是递归的练习,好多递归调用/(ㄒoㄒ)/~~
2.1创立决策树字典
2.1.1 选取最佳特征
首先要理解上面关于香农熵的概念,之后据此选取最佳特征作为决策节点,大体思路是利用了循环嵌套,对于每个特征比较各个特征值作用下的熵,看那个增益最大,找特征值时用了set相当于MATLAB里面的unique
2.1.2创建字典
递归开始爆发了!
神奇之处就是创建了个keys值为字典的字典的字典的字典……
看下式
myTree = {bestFeatLabel:{}}
即:
先将特征为字典的keys
然后将特征的特征值作为新字典的特征,如果有不同的特征值就可能有多个新字典- 1
递归啥时候结束呢,1全部分类相同时就不需要在分类了,2全部遍历完了所有的特征都考虑了,注意这个时候可能相同的特征不同的结果如四个特征值都为1111但是其分类却是nononoyes 此时一般选取多的返回
主要用的函数有:extend append count 列表推导 sorted2.2绘制注解决策树
2.2.1 整体思路
将字典利用Python的annotate功能绘制成树状图。
2.2.2 具体实施
因为绘制每一个树枝用的方法相近,所以可以使用递归调用,绘制每个决策节点和叶子节点。
- 利用annatate时需要的带求参数有坐标及注解内容
坐标的选取很有技巧性,看下图:
对于纵坐标比较好选,按照深度d,每次下沉1/d。对于横坐标的选取利用以下公式:
其中w是指宽度fx:=fx+1+n2w
公式是咋来的呢,这里提示一下,看图中bbb的横坐标是如何定位的呢,首先所有的叶子节点均匀分布的,
显然它应该处于它下属的三个叶子节点的中间,
而最左端的no节点如果能点位那么bbb也就可以定位了,
no距离最左边占了12 个1w ,
再来看ccc是如何定位的呢,
同样,其下属的no节点如与左边的no节点相差了一个1w ,
也就是说除了第一个决策节点外,其他的决策节点都是根据最近的已经确定的叶子节点的横坐标的设置的,为了能递归将初始横坐标设置为−12w 即可
关于注释的内容:
先来看下我们的决策树字典{'no surfacing': {0: 'no', 1: {'flippers': {0: 'no', 1: 'yes'}}}}
若先画出第一个决策节点,那么我们发现每个中间特征值(0或者1)和特征都是这个字典的key而叶子节点为key的value(非dict)。
- 下面就要关注递归的结束条件
在递归计算坐标和annotate内容时都是看key的value是否是一个字典(注意此时所用的key),若是字典就画出决策节点和中间特征值
决策节点是字典的第一个key,而中间的特征值就是这个字典的key(它的上一层),所以最外层的特征值是没有上层的key的用‘’代替。此处巧妙的地方需要自己慢慢体会哇
另外,叶子节点数量和书的深度也是用递归调用来完成的,具体原理与上面类似就不解释了
主要用的函数annotate text isinstance figure clf show subpolt2.3测试和储存
测试时主要用到了index函数用来选取label对应的特征值,获得树上的下级value,判断是否是字典,然后递归调用,直到不是字典返回value作为分类
储存和调用主要使用了pickle.dump pickle.load
如果上面理解了实例运用也就简单了3朴素贝叶斯 Naive Bayes
首先这个算法的名字就很好简称NB哈哈
首先要了解条件概率
我们要做的就是通过这个算法在知道x的条件下计算P(类别|x) ,因为这里得到的是概率,所以要计算出所有的类别,然后比较各类出现 概率,概率最大的我们就认为是合理的分类
为了方便表述,假设我们要求在x出现的时候类别为垃圾邮件的概率P(垃圾|x)=P(垃圾和x)P(x)=P(x|垃圾)P(垃圾)P(x)
如果有很多x,比如后面要说的垃圾邮件中有很多的字,这个算法中我们假设每个字都是相互独立的,彼此不认识,所以这个算法叫朴素贝叶斯。
如上文所说,我们计算P(垃圾|x) 主要是为了和标签: 机器学习 深度学习 Python - 还没有人评论,欢迎说说您的想法!
-