算法思想:
训练数据(特征+标签),新数据(特征)。输入新数据后,将新数据的每个特征与训练集(特征)中每条数据对应的特征进行比较,选择最相近的前k条数据,统计这k条数据所对应的标签种类及个数,选择出现次数最多的标签,作为新数据的分类标签。
算法伪代码:
- 输入:新数据向量,训练集,训练集对应的标签向量,k
- 获取训练集的大小n,即行数
- 新数据向量重复n行,1列。(方便计算距离)
- 计算距离(可采用欧式距离)
重复n行1列后的新数据 - 训练集数据(以矩阵形式相减,对应位置上数据相减)
求相减后矩阵每个位置上数据的平方
对矩阵中每一行求和
对求和后的矩阵(n行1列)每一行中的和开方,即得新数据和训练集中每一行数据的欧式距离
- 根据距离升序排序,并得到升序排序后对应的索引
- 选取前k个数据,并用字典存放这k条数据对应的标签和标签出现的次数
依次获取这k条数据对应的标签,判断是否在字典中。若在字典中,则该标签对应的值+1。
反之,在字典中添加该标签,且对应的值+1。
- 根据字典中value值进行降序排序
- 返回频率最大的分类标签
算法应用一般步骤:
准备数据-从文本文件中解析数据(即得到训练集数据和对应的标签数据)
思想:将文本文件内容通过readlines(),转换为一个列表对象。其中原始数据的每一行数据都是列表的每一个元素。依次读取列表文件中的每个元素,根据特征间的特点(如tab键,空格键等),将一行数据的多个特征值划分为单独字符,前面的若干个字符放入训练集矩阵的一行中,最后一个字符为标签字符,添加到标签向量中。
分析数据-使用Matplotlib创建散点图
定义画布---划分区域---定义x轴,y轴
准备数据-归一化数值
在处理不同取值范围的特征值时,为了避免某个特征值对计算结果的影响,通常采用的方法是将数值归一化,如将取值范围处理为0到1或者-1到1之间。
比如:newValue = (oldValue - min) / (max - min)
编程思想:分别计算每一列的最小值,最大值,取值范围(均为1行n列的矩阵)。再通过tile方法分别将其扩展m行n列,便和原始数据的大小一致。原始数据矩阵-最小值矩阵,将得到的结果矩阵 / 取值范围矩阵,便可达到归一化后的矩阵。