• 《机器学习实战》之knn算法


      买了王斌老师翻译的《机器学习实战》一书,里面全是干货,既可以练python,又可以学习机器学习算法知识,挺不错的,学习一些东西这里分享下。

      k-近邻算法(knn),它的核心思想就一句话,如果两个东西各方面属性都很相似,那么这两个东西属于同一类。k的意思是有很多东西和你要判断的东西相似(称作x),

     那么找出和x各方面属性最相似的k个东西,如果这k个东西里面大部分都属于类C,那么x就属于类C。

      好了,来分析一下这个算法需要的数据,首先要判断的东西x,我们称作测试集,我们知道x各种属性的值(后面统称特征),但是不知道x属于哪一类,结果就是求这个。

    还有其他很多东西,我们不仅知道它们的特征,还知道它们属于哪一类,这些东西称作训练集。

        来个书上简单的例子说明下:

        电影名称    打斗镜头    接吻镜头    电影类型

    California Man        3        104      爱情片

    He's Not---         2        100      爱情片

    Beautiful Woman     1        81      爱情片

    x          18        90      ?

    上面这个表大家可以看到电影这个东西有三个特征,电影名称,打斗镜头,接吻镜头,前三个电影我们知道他们的类别,他们属于训练集,后面一个电影x我们只知道他们的特征,不知道类别,怎么用knn来算这个。

    1.算x和其他电影的相似度

    2.找出最相似的k个电影

    3.对这k个电影的类别进行排名,选择类别最多的作为x的类别。

    相似度的计算采用的是欧式距离法,d=((x1-x2)2+(y1-y2)2+(z1-z2)2)1/2,对于一个电影i可以表示成(xi,yi,zi),x,y,z分别表示电影三个特征的值。

    注意:x,y,z的值一般需要缩放至0-1之间,保证每个特征具有相同的权重,newValue=(oldValue-min)/(max-min).

    下面附上一段书上关于knn算法一个小例子:

    '''
    2013.12.26
    《机器学习实战》knn小实例源码学习
    '''
    from numpy import *
    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):
        #shape是array的一个属性,返回矩阵array的各个维度大小
        dataSetSize=dataSet.shape[0]
        #tile函数表示将inX在x轴上重复dataSetSize次,y轴上重复1次
        diffMat=tile(inX,(dataSetSize,1))-dataSet
        #**用于矩阵做幂运算,每个维数值的平方。
        sqDiffMat=diffMat**2
        #sum函数,axis=1,表示将[]里面数相加(列相加),axis=0表示(行相加),axis=None(行列相加)
        sqDistances=sqDiffMat.sum(axis=1)
        #下面这就是距离了,开根号
        distances=sqDistances**0.5
        #返回distances排序的索引,用于下面查找标签
        sortedDistIndicies=distances.argsort()
        classCount={}
        for i in range(k):
            voteIlabel=labels[sortedDistIndicies[i]]
            #统计标签个数
            classCount[voteIlabel]=classCount.get(voteIlabel,0)+1
        #operator 类有意思,可以看看    
        sortedClassCount=sorted(classCount.items(),key=operator.itemgetter(1),reverse=True)
        return sortedClassCount[0][0]
    group,labels=createDataSet()
    print(classify0([0,0],group,labels,3))
    
    '''
    小程序可以发散的知识点:
    1.tile函数理解,可以自己写个简单实现源码
    2.sorted函数帮助文档看懂,实现猜想,理解
    3.operator类应该是操作符重载里面一些东东,可以看看
    学语言最快果然还是看源码,一些功能别人实现的总是简洁些。
    '''

    我用的是python 3.2,低版本可能有些名字需要改一下。

    knn算是一个很简单的机器学习算法,它的假设是各特征彼此相互独立,并且权重相同(各特征都做了归一化,当然你也可以加上权重值)。

    好好学习,天天向上!

  • 相关阅读:
    NOIP初赛篇——02计算机系统的基本结构
    NOIP初赛篇——01计算机常识
    C++语言基础——02数据的存取
    加密时java.security.InvalidKeyException: Illegal key size or default parameters解决办法
    log4j.properties配置文件的内容
    Windows如何关闭占用某一端口的进程
    【JAVA】别特注意,POI中getLastRowNum() 和getLastCellNum()的区别
    【JAVA】POI设置EXCEL单元格格式为文本、小数、百分比、货币、日期、科学计数法和中文大写
    【JAVA】使用Aphache poi操作EXCEL 笔记
    Flex自定义组件、皮肤,并调用
  • 原文地址:https://www.cnblogs.com/huals/p/3493983.html
Copyright © 2020-2023  润新知