KNN
算法思想:
k近邻算法用于分类,首先收集大量数据作为模型(不用训练,包括特征变量和所属分类两部分),待测试数据(需要分类的数据)输入后计算输入数据和已有模型中各个数据的(特征变量)距离,距离的计算可以根据实际情况采用不同的计算方法,一般采用欧式距离。选取距离中最近的k个模型,在选取的k个模型中模型所属分类最多的一个类别就认为是当前输入数据的类别。
程序实现过程(主要的遇到的问题):
1.读入模型数剧:每组数据特征值为一列,得到总的特征属性(记做dataset);每组数据对应的标签单独存为一个一列的矩阵。
2.利用python的shape函数得到整个模型的个数(行数,也就是一共有多少个数据)。a.shape()得到矩阵各个维度的长度,shape[0]表示得到矩阵的第一维度的大小,shape[1]得到矩阵第二维度的大小。在此用shape[0]即得到数据的个数。
3.计算距离。待测试的数据要和模型中的每一个数据计算距离,然后再选出距离最小的k个。一种方法是遍历模型中的所有数据,一一与输入数据进行计算距离。但这样太麻烦,利用python处理矩阵的优势,先构造一个和模型dataset同样大小的矩阵,因为输入数据和模型数据在列上是一样的,都有同样的特征,所以只需要将输入数据重复n行,n的值为模型数据的个数(即模型矩阵的行数),这样得到一个拥有和模型中数据个数一样的待测试矩阵。矩阵相减,然后平方,再求和,最后开根号就得到输入数据和所有模型数据的欧式距离。 重复用到的是python的tile函数,可自行百度。
4.选择k个距离最近的值。python的argsort函数可以对数据排序,argsort函数回返回数据从小到大的索引值。
5.找出k个最近的距离所对应的模型数据类别。因为模型数据和其对应的类别在行上是一一对应的,根据前k个argsort返回的索引值即可知道该数据的类别是标签中同样索引值对应的类别。
6.统计k个类别中每种分类的个数,最多的一种即可认为是输入数据的类型。首先建立空字典,遍历k个类别,利用python的字典get函数判断该类别是否存在,不存在即保存该key值,value值默认设为1,若存在则得到该key值当前的value,并将value+1保存为新的value。
7.得到分类。用sorted函数将上述字典中安value进行降序排序,排序后取第一个的key值,即所属分类。
至此整个过程基本结束。
注意:计算距离时由于不同特征的量纲不同,直接计算会出现较大的误差,因此在计算前需要先将数据归一化,下面的公式可以将数据转换到0~1之间的数值:
newValue = (oldValue-minValue)/(maxValue-minValue)
其中minValue和maxValue是某一特征的取值最大值和最小值。
(算法的具体实现可参考机器学习实战相关章节)