精华内容
下载资源
问答
  • KNN算法思想与应用例子 这篇文章是在学习KNN时写的笔记,所参考的书为《机器学习实战》,希望深入浅出地解释K近邻算法的思想,最后放一个用k近邻算法识别图像数字的例子。  KNN算法也称K近邻,是一种监督学习算法...

    KNN算法思想与应用例子

    这篇文章是在学习KNN时写的笔记,所参考的书为《机器学习实战》,希望深入浅出地解释K近邻算法的思想,最后放一个用k近邻算法识别图像数字的例子。    

    KNN算法也称K近邻,是一种监督学习算法,即它需要训练集参与模型的构建。它适用于带标签集的行列式(可理解为二维数组)的数据集。

    需要准备的数据有:训练数据集,训练标签集(每个数据与每个标签都一一对应)用于参与模型构建;
        需要测试的数据集——通过这个模型得出——标签集(每个数据对应的标签)

    举个例子:我们把人体的指标量化,比如体重多少,三围多少,脂肪比例多少,然后这个标签就是性别(男或女)。我们的训练数据集就是500个男性和500个女性的身体指标,每个数据对应性别标签(男或女),这个就是训练标签集。然后我们输入一个人的指标,模型给出一个性别的判断,这个就是输出的标签集,也就是最后的预测结果。

    算法的流程为:

    1、计算输入测试数据与训练数据集的距离,这里用欧式距离来计算。

    2、根据得到的距离大小,按升序排序

    3、取前K个距离最小的数据集对应的标签

    4、计算这些标签的出现频率

    5、取出现频率最高的标签作为输入的测试数据的最后的标签,即预测结果

    其中,欧式距离的计算公式如下:

    这个公式怎么理解呢?假设输入的被测数据为A,它有两个维度(或者说字段),分别是AX­1和AX2。B为训练数据集,同理也有两个维度,BX­1和BX2和,所以以上的计算公式即不同维度的差的平方的和的开方。

    下面直接贴上代码,每一段都附有注释,希望童鞋们可以通过理解代码的执行来掌握整个KNN算法的流程。

    # KNN算法主程序
         
        def knnmain(inX,dataset,labels,k):   #输入量有(被测数据,训练数据集,训练标签集,K值),输入量皆为数组形式
            datasetsite=dataset.shape[0]   #取训练数据集的总数量n
            inXdata=tile(inX,(datasetsite,1))   #将被测数据的数组复制为n行相同数组组成的二维数组,方便下面的欧式距离计算
            sqdistance=inXdata-dataset   #开始计算欧式距离,这里计算被测数据和训练数据集之间相同维度的差
            distance=sqdistance**2   #计算差的平方
            dist=distance.sum(axis=1)  #计算不同维度的差的平方的总和
            lastdistance=dist**0.5   #将总和开方
            sortnum=lastdistance.argsort() #返回从小到大(增序)的索引值
            countdata={}   #创建一个空字典用于储存标签和对应的数量值
            for i in range(k):   
                vlabels=labels[sortnum[i]]   #将前k个距离最近的数据的标签传给vlabels
                countdata[vlabels]=countdata.get(vlabels,0)+1   #vlabels作为字典的键,而其出现的次数作为字典的值
            sortnumzi=sorted(countdata.iteritems(),key=operator.itemgetter(1),reverse=True)   #将字典按值降序排序,即第一位是出现次数最多的标签
            return sortnumzi[0][0]   #返回出现次数最多的标签值

     

    整个KNN算法的核心思想是比较简洁的,下面贴一个手写数字识别的应用。

    一个文本文档里储存一个32*32的由1和0组成的图像,差不多是下图所示:

          

    我们大概能识别出第一个图片里是0,第二个图片里是1,实际上每个文本文档都有一个文档名,如第一个图片的文档名就是"0_0.txt",那么我们就可以从文档名里取得该图片的标签。我们有一个训练文件夹,里面的文档文件可以获取并构成训练数据集和训练标签集。

    我们也有一个测试文件夹,同理里面的文档文件也可以获取并构成测试数据集和测试标签集(拿来与预测结果做对比)。文件夹截图如下:

     

    下面直接贴上代码帮助理解

    先是一个将32*32的文本文档转化为1*1024的程序,因为我们写的KNN算法主程序是以一行为单位的。

     

    def to_32(filename):
            returnoss=zeros((1,1024))
            ma=open(filename)    
            i=int(0)
            for line in ma.readlines():   
                for j in range(32):
                    returnoss[0,i*32+j]=line[j]
                i += 1
            return returnoss

    下面是手写数字识别程序:

        def distinguish():
            filestrain=listdir('trainingDigits')  #打开训练集文件夹
            filestest=listdir('testDigits')   #打开测试集文件夹
            mtrain=len(filestrain)    #训练集文件数量
            mtest=len(filestest)      #测试集文件数量
            allfilestrain=zeros((mtrain,1024))  #m行1024列的矩阵
            allfilestest=zeros((mtest,1024))
            labelstrain=[]  #创造一个空列表用于储存试验向量的标签
            labelstest=[]
            for i in range(mtrain):
                nametrain=filestrain[i]   #选取文件名
                inX=open('trainingDigits/%s' % nametrain)
                allfilestrain[i,:]=to_32(inX)   ##把每个文件中的32*32矩阵转换成1*1024的矩阵
                label1=nametrain.split('.')[0]
                label1=int(label1.split('_')[0])   #获取每个数据的标签
                labelstrain.append(label1)   #将所有标签合成一个列表
            for j in range(mtest):
                nametest=filestest[j]
                inY=open('trainingDigits/%s' % nametest)
                allfilestest[j,:]=to_32(inY)
                label2=nametest.split('.')[0]
                label2=int(label2.split('_')[0])
                labelstest.append(label2)
            labelstrain=np.array(labelstrain)
            labelstest=np.array(labelstest)
            grouptrain=allfilestrain
            grouptest=allfilestest
            error=0.0   #初始化判断错误率
            results=[]
            for line in grouptest:
                result=knnmain(line,grouptrain,labelstrain,3)
                results.append(result)
            errornum=0 ##初始化判断错误数量
            print 'the wrong prodiction as:'
            for i in range(mtest):
                if results[i] != labelstest[i]:
                    print 'result=',results[i],'labelstest=',labelstest[i] #输出所有判断错误的例子
                    errornum +=1
            print 'the errornum is:',errornum   #输出判断错误量
            print 'the allnum is:',mtest   #输出总测试量
            error=float(errornum/float(mtest))
            print 'the error persent is:',error   #输出总测试错误率

    该程序运行截图如下:

    我们看到错误率是比较低,说明该算法的精度是很高的。

    结语:从上面例子的应用来看,KNN算法的精度是很高,但是对噪声有些敏感,我们观察上面的运行结果,凡是判断失误的一般是两个数字长得比较像,比如9和5,下面的勾很像,9和7,也是比较像的,也就是说,假如测试的数据有些偏于常态,可能一个7长得比较歪,那就判断为9了,这些都是噪声,它对这些噪声的数据是无法精准识别的,因为k值较小,下面会说到k值得取值问题。另有,它的计算相对复杂,若对象数据集巨大,则计算量也很大。当然,最重要的一点,对k值的把握很重要,这一般是根据具体情况来判断,较大的k值能减少噪声干扰,但会使分类界限模糊,较小的k值又容易被噪声影响。一般取一个较小的k值,再通过交叉验证来选取最优k值。

    展开全文
  • KNN适用于分类的,不需要训练,该算法所选的邻居都是已经正确分类的对象。...KNN算法思想: 在训练集的数据和标签已知的情况下,输入测试数据,将测试数据的特征与训练集中对应的特征进行相互比较,找到训练与之最

    KNN适用于分类的,不需要训练,该算法所选的邻居都是已经正确分类的对象。该算法在定类决策上只依据最邻近的一个或者几个样本类别来决定待分类样本所属的类别

    KNN算法的思路

    KNN是通过不同特征之间的距离进行分类的。
    如果一个样本在特征空间中的K个最相似的样本中的大多数属于同一类别,则该样本也属于这一类别,其中K通常是不大于20的整数。
    KNN算法得结果很大程度上取决于K的选择

    KNN算法的思想:

    在训练集的数据和标签已知的情况下,输入测试数据,将测试数据的特征与训练集中对应的特征进行相互比较,找到训练与之最为相似的前K个数据,则该测试数据对应类别就是K个数据中出现的次数做多的哪一类,算法可以简单的描述为:

    1. 计算测试数数据与各个训练数据之间的距离
    2. 按照距离的递增关系进行排序
    3. 选取距离最小的K个点
    4. 确定前K个点所在类别的出现频率
    5. 返回前K个点中出现频率最高的类别作为测试数据的预测分类。

    算法的优缺点:

    算法的优点:

    1. 简单易于理解,无参数估计,不需要进行训练
    2. 适合对稀疏事件进行分类
    3. 特别适合多分类问题,再多分类问题上比SVM好用,效果好一些

    算法的缺点:

    1. 当样本分布不均匀时,容易判别错误。
    展开全文
  • knn算法思想和优缺点

    2020-01-08 16:58:09
    KNN算法的描述: (1)计算测试数据与各个训练数据之间的距离; (2)按照距离的递增关系进行排序; (3)选取距离最小的K个点; (4)确定前K个点所在类别的出现频率 (5)返回前K个点中出现频率最高的类别作为测试...

    KNN算法的描述:

    (1)计算测试数据与各个训练数据之间的距离;
    (2)按照距离的递增关系进行排序;
    (3)选取距离最小的K个点;
    (4)确定前K个点所在类别的出现频率
    (5)返回前K个点中出现频率最高的类别作为测试数据的预测分类。

    算法优点:
    (1)简单,易于理解,易于实现,
    1、KNN可以处理分类问题,同时天然可以处理多分类问题,比如鸢尾花的分类,KNN还可以处理回归问题,也就是预测
    准确度高,对异常值不是很敏感

    **算法缺点:
    1、效率低,因为每一次分类或者回归,都要把训练数据和测试数据都算一遍,如果数据量很大的话,需要的算力会很惊人

    KNN对于多维度的数据处理也不是很好,看似相近的两个点之间,距离越来越大

    展开全文
  • KNN算法思想与应用例子

    千次阅读 2016-07-03 16:29:50
     KNN算法也称K近邻,是一种监督学习算法,即它需要训练集参与模型的构建。它适用于带标签集的行列式(可理解为二维数组)的数据集。 需要准备的数据有:训练数据集,训练标签集(每个数据与每个标签都一一对应)...

        这篇文章是在学习KNN时写的笔记,所参考的书为《机器学习实战》,希望深入浅出地解释K近邻算法的思想,最后放一个用k近邻算法识别图像数字的例子。    

        KNN算法也称K近邻,是一种监督学习算法,即它需要训练集参与模型的构建。它适用于带标签集的行列式(可理解为二维数组)的数据集。

        需要准备的数据有:训练数据集,训练标签集(每个数据与每个标签都一一对应)用于参与模型构建;
        需要测试的数据集——通过这个模型得出——标签集(每个数据对应的标签)

    举个例子:我们把人体的指标量化,比如体重多少,三围多少,脂肪比例多少,然后这个标签就是性别(男或女)。我们的训练数据集就是500个男性和500个女性的身体指标,每个数据对应性别标签(男或女),这个就是训练标签集。然后我们输入一个人的指标,模型给出一个性别的判断,这个就是输出的标签集,也就是最后的预测结果。

    算法的流程为:

          1、计算输入测试数据与训练数据集的距离,这里用欧式距离来计算。

          2、根据得到的距离大小,按升序排序

          3、取前K个距离最小的数据集对应的标签

          4、计算这些标签的出现频率

          5、取出现频率最高的标签作为输入的测试数据的最后的标签,即预测结果

    其中,欧式距离的计算公式如下:

    这个公式怎么理解呢?假设输入的被测数据为A,它有两个维度(或者说字段),分别是AX­1和AX2。B为训练数据集,同理也有两个维度,BX­1和BX2和,所以以上的计算公式即不同维度的差的平方的和的开方。

    下面直接贴上代码,每一段都附有注释,希望童鞋们可以通过理解代码的执行来掌握整个KNN算法的流程。

    # KNN算法主程序
    
    def knnmain(inX,dataset,labels,k):   #输入量有(被测数据,训练数据集,训练标签集,K值),输入量皆为数组形式
        datasetsite=dataset.shape[0]   #取训练数据集的总数量n
        inXdata=tile(inX,(datasetsite,1))   #将被测数据的数组复制为n行相同数组组成的二维数组,方便下面的欧式距离计算
        sqdistance=inXdata-dataset   #开始计算欧式距离,这里计算被测数据和训练数据集之间相同维度的差
        distance=sqdistance**2   #计算差的平方
        dist=distance.sum(axis=1)  #计算不同维度的差的平方的总和
        lastdistance=dist**0.5   #将总和开方
        sortnum=lastdistance.argsort() #返回从小到大(增序)的索引值
        countdata={}   #创建一个空字典用于储存标签和对应的数量值
        for i in range(k):   
            vlabels=labels[sortnum[i]]   #将前k个距离最近的数据的标签传给vlabels
            countdata[vlabels]=countdata.get(vlabels,0)+1   #vlabels作为字典的键,而其出现的次数作为字典的值
        sortnumzi=sorted(countdata.iteritems(),key=operator.itemgetter(1),reverse=True)   #将字典按值降序排序,即第一位是出现次数最多的标签
        return sortnumzi[0][0]   #返回出现次数最多的标签值
    

    整个KNN算法的核心思想是比较简洁的,下面贴一个手写数字识别的应用。

    一个文本文档里储存一个32*32的由1和0组成的图像,差不多是下图所示:

          

    我们大概能识别出第一个图片里是0,第二个图片里是1,实际上每个文本文档都有一个文档名,如第一个图片的文档名就是"0_0.txt",那么我们就可以从文档名里取得该图片的标签。我们有一个训练文件夹,里面的文档文件可以获取并构成训练数据集和训练标签集。

    我们也有一个测试文件夹,同理里面的文档文件也可以获取并构成测试数据集和测试标签集(拿来与预测结果做对比)。文件夹截图如下:

     

    下面直接贴上代码帮助理解

    先是一个将32*32的文本文档转化为1*1024的程序,因为我们写的KNN算法主程序是以一行为单位的。

    def to_32(filename):
        returnoss=zeros((1,1024))
        ma=open(filename)    
        i=int(0)
        for line in ma.readlines():   
            for j in range(32):
                returnoss[0,i*32+j]=line[j]
            i += 1
        return returnoss

    下面是手写数字识别程序:

    def distinguish():
        filestrain=listdir('trainingDigits')  #打开训练集文件夹
        filestest=listdir('testDigits')   #打开测试集文件夹
        mtrain=len(filestrain)    #训练集文件数量
        mtest=len(filestest)      #测试集文件数量
        allfilestrain=zeros((mtrain,1024))  #m行1024列的矩阵
        allfilestest=zeros((mtest,1024))
        labelstrain=[]  #创造一个空列表用于储存试验向量的标签
        labelstest=[]
        for i in range(mtrain):
            nametrain=filestrain[i]   #选取文件名
            inX=open('trainingDigits/%s' % nametrain)
            allfilestrain[i,:]=to_32(inX)   ##把每个文件中的32*32矩阵转换成1*1024的矩阵
            label1=nametrain.split('.')[0]
            label1=int(label1.split('_')[0])   #获取每个数据的标签
            labelstrain.append(label1)   #将所有标签合成一个列表
        for j in range(mtest):
            nametest=filestest[j]
            inY=open('trainingDigits/%s' % nametest)
            allfilestest[j,:]=to_32(inY)
            label2=nametest.split('.')[0]
            label2=int(label2.split('_')[0])
            labelstest.append(label2)
        labelstrain=np.array(labelstrain)
        labelstest=np.array(labelstest)
        grouptrain=allfilestrain
        grouptest=allfilestest
        error=0.0   #初始化判断错误率
        results=[]
        for line in grouptest:
            result=knnmain(line,grouptrain,labelstrain,3)
            results.append(result)
        errornum=0 ##初始化判断错误数量
        print 'the wrong prodiction as:'
        for i in range(mtest):
            if results[i] != labelstest[i]:
                print 'result=',results[i],'labelstest=',labelstest[i] #输出所有判断错误的例子
                errornum +=1
        print 'the errornum is:',errornum   #输出判断错误量
        print 'the allnum is:',mtest   #输出总测试量
        error=float(errornum/float(mtest))
        print 'the error persent is:',error   #输出总测试错误率
    该程序运行截图如下:



    我们看到错误率是比较低,说明该算法的精度是很高的。

    结语:从上面例子的应用来看,KNN算法的精度是很高,但是对噪声有些敏感,我们观察上面的运行结果,凡是判断失误的一般是两个数字长得比较像,比如9和5,下面的勾很像,9和7,也是比较像的,也就是说,假如测试的数据有些偏于常态,可能一个7长得比较歪,那就判断为9了,这些都是噪声,它对这些噪声的数据是无法精准识别的,因为k值较小,下面会说到k值得取值问题。另有,它的计算相对复杂,若对象数据集巨大,则计算量也很大。当然,最重要的一点,对k值的把握很重要,这一般是根据具体情况来判断,较大的k值能减少噪声干扰,但会使分类界限模糊,较小的k值又容易被噪声影响。一般取一个较小的k值,再通过交叉验证来选取最优k值。



    展开全文
  • 1.什么是KNN K近邻算法(K-Nearest Neighbour,K-NN)是一种基本分类与回归方法,是一个理论上比较成熟的方法,也是最简单的机器学习算法之一。该方法的思路是:如果一个样本在特征空间中的K个最相似(即特征空间中...
  • KNN算法思想与实现

    2017-03-24 11:43:00
    2.1 算法描述 (1)采用测量不同特征值之间的距离进行分类 优点:对异常点不敏感,精度高,无数据输入设定 缺点:空间,计算复杂度高 适合数据:标称与数值 (2)算法的工作原理: 基于已有的带有标签的训练...
  • KNN算法主要是通过K个最近样本的类型判断当前样本的类别,可用于分类和回归。他们的决策方式有所区别:做分类时,一般采用多数表决法,K个最近邻中,哪个类别占的比例多,预测样本就为哪个类别;做回归时,一般采用...
  • 上述过程(1)(2)(3)在寻找k个最近点时,采用了暴力搜索的思想。 也可以采取其他算法寻找处最近的k个点,如:BallTree, KDTree等。 计算流程事例: (1) (2) (3) (4) sklearn.neighbors....
  • knn算法knn算法knn算法

    2018-11-19 10:38:22
    kNN算法的核心思想是如果一个样本在特征空间中的k个最相邻的样本中的大多数属于某一个类别,则该样本也属于这个类别,并具有这个类别上样本的特性。该方法在确定分类决策上只依据最邻近的一个或者几个样本的类别来...
  • KNN算法算法思想

    2019-07-13 16:23:00
    KNN算法算法思想 转载于:https://www.cnblogs.com/liuys635/p/11181080.html
  • knn算法概述

    2020-12-27 22:37:20
    为了完成本关任务,你需要掌握:1.knn算法思想,2.距离度量。 knn算法思想 k-近邻(k-nearest neighbor ,knn)是一种分类与回归的方法。我们这里只讨论用来分类的knn。所谓k最近邻,就是k个最近的邻居的意思,说的是...
  • KNN算法

    2018-01-17 08:46:02
    通过一段时间的学习,看完了《机器学习实战》的k近邻(KNN)分类算法,英文名(k-Nearest Neighbors algorithm),其原理很简单,难的...KNN算法思想 首先我们有,测试数据(example data),数据集合(训练集training
  • 文章目录KNN(K nearest neighbors)K值的选择和影响k取值偏小k取值偏大样本点距离的计算方式闵可夫斯基距离曼哈顿距离欧几里得距离切比雪夫距离余弦距离决策函数的选择用于分类的多票表决法用于回归的平均值法KNN算法...
  • KNN算法和sklearn中的KNN算法

    千次阅读 2018-09-09 15:45:06
    KNN基本思想 ...KNN算法中,所选择的邻居都是已经正确分类的对象。该方法在定类决策上只依据最邻近的一个或者几个样本的类别来决定待分样本所属的类别。 使用图来说话比较方便: 原始数据的散点图如下...
  • kNN算法

    2018-08-21 14:53:56
    kNN算法将样本分到离它最相似的样本所属的类。算法本质上使用了模板匹配的思想。要确定一个样本的类别,可以计算它与所有训练样本的距离,然后找出和该样本最接近的k个样本,统计这些样本的类别进行投票,票数最多的...
  • 6行代码实现kNN算法

    2019-08-24 16:22:02
    kNN算法思想 衡量未知分类点周围邻居的权重 然后把它归类到权重更大的那一类 较适用于类域交叉重叠的样本 kNN算法描述 输入k值 对未知类别数据集中的每一个点依此执行以下操作 计算当前点与已知类别数据集中的...
  • KNN算法详解

    2016-01-19 14:25:37
    本文档对KNN的基本思想KNN算法的实现、KNN的优缺点、KNN的一些改进策略以及KNN在实际问题中的应用进行了综合分析
  • Knn算法

    2020-07-16 20:34:58
    kNN算法的核心思想是用距离最近的k个样本数据的分类来代表目标数据的分类。 其原理具体地讲,存在一个训练样本集,这个数据训练样本的数据集合中的每个样本都包含数据的特征和目标变量(即分类值),输入新的不含...
  • 文章目录kNN算法思想与步骤实力分析与代码实现 kNN算法思想与步骤 kNN算法的基本思想如下: 假设样本集共有n个样本,它们在m个特征上具有区分度,它们分别属于0或1中的一类。假设第i个样本的特征向量为(ai1,ai2,⋯...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 12,313
精华内容 4,925
关键字:

knn算法思想