zoukankan      html  css  js  c++  java
  • KNN_01

    最简单的KNN分类:即是每个测试数据逐个去减训练集数据,使用的是欧氏距离,然后选取k个距离最小的数据作为邻居,看看这几个邻居属于那种类别最多,就属于哪种类别

    k-近邻算法
    优点:精度高、对异常值不敏感、无数据输入假定。
    缺点:计算复杂度高、空间复杂度高。
    适用数据范围:数值型和标称型。

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

    #!/usr/bin/env python
    # -*- coding: utf-8 -*-
    # @Software: win10 Tensorflow1.13.1 python3.5.6
    
    
    import numpy as np
    import operator
    
    """
    Parameters:
        无
    Returns:
        group - 数据集
        labels - 分类标签
    """
    # 函数说明:创建数据集
    def createDataSet():
        #六组二维特征
        group = np.array([[3,104],[2,100],[1,81],[101,10],[99,5],[98,2]])
        #六组特征的标签
        labels = ['爱情片','爱情片','爱情片','动作片','动作片','动作片']
        return group, labels
    
    """
    Parameters:
        inX - 用于分类的数据(测试集)
        dataSet - 用于训练的数据(训练集)
        labes - 分类标签
        k - kNN算法参数,选择距离最小的k个点
    Returns:
        sortedClassCount[0][0] - 分类结果
    """
    # 函数说明:kNN算法,分类器
    def classify0(inX, dataSet, labels, k):
        #numpy函数shape[0]返回dataSet的行数
        dataSetSize = dataSet.shape[0]
        #在列向量方向上重复inX共1次(横向),行向量方向上重复inX共dataSetSize次(纵向)
        diffMat = np.tile(inX, (dataSetSize, 1)) - dataSet
        #二维特征相减后平方
        sqDiffMat = diffMat**2
        #sum()所有元素相加,sum(0)列相加,sum(1)行相加
        sqDistances = sqDiffMat.sum(axis=1)
        #开方,计算出距离
        distances = sqDistances**0.5
        #返回distances中元素从小到大排序后的索引值
        sortedDistIndices = distances.argsort()
        #定一个记录类别次数的字典
        classCount = {}
        for i in range(k):
            #取出前k个元素的类别
            voteIlabel = labels[sortedDistIndices[i]]
            #dict.get(key,default=None),字典的get()方法,返回指定键的值,如果值不在字典中返回默认值。
            #计算类别次数
            classCount[voteIlabel] = classCount.get(voteIlabel,0) + 1
        #python3中用items()替换python2中的iteritems()
        #key=operator.itemgetter(1)根据字典的值进行排序
        #key=operator.itemgetter(0)根据字典的键进行排序
        #reverse降序排序字典
        sortedClassCount = sorted(classCount.items(),key=operator.itemgetter(1),reverse=True)
        #返回次数最多的类别,即所要分类的类别
        return sortedClassCount[0][0]
    
    if __name__ == '__main__':
        #创建数据集
        group, labels = createDataSet()
        #测试集
        test = [101,20]
        #kNN分类
        test_class = classify0(test, group, labels, 3)
        #打印分类结果
        print(test_class)
  • 相关阅读:
    SimpleCursorAdapter的使用
    sizeof和strlen的区别和联系总结
    设计模式-工厂方法模式
    Python第四章-字典
    Python第四章-字典
    Python第三章-字符串
    Python第三章-字符串
    Python 第二章-列表和元组
    Python 第二章-列表和元组
    设计模式-简单工厂模式
  • 原文地址:https://www.cnblogs.com/cgmcoding/p/13631165.html
Copyright © 2011-2022 走看看