• K-近邻算法(KNN)


    简介

    k近邻算法是数据分类一种常用的算法,属于监督学习算法的一类,它采用不同特征值之的距离进行分类。K近邻算法具有精度高、对异常值不敏感、无数据输入假定的优点,缺点是计算复杂度高、空间复杂度高。适用于数值型和标称型数据的计算分类。

    K近邻算法的一般流程包括:

    1. 收集数据
    2. 准备数据:距离计算所需要的数值,最好是结构化的数据
    3. 分析数据
    4. 训练算法:根据训练样本得到
    5. 测试算法:计算错误率
    6. 使用算法

    Case

    已知四个点,及其对应的分类。我们需要根据已有数据,判别未知点的分类。首先导入数据。

    from numpy import *
    
    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
    

    对未知点类别属性的判别执行以下的步骤

    1. 计算已知类别数据点和当前点之间的距离
    2. 按照距离递增排序
    3. 选取与当前点距离最小的k个点
    4. 确定前k个点所在类别的出现规律
    5. 返回前k个点出现频率最高的类别作为当前点的预测分类

    下面是代码的具体实现

    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 classfiy(inX, dataSet, labels, k):
        # size of the dataSet array
        dataSetSize = dataSet.shape[0]
        <!--得到未知点和已知点的差值-->
        diffMat = tile(inX, (dataSetSize, 1)) - dataSet
        <!--差值平方-->
        sqDiffMat = diffMat ** 2
        <!--未知点和已知点距离的平方和-->
        sqDistances = sqDiffMat.sum(axis=1)
        <!--得到距离差数据-->
        distances = sqDistances ** 0.5
        <!--argsort得到index的sort,index可以关联labels的index-->
        sortedDistanceIndicts = distances.argsort()
        print 
        classCount = {}
    
        for i in range(k):
            voteIlabel = labels[sortedDistanceIndicts[i]]
            classCount[voteIlabel] = classCount.get(voteIlabel, 0) + 1
    
        sortedClassCount = sorted(classCount.iteritems(), key=operator.itemgetter(1), reverse=True)
        return sortedClassCount
    
    
    data_set = createDataSet()
    
    result = classfiy([0, 0], data_set[0], data_set[1], 3)
    <!--返回的结果是B-->
    print result
    
  • 相关阅读:
    IOS笔记-C语言中的字符串数组 指针
    IOS笔记-C语言中的指针与数组
    Entity Framework 知识点总结
    提升代码内外部质量的22条经验(转载)
    WPF 第一个创建的窗体会作为Application.Current.MainWindow
    重构的十个小技巧(转)
    WPF DataGrid自定义分页控件_实现下拉刷新数据
    使用qt生成安卓android运用
    关于开发省流量手机游戏的一些建议
    c++ com 在c#项目里面使用简单例子
  • 原文地址:https://www.cnblogs.com/jun-ma/p/5249154.html
Copyright © 2020-2023  润新知