【机器学习】
machine learning notes
tags: notes
machine learning
github的上传,见链接CSDN|github上传与知乎|github仓库更新,git提交代码流程
本学习笔记源代码见github链接github|源代码项目仓库
1.kNN分类算法
kNN算法,是在已知各训练数据元类型下,基于欧式距离计算,计算待预测点与什么类距离最近。
1.1 numpy补充
对shape
有例子
核心:0为行轴,shape[0]为有多少行
一维:
1 |
|
二维:
1 |
|
三维:
1 |
|
其中,x.shape[0]代表包含二维数组的个数,x.shape[1]表示二维数组的行数,x.shape[2]表示二维数组的列数
对于乘法
有学习链接numpy乘法学习
所谓数组星乘,就是数组的对应元素相乘,这也是初学NumPy的同学最早接触到的数组乘法。即使两个数组的shape不一样,只要满足特定条件,同样可以用星号相乘,且满足交换律。
对于一维数组,NumPy的点乘就是向量点乘,其结果是一个标量。对于多维数组,则需要满足一定条件才能实现点乘,且其结果不再是标量,而是一个多维数组。比如,NumPy的矩阵相乘,就是二维数组的点乘,参与点乘的第一个数组的列数必须等于第二个数组的行数。
在数学上,二维平面的向量叉乘,其结果是以两个向量为边的菱形的面积,三维空间的向量叉乘,其结果是仍然是一个向量,且垂直于相乘的两个向量,也就是参与相乘的两个向量决定的平面的法向量。nunpy.cross()函数可以实现向量(一维数组)叉乘,也可以实现二维或三维数组的叉乘。
1 |
|
这里的外乘,类似于星乘,并不是通用的概念,也是我自己编造的一个说法,来源于numpy.outer()函数。从字面看,outer()函数更像是求外积,但从实际效果看,更像是笛卡尔直积,因此我这里用了“外乘”而不是“外积”。那么,outer()函数究竟能作什么呢?
数组A外乘数组B,返回一个二维数组,这个二维数组的第i行是数组A的第i个元素星乘数组B。
**
为乘方,如a**2=a^2
对排序argsort,其返回的是各个排序的index,如b[0]上是最小元素的index,有示例
1 |
|
对列表排序函数sorted, sorted(iterable[, cmp[, key[, reverse]]])
cmp是比较的函数,这个具有两个参数,参数的值都是从可迭代对象中取出,此函数必须遵守的规则为,大于则返回1,小于则返回-1,等于则返回0
有示例:
1 |
|
对于operator中的itemgetter
函数,是返回一个函数;sorted使用的时候,相当于对于每个“行”都用itemgetter
获取了他的关键元(可以是一个,也可以是多个组成的元组)
1 |
|
1.2 matplotlib补充
matplotlib绘图基础教程见知乎|Matplotlib绘图
matplotlib的绘图函数库pyplot有示例如下
1 |
|
散点图绘制scatter函数,相关链接CSDN|scatter matplotlib.pyplot.scatter(x, y, s=None, c=None, marker=None, cmap=None, norm=None, vmin=None, vmax=None, alpha=None, linewidths=None, verts=None, edgecolors=None, *, data=None, **kwargs)
基本用法:
1 |
|
1.3 tile
tile(inX,(m,n))
对inX,横向重复n次,竖向重复m次
2.决策树算法
本次采用ID3算法来划分数据集,具体算法可见链接wiki|ID3_algorithm。
注意:决策树算法是已知各数据元是什么类型,只是给出类型划分的依据。对于每个数据元,可以有很多特征(一个数据元是一行,是一条记录),但每次划分数据集的时候,只会使用一个参考特征。
2.1 信息增益
划分数据的依据就是信息增益,即将无序的数据变有序——使用信息论度量信息。
定义1:符号$x_i$的信息$l(x_i)=-log_2p(x_i)$,其中$p(x_i)$为选择该分类的概率
定义2:熵为所有类别选择的信息期望值,$H=-\sum_{i=1}^n{p\left( x_i \right) \log _2p\left( x_i \right)}$
对于数据集,其$p(x_i)$为probOfKey = float(numOfTheKey)/(len(dataSet))
对于每种划分方式,其信息熵为以每个值为划分值划出的数目来算概率,再乘上该划分值划出的dataSet的信息熵,即:
1 |
|
补充,字典.keys()
可以遍历字典的所有key值,if currentLabel not in labelCounts.keys():
当熵越大,说明混合的数据越多。
划分数据集
对每个特征划分数据集的结果计算一次信息熵,比较得按照哪个特征划分数据集是最好的划分方式。
注意! 在选择用哪个特征时,每个特征对应的信息增益等于原始熵-该特征对应信息熵。而对于该特征对应的信息熵,每个概率就是在每个值下筛出去的概率,每个值对应的信息就是在该值下筛出来的数据集的信息熵。
对于数组的扩充,要将一个列表的各个元素扩充进来,则用extend
,而对于append
,是列表扩充为被扩充列表的一个元素。如:
1 |
|
补充:set
,集合函数,是python的内置函数,接收一个list为参数,创建一个无序不重复元素集,可进行关系测试,删除重复数据,还可以计算交集、差集、并集等。
1 |
|
2.2 递归构建决策树
递归结束(即构建出叶子结点)的条件是在该结点下的分支所有实例都有相同的分类;若数据集已经处理了所有属性,但还是有分支类别标签不唯一,则使用多数表决的方法来确定该叶子结点的分类。
1 |
|
递归思路
如果不是出口,creatTree返回的是一个树(即一个value是字典的字典),这个树挂载在上一级结点上,即挂在myTree[feat][value];因此,要访问叶子结点,就是myTree[feat1][feat1Value1][feat2][feat2Value2][feat3][feat3Value3]...[featNValueN]
如果是出口,creatTree返回的是一个列表,也就是使得上一节点依value下来的分支为一个列表,程序结束,回溯。
2.3 绘制树形图
matplotlib中的ax1
是来自于子图,是通过在画布fig
中添加子图ax1=fig.add_subplot
,进而在子图上绘制曲线。