zoukankan      html  css  js  c++  java
  • 机器学习01-kNN邻近算法

    k-近邻算法

    概述:k-近邻算法採用測量不同特征值之间的距离方法进行分类
    长处:精度高、对于异常值不敏感。无数据输入假定
    缺点:计算复杂度高,空间复杂度高,而且它没有办法各处基础数据的一些内部信息数据。
    算法描写叙述:存在一个准确的数据集合样本。称作训练样本集,样本集合中每一个item都附带自己所属分类标签。当须要推断新数据的分类是,仅仅须要计算特征数据和样本数据中最类似的分类标签,选择k个最类似的标签,k个标签中占比最多的即为目标标签。

    详细分类算法

        #-*- coding=utf-8 -*-
        from numpy import *
        import operator
    
        ##简单的kNN算法实现
        #dataSet是训练数据集合。每行代表每一个训练数据的每一个特征值
        #labels 相应dataSet每一个训练数据的class标签
        #inX 表示待分类的特征数据
        def classify0(inX, dataSet, labels, k):
            dataSetSize = dataSet.shape[0] # 获取測试集合大小
            #求每一个输入特征值和每一个測试集合总的特征值的超时
            #首先须要使用tile将特征值扩展为和測试集合相等大小的矩阵
            diffMat = tile(inX, (dataSetSize, 1)) - dataSet
            #取平方
            sqlDiffMat = diffMat ** 2
            sumMat = sqlDiffMat.sum(axis=1)
            distances = sumMat ** 0.5
            #获取排序信息
            #比如:array([9,1,3,0]) -> array([3,1,2,0]) 升序标签
            sortIndicies = distances.argsort()
    
            classCount = {}
            #取距离最小的前k个相应的标签统计信息
            for i in range(k):
                label = labels[sortIndicies[i]]
                classCount[label] = classCount.get(label,0) + 1
    
            #取最大的
    
            sortedClassCount = sorted(classCount.iteritems(), key = operator.itemgetter(1), reverse=True) 
            return sortedClassCount[0][0]
    
    

    关于特征数据

    不同的特征,详细的数据值波动区间是不同的,比如特征A取值范围在[1000,10000],可是特征B取值范围在[0,10],假设直接使用这种特征数据进行KNN算法运算。会出现的一个问题,高区间的特征对结果的影响远远大于低区间的特征值,因此我们须要对我们的特征数据做归一化处理,即将全部特征值处理到同样的区间范围中。


    详细算法:((特征值-min)/(max - min)) -> [0,1]区间范围

        from numpy import *
        import operator
        #用于将一个不同范围域的特征值归一化到统一的[0,1]之间
        def normData(dataSet):
            #获取每一个特征的最大值
            maxValue = dataSet.max(0)
            #获取每一个特征的最小值
            minValue = dataSet.min(0)
            ranges=maxValue-minValue
            #将数据归一到同一个范围
            normalDataSet = zeros(shape(dataSet))
            m = dataSet.shape[0]
            normalDataSet = dataSet - tile(ranges,(m,1))
            #除于最大值
            normalDataSet = normalDataSet/tile(maxValue,(m,1))
    
            return normalDataSet, ranges, minValues

    关于可视化特征数据

    怎样判别我们取得的特征数据集合适合使用knn进行分类训练?
    在做数据观察时我们往往须要通过可视化方式去观察我们的特征数据和label的分布,这个时候就须要用到Python的一个图形工具matplotlib。
    特征和分类数据:testSet.txt
    3.542485 1.977398 -1
    3.018896 2.556416 -1
    7.551510 -1.580030 1
    2.114999 -0.004466 -1
    8.127113 1.274372 1
    7.108772 -0.986906 1
    8.610639 2.046708 1
    2.326297 0.265213 -1
    3.634009 1.730537 -1
    0.341367 -0.894998 -1
    3.125951 0.293251 -1
    2.123252 -0.783563 -1
    0.887835 -2.797792 -1
    7.139979 -2.329896 1
    1.696414 -1.212496 -1
    8.117032 0.623493 1
    8.497162 -0.266649 1
    4.658191 3.507396 -1
    8.197181 1.545132 1
    1.208047 0.213100 -1
    1.928486 -0.321870 -1
    2.175808 -0.014527 -1
    7.886608 0.461755 1
    3.223038 -0.552392 -1
    3.628502 2.190585 -1
    7.407860 -0.121961 1
    7.286357 0.251077 1

    可视化脚本:

    
    from numpy import *
    import matplotlib
    import matplotlib.pyplot as plt
    
    ##read file
    fr = open('testSet.txt')
    lines = fr.readlines()
    dataSet = zeros((len(lines),1))
    labels = []
    index = 0
    for line in lines:
        items = line.strip().split('	')
        dataSet[index:] = items[0:2]
        labels.append(items[-1])
    #matplot
    fx = plt.figure()
    ax = fx.add_subplot(111)
    #将数组转换为矩阵
    dataSet = matrix(dataSet)
    colora = tile(50, len(lines))
    #这里的colora是为了通过颜色区分不同的labels, cmap代表颜色map,默认是yard, s是每一个点的大小,alpha是每一个点的透明度
    ax.scatter(dataSet[:,0], dataSet[:,1], c=colora * labels, cmap='autum', s=50, alpha=0.3)
    
    plt.show()
  • 相关阅读:
    Android之判断某个服务是否正在运行的方法
    Service完全解析(转)
    详解Android动画之Frame Animation(转)
    android SDK 快速更新配置(转)
    浅析Android中的消息机制(转)
    android中handler用法总结
    InputStream重用技巧(利用ByteArrayOutputStream)
    IntelliJ IDEA使用总结篇
    JDK,JRE,JVM区别与联系-理解与概括
    Egret IDE中搜索,过滤文件,只搜索.ts
  • 原文地址:https://www.cnblogs.com/zhchoutai/p/8289329.html
Copyright © 2011-2022 走看看