街坊算法试行学习lehu娱乐手机平台网站

      
至于本文申明,本身原博客地址位于http://blog.csdn.net/qq\_37608890,本文来自笔者于2017年12月04日
2二:5四:26所撰写内容(http://blog.csdn.net/qq\_37608890/article/details/78714664)。

   

    本文依照近来学习机器学习书本
网络小说的情景,特将一些读书思路做了总结整理,详细情况如下.如有不当之处,请各位大腕多多教导,在此谢过.

1、k-近邻算法(k-Nearest
Neighbor,KNN)概述

一、简言之,k-近邻算法选择衡量不相同特征值之间的偏离方法开始展览分类。

二、职业原理

    
存在四个样书数量集合,也叫做练习样本集,且样本集中每一种数据都设有标签,约等于远近有名样本集中每1数量与所属分类的相应关系。输入未有标签的新数据以往,将新数据的各类特征与范本集中数据对应的风味举行相比,然后算法提取样本集中特征最相似数据(近日邻)的分类标签。一般情状下,大家只选拔样本数量汇总前k个最相似的数码,那正是k-近邻算法中k的出处,平常k是不当先20的整数。最后,采用k个最相似数据中冒出次数最多的分类,作为新数据的分类。

三、k-近邻算法的相似流程

     (壹) 搜罗数据:能够运用别的格局。
     (二) 准备数据: 距离计算机技艺研商所供给的数值,最棒是结构化数据格式。
     (三) 分析数据: 可以利用别的措施。
     (四) 陶冶算法: 此步骤不适用K-近邻算法。
     (5) 测试算法: 计算错误率。
      (陆) 使用算法:
首先要求输入样本数量和结构化的出口结果,然后运维k-近邻算法判别输入数据分别属于哪个分类,最后采用对计量出的归类施行后续的拍卖。

肆、相关本性

    (一)优点: 精度高,对分外值不灵敏、无输入假定。

     (贰)缺点: 计算复杂度高、空间复杂度高。

     (叁)适用数据范围: 数值型和标称型。

  
kNN是non-parametric分类器(不做分布情势的假使,直接从数量猜想可能率密度),是memory-based
learning,不适用于高维数据(curse of
dimension),算法复杂度高(可用KD树优化)。其它,k越小越轻巧过拟合,不过k相当大会将分类精度(设想极限状态:k=1和k=N(样本数))。

    

2、k-近邻场景

    
我们知道,电影能够按题目分类,但难点本人是什么定义的?由何人来判断某部电影属于哪个难题?即同壹主题素材的录制会具有什么样公共特征?那个都是在做电影分类时必定要搞了解的主题素材。那里以奇幻片和爱情片为例做简单表明。悬疑片具备何样公共特征,使得悬疑片之间丰裕相像,却理解分化爱情片?悬疑片中也大概有接吻镜头,爱情片中也大概存在争斗镜头,所以,不能够轻便地依靠是或不是留存打架或许接吻来判别1部影片的花色。但很让人侧指标是,动作戏中的打斗镜头越来越多、爱情片中的接吻次数更频仍,基于此类现象在壹部影片中冒出的次数可用来开始展览电影分类。

   有人曾经计算过无数影片的打斗镜头和亲吻镜头, 下方图1-一给出了陆部影视的对打和接吻镜头。若是以后有1部并未有看过的影片,你怎么样推断它属于奇幻片如故爱情片呢?

 

  lehu娱乐手机平台网站 1

 

                 图1-1

 

    
首先,大家弄精通那部未知电影中留存多少互殴镜头、多少接吻镜头,图一-第11中学问号地方是该未知电影出现的镜头数图示,具体见下方表一-1。

lehu娱乐手机平台网站, 

表1-一每部电影的争斗镜头数、接吻镜头数及电影视评论估项目

lehu娱乐手机平台网站 2

   
由图1-一和表一-壹,可用将未知电影在图一-一的具体地方标出,利用欧式距离公式,计算出茫然电影与范本集中别的电影里面包车型大巴距离,相见下方表二-二所示。

表二-2 已知电影与未知电影时期的离开

lehu娱乐手机平台网站 3

       
由表二-二所示,鲜明,借使样本集中具备电影与未知电影里面包车型地铁距离依照递增排序的话,能够获得k个距离近日的影视,那里借使k=2的话,则未知电影与电影和电视He’s
Not Really into Dudes,Beautiful
Woman影片类型最为相似,决断未知电影属于爱情片。

 

三、示例:使用kNN算法优化约会网址的配对效果

   
特别提醒:有个别教材或博客,在代码实现进度中,由于python二.x和python三.x的比不上,在其实执行进度中冒出语法错误,这Ritter做提示,print语句将出口内容一律加上();此外,python三.0本子后用input替换了raw_input,请读者注意。

1、项目概述

      
Hellen在运用约会网址搜索自个儿的约会对象。计算经验之后,她意识曾接触过的人分三种档次:

  • 不欣赏的人
  • 魔力一般的人
  • 极具吸重力的人

     她期待:

  • 工作日与魔力壹般的人约会
  • 周末与极具魔力的人约会
  • 不希罕的人则一贯铲除掉

2、  k-近邻算法开辟达成流程

  • 收集数据:提供文本文件

  •  准备数据:使用 Python 解析文本文件

  •  分析数据:使用 Matplotlib 画贰维散点图

  •  演练算法:此步骤不适用于 k-近邻算法

  •  测试算法:使用Hellen提供的部分数据作为测试样本。 测试样本和非测试样本的差距在于: 测试样本是曾经实现分类的多少,如若预测分类与实际体系分歧,则标志为3个谬误。

  •  使用算法:发生简单的一声令下行程序,然后Hellen能够输入一些表征数据以咬定对方是不是为温馨喜欢的连串。

三、   准备数据:从文本文件中剖析数据

         最近,Hellen搜聚来1些约会对象的数据,并把这么些多少存放在文书文件
datingTestSet2.txt中,每种样本数量占有一行,总共有
一千 行。这么些样本数量首要包蕴以下 3 种特色:

  • 每年得到的宇宙航行常客里程数
  • 玩录像游戏所耗时间百分比
  • 每一周消费的冰激凌公升数

而文本文件datingTestSet2.txt的数额格式如下:“

40999    9.161978      1.110180      3
15823    0.991725      0.730979      2
35432    7.398380      0.684218      3
53711    12.149747     1.389088      3
64371    9.149678      0.874905      1
9289    9.666576       1.370330      2

 

桑土绸缪数据:使用 Python 解析文本文件

将文件记录转变为 NumPy 的辨析程序

    def file2matrix(filename):  
       """ 
       Desc: 
           导入训练数据 
       parameters: 
           filename: 数据文件路径 
       return:  
           数据矩阵 returnMat 和对应的类别 classLabelVector 
       """  
       fr = open(filename)  

       numberOfLines = len(fr.readlines())  


       returnMat = zeros((numberOfLines, 3))  # prepare matrix to return  
       classLabelVector = []  # prepare labels return  
       fr = open(filename)  
       index = 0  
       for line in fr.readlines():  

           line = line.strip()  

           listFromLine = line.split('\t')  

           returnMat[index, :] = listFromLine[0:3]  

           classLabelVector.append(int(listFromLine[-1]))  
           index += 1  

       return returnMat, classLabelVector  

 

执行如下命令
 

    datingDataMat,datingLabels=file2matrix('datingTestSet2.txt')  
    datingDataMat  

 

得到

array([[  4.09200000e+04,   8.32697600e+00,   9.53952000e-01],
       [  1.44880000e+04,   7.15346900e+00,   1.67390400e+00],
       [  2.60520000e+04,   1.44187100e+00,   8.05124000e-01],
       ..., 
       [  6.88460000e+04,   9.97471500e+00,   6.69787000e-01],
       [  2.65750000e+04,   1.06501020e+01,   8.66627000e-01],
       [  4.81110000e+04,   9.13452800e+00,   7.28045000e-01]])

 

执行 datingLabels[0:20],得到

[3, 2, 1, 1, 1, 1, 3, 3, 1, 3, 1, 1, 2, 1, 1, 1, 1, 1, 2, 3]

 

4、       分析数据:使用 Matplotlib 画二维散点图

 

执行如下代码  

    import matplotlib  
    import matplotlib.pyplot as plt  
    fig = plt.figure()  
    ax = fig.add_subplot(111)  
    ax.scatter(datingDataMat[:, 1], datingDataMat[:, 2], 15.0*array(datingLabels), 15.0*array(datingLabels))  
    plt.show()  

 

  获得如下图

 lehu娱乐手机平台网站 4

 

 

而下图中运用矩阵的率先和第2列属性得到很好的显得效果,清晰地标识了多个不一致的范本分类区域,具备差别爱好的人其体系区域也差异。

lehu娱乐手机平台网站 5

五、     准备数据:归壹化数值

       归一化数据 (归1化是八个让权重变为合并的长河)

序号 玩视频游戏所耗时间百分比 每年获得的飞行常客里程数 每周消费的冰淇淋公升数 样本分类
1 0.8 400 0.5 1
2 12 134 000 0.9 3
3 0 20 000 1.1 2
4 67 32 000 0.1 2

样本3和样本4的距离:

(0−67)2+(20000−32000)2+(1.1−0.1)2−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−√

归1化特征值,消除特征之间量级区别形成的熏陶

归1化定义:
笔者是这么认为的,归一化正是要把你须要处理的数量经过处理后(通过某种算法)限制在你须求的一定范围内。首先归一化是为了后面数据处理的有利,其次是保正程序运维时没有加速。
方法有如下:

  • 线性函数转变,表明式如下:  

    y=(x-MinValue)/(MaxValue-MinValue)  

    表明:x、y分别为转移前、后的值,马克斯Value、MinValue分别为样本的最大值和微小值。  

  • 对数函数调换,表明式如下:  

    y=log10(x)  

    注解:以10为底的对数函数转变。

    如图:lehu娱乐手机平台网站 6

  • 反余切函数调换,表明式如下:

    y=atan(x)*2/PI 

    如图:lehu娱乐手机平台网站 7

  • 式(1)将输入值换算为[-1,1]距离的值,在输出层用式(2)换算回早先值,其如月分级表示练习样本集中负荷的最大值和纤维值。  

在计算学中,归1化的具体效果是汇总统一样本的总括分布性。归1化在0-一之内是总计的可能率分布,归壹化在-壹–+一之内是总结的坐标分布。

    def autoNorm(dataSet):  
        """ 
        Desc: 
            归一化特征值,消除特征之间量级不同导致的影响 
        parameter: 
            dataSet: 数据集 
        return: 
            归一化后的数据集 normDataSet. ranges和minVals即最小值与范围,并没有用到 

        归一化公式: 
            Y = (X-Xmin)/(Xmax-Xmin) 
            其中的 min 和 max 分别是数据集中的最小特征值和最大特征值。该函数可以自动将数字特征值转化为0到1的区间。 
        """  

        minVals = dataSet.min(0)  
        maxVals = dataSet.max(0)  

        ranges = maxVals - minVals  
        normDataSet = zeros(shape(dataSet))  
        m = dataSet.shape[0]  

        normDataSet = dataSet - tile(minVals, (m, 1))  

        normDataSet = normDataSet / tile(ranges, (m, 1))  # element wise divide  
        return normDataSet, ranges, minVals  

 

教练算法:此步骤不适用于 k-近邻算法

    
因为测试数据每3次都要与全量的磨炼多少开始展览比较,所以这么些过程是不曾供给的。

 

6 、   测试算法

           作为完全程序验证分类器

          
使用Hellen提供的局地数据作为测试样本。借使预测分类与事实上体系不相同,则标记为三个荒唐。

    kNN 分类器针对约会网址的测试代码

    def datingClassTest():  
        """ 
        Desc: 
            对约会网站的测试方法 
        parameters: 
            none 
        return: 
            错误数 
        """  

        hoRatio = 0.1  # 测试范围,一部分测试一部分作为样本  

        datingDataMat, datingLabels = file2matrix('datingTestSet2.txt')  # load data setfrom file  

        normMat, ranges, minVals = autoNorm(datingDataMat)  

        m = normMat.shape[0]  

        numTestVecs = int(m * hoRatio)  
        print 'numTestVecs=', numTestVecs  
        errorCount = 0.0  
        for i in range(numTestVecs):  

            classifierResult = classify0(normMat[i, :], normMat[numTestVecs:m, :], datingLabels[numTestVecs:m], 3)  
            print ("the classifier came back with: %d, the real answer is: %d" % (classifierResult, datingLabels[i]))  
            if (classifierResult != datingLabels[i]): errorCount += 1.0  
        print ("the total error rate is: %f" % (errorCount / float(numTestVecs)))  
        print (errorCount)  

 

七、   使用算法:营造完全可用的系统

      
上边已经在数量上对分类器举办了测试,今后则足以应用这些分类器支持Hellen对于约会对象进行分类,即Hellen在网址上找到某人并输入他的新闻,该程序会付出她对对方喜欢程度的展望值.

    def clasdifyPerson():  
        resultList = ['not at all', 'in small doses', 'in large doses']  
        percentTats = float(raw_input("percentage of time spent playing video games ?"))  
        ffMiles = float(raw_input("frequent filer miles earned per year?"))  
        iceCream = float(raw_input("liters of ice cream consumed per year?"))  
        datingDataMat, datingLabels = file2matrix('datingTestSet2.txt')  
        normMat, ranges, minVals = autoNorm(datingDataMat)  
        inArr = array([ffMils, percentTats, iceCream])  
        classifierResult = classify0((inArr-minVals)/ranges,normMat,datingLabels, 3)  
        print ("You will probably like this person: ", resultList[classifierResult - 1])  

 

实则运作效果如下:

>>> kNN.classifyPerson()
percentage of time spent playing video games?10
frequent flier miles earned per year?10000
liters of ice cream consumed per year?0.5
You will probably like this person: in small doses

 

4、   项目案例二: 手写数字识别系统

一、   项目概述

布局三个能识别数字 0 到 九 的遵照 KNN 分类器的手写数字识别系统。

亟需识其余数字是储存在文件文件中的具备同等的色彩和大小:宽高是 3贰 像素
* 3二 像素的长短图像。

贰、   开辟流程

收集数据:提供文本文件。 准备数据:编写函数 img2vector(), 将图像格式转换为分类器使用的向量格式 分析数据:在 Python 命令提示符中检查数据,确保它符合要求 训练算法:此步骤不适用于 KNN 测试算法:编写函数使用提供的部分数据集作为测试样本,测试样本与非测试样本的          区别在于测试样本是已经完成分类的数据,如果预测分类与实际类别不同,          则标记为一个错误 使用算法:本例没有完成此步骤,若你感兴趣可以构建完整的应用程序,从图像中提取          数字,并完成数字识别,美国的邮件分拣系统就是一个实际运行的类似系统 

收集数据: 提供文本文件

目录  trainingDigits中含有了大约 三千个例证,每一个例子内容如下图所示,各类数字差不离有 200 个样本;目录
testDigits中隐含了大致 900 个测试数据。

lehu娱乐手机平台网站 8

预备数据: 编写函数 img二vector(), 将图像文本数据调换为分类器使用的向量

将图像文本数据调换为向量

    def img2vector(filename):  
        returnVect = zeros((1,1024))  
        fr = open(filename)  
        for i in range(32):  
            lineStr = fr.readLine()  
            for j in range(32):  
                returnVect[0,32*i+j] = int(lineStr[j])  
        return returnVect  

 

解析数据:在 Python 命令提示符中检查数据,确认保障它符合要求

在 Python 命令行中输入下列命令测试 img贰vector
函数,然后与公事编辑器打开的文书举办相比:

>>> testVector = kNN.img2vector('testDigits/0_13.txt')
>>> testVector[0,0:31]
array([0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 1., 1., 1., 1., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.])
>>> testVector[0,31:63]
array([0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 1., 1., 1., 1., 1., 1., 1., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.])

 

演习算法:此步骤不适用于 KNN

因为测试数据每2遍都要与全量的教练多少开始展览相比较,所以那么些历程是不曾须要的。

测试算法:编写函数使用提供的一对数据集作为测试样本,假设预测分类与事实上连串差别,则标识为一个荒唐

def handwritingClassTest():  

    hwLabels = []  
    trainingFileList = listdir('trainingDigits')  # load the training set  
    m = len(trainingFileList)  
    trainingMat = zeros((m, 1024))  

    for i in range(m):  
        fileNameStr = trainingFileList[i]  
        fileStr = fileNameStr.split('.')[0]  # take off .txt  
        classNumStr = int(fileStr.split('_')[0])  
        hwLabels.append(classNumStr)  
        # 将 32*32的矩阵->1*1024的矩阵  
        trainingMat[i, :] = img2vector('trainingDigits/%s' % fileNameStr)  


    testFileList = listdir('testDigits')  # iterate through the test set  
    errorCount = 0.0  
    mTest = len(testFileList)  
    for i in range(mTest):  
        fileNameStr = testFileList[i]  
        fileStr = fileNameStr.split('.')[0]  # take off .txt  
        classNumStr = int(fileStr.split('_')[0])  
        vectorUnderTest = img2vector('testDigits/%s' % fileNameStr)  
        classifierResult = classify0(vectorUnderTest, trainingMat, hwLabels, 3)  
        print "the classifier came back with: %d, the real answer is: %d" % (classifierResult, classNumStr)  
        if (classifierResult != classNumStr): errorCount += 1.0  
    print ("\nthe total number of errors is: %d" % errorCount)  
    print ("\nthe total error rate is: %f" % (errorCount / float(mTest))) 

运用算法:本例未有落成此步骤,若您感兴趣能够塑造壹体化的应用程序,从图像中领到数字,并做到数字识别,U.S.A.的邮件分拣系统正是3个其实运行的近乎系统

伍、   K-近邻算法小结

   
甘休近来,大家做壹计算,k-近邻算法必须保留全部数据集,如果磨炼多少集十分的大,必须利用多量的积存空间.由于必须对数据汇总的各类数据测算距离值,实际使用时或者特别耗费时间.其余,k-近邻还有以缺陷是它不可能给出任何数据的基础结构信息,也就不可能获知平均实例样本和卓越实例样本有何样特征.而要消除那些主题素材,供给使用概率衡量方法来处理.

k 近邻算法有 多当中央的因素:

  • k 值的选用

    • k 值的取舍会对 k 近邻算法的结果爆发首要的熏陶。
    • 只要选取较小的 k
      值,就也正是用较小的邻域中的操练实例实行预测,“学习”的接近舍入误差(approximation
      error)会减小,唯有与输入实例较近的(相似的)练习实例才会对预测结果起效果。但缺点是“学习”的揣测引用误差(estimation
      error)会叠加,预测结果会对邻居的实例点非常灵敏。若是相近的实例点恰巧是噪声,预测就会出错。换句话说,k
      值的削减就象征整人体模型型变得复杂,轻松发生过拟合。
    • 万1选取较大的 k
      值,就一定于用较大的邻域中的练习实例举行预测。其优点是足以减掉学习的估价固有误差。但缺点是上学的切近标称误差会附加。这时与输入实例较远的(不1般的)磨练实例也会对预测起效能,使预测发生错误。
      k 值的叠加就表示全部的模子变得轻便。
    • 接近截断误差和估摸相对误差,请看那里:https://www.zhihu.com/question/60793482
  • 相差衡量

    • 特点空间中七个实例点的距离是多个实例点相似程度的显示。
    • k 近邻模型的特征空间1般是 n 维实数向量空间
      lehu娱乐手机平台网站 9
      。使用的距离是欧氏距离,但也足以是其余距离,如更相像的lehu娱乐手机平台网站 10
      距离,或者 Minkowski 距离。
  • 分拣核定规则

    • k 近邻算法中的分类核定规则往往是超越肆陆%核定,即由输入实例的 k
      个临近的教练实例中的好些个类决定输入实例的类。
You can leave a response, or trackback from your own site.

Leave a Reply

网站地图xml地图