基于Python的机器学习算法实现-K-近邻算法(一)

基于Python的机器学习算法实现-K-近邻算法(一)

前言

本博客的内容是基于清华大学李航老师的《统计学习方法》、南京大学周志华老师的《机器学习》以及外国书籍《Machine Learning in Action》为参考,并结合自生的理解以及代码的实现书写而成,部分资料可以关注文末的个人订阅号,回复”nlp”即可。

01.算法简介

k近邻算法(k-nearest neighbor)是一种基本分类与回归方法。k-近邻算法的输入为实例的特征向量,对应与特征空间的点,输出为示例的类别。
其具有的特点是:
优点:精度高,对异常数据不敏感,无数据输入假定;
缺点:计算复杂度高、空间复杂度高;
适用数据范围:数值型和标称型。
工作原理
存在一个样本数据集合,也成为训练样本集,并且样本集中每个数据都存在标签,即我们知道样本集中每一数据与所属分类的对应关系。输入没有标签的数据后,将数据的每个特征与样本集中数据对应的特征进行比较,然后算法提取样本集中特种最相似的数据(最近邻)的分类标签。

02.k-近邻算法的一般流程

  1. 收集数据:可以使用任何方法。
  2. 准备数据:距离计算所需要的数值,最好是结构化的数据格式。
  3. 分析数据:可以使用任何方法。
  4. 训练算法:此步骤不适合k-近邻算法。
  5. 测试算法:计算错误率。
  6. 使用算法:首先需要输入样本数据和结构化的输出结果,然后运行k-近邻算法判定输入数据分别属于哪个分类,最后应用对计算出的分类执行后续的处理。

03.算法实现的一个入门案例

首先创建一个kNN.py的Python模块,这里的作用是提供训练数据,以及对计算的近似度数据进行排序输出的一个功能包。
代码如下:

#导入numpy的所有函数到当前环境
from numpy import *
#运算符模块,k-近邻算法执行排序操作时使用的模块
import operator

#创建当前测试的训练集
def createDataSet():
    #数据集,四组数据,每组数据两个属性
    group=array([[1.0,1.1],[1.0,1.0],[0,0],[0,0.1]])
    #对应数据的类别
    labels=['A','A','B','B']
    #返回数据集及其类别
    return group,labels
#分类函数,四个参数分别是:测试数据集,训练的数据集,训练数据集对应的类别,所选的最近邻近数目
def classify0(inX,dataSet,labels,k):
    #获取训练集的中的数据数量,这是二维数据中的长度
    #计算距离
    #需要注意,dataSet.shape 返回一个tuple,(a,b)就是a行b列
    dataSetSize=dataSet.shape[0]
    #tile 是numpy中的函数,这里是将inX的行复制dataSetSize次,将列复制1次;然后每个数据减去数组的训练集对应的值
    diffMat=tile(inX,(dataSetSize,1))-dataSet
    #将数组各个元素平方
    sqDiffMat=diffMat**2
    #将矩阵sqDiffMat 每一行元素相加成为新的矩阵中对应位置中
    sqDistances=sqDiffMat.sum(axis=1)
    #对结果去平方根
    distances=sqDistances**0.5
    #对distances进行从小到大的排序,并提取对应的索引值
    sortedDistIndicies=distances.argsort()
    #定义一个空的字典类型
    classCount={}

    #选择距离最小的k个点
    #根据输入的参数的k进行循环
    for i in range(k):
        #根据索引获取对应的所属类的值
        voteIlabel=labels[sortedDistIndicies[i]]
        #向字典中添加值 其中的get 如果获取步到键为voteIlabel,就把0赋值过去然后+1
        #当第二次遇到同一个label时,0已经不起作用了,直接获取当前的值,然后+1 ,可以起记录作用,由于键值一样有数据会这覆盖
        classCount[voteIlabel]=classCount.get(voteIlabel,0)+1
    #将字典classCount进行排序,其参数分别是可迭代对象,key为主要用来比较的元素,operator.itemgetter(1)获取对象哪维数据,reverse=True为降序
    sortedClassCount=sorted(classCount.items(),key=operator.itemgetter(1),reverse=True)
    #返回距离小的标记
    return sortedClassCount[0][0]

其中实现算法的思路是:
这里写图片描述
其中距离的计算
d = ( x A 0 x B 0 ) 2 + ( x A 1 x B 1 ) 2
主函数新建一个py文件

#导入写好的包
import kNN
#获取训练数据以及其对应的结果
group,labels=kNN.createDataSet()
#将训练数据和测试数据传进去,这里的k值设为3
results=kNN.classify0([0,0], group, labels, 3)
#打印结果
print(results)

结果为B,即为该类型预测为B

B
[Finished in 0.7s]

关于代码中不清楚的可以的可以查看博客:机器学习中遇到问题汇总(一)。下一篇将继续介绍这个算法。

想了解更多关于自然语言处理、机器学习的内容,可以关注个人订阅号,那里有大量的文章以及学习资料。
这里写图片描述

猜你喜欢

转载自blog.csdn.net/meiqi0538/article/details/80230145