资源简介

机器学习实战之02-k近邻算法全部源代码+测试数据+详细注释

资源截图

代码片段和文件信息

#coding=UTF8
from numpy import *
import operator

def createDataSet():
    “““
    函数作用:构建一组训练数据(训练样本),共4个样本
    同时给出了这4个样本的标签,及labels
    “““
    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):
    “““
    inX 是输入的测试样本,是一个[x y]样式的
    dataset 是训练样本集
    labels 是训练样本标签
    k 是top k最相近的
    “““
    # shape返回矩阵的[行数,列数],
    # 那么shape[0]获取数据集的行数,
    # 行数就是样本的数量
    dataSetSize = dataset.shape[0] 
    
    “““
    下面的求距离过程就是按照欧氏距离的公式计算的。
    即 根号(x^2+y^2)
    “““
    # tile属于numpy模块下边的函数
    # tile(A reps)返回一个shape=reps的矩阵,矩阵的每个元素是A
    # 比如 A=[012] 那么,tile(A 2)= [0 1 2 0 1 2]
    # tile(A(22)) = [[0 1 2 0 1 2]
    #                  [0 1 2 0 1 2]]
    # tile(A(212)) = [[[0 1 2 0 1 2]]
    #                    [[0 1 2 0 1 2]]] 
    # 上边那个结果的分开理解就是:
    # 最外层是2个元素,即最外边的[]中包含2个元素,类似于[CD]而此处的C=D,因为是复制出来的
    # 然后C包含1个元素,即C=[E]同理D=[E]
    # 最后E包含2个元素,即E=[FG]此处F=G,因为是复制出来的
    # F就是A了,基础元素
    # 综合起来就是(212)= [C C] = [[E] [E]] = [[[F F]] [[F F]]] = [[[A A]] [[A A]]]
    # 这个地方就是为了把输入的测试样本扩展为和dataset的shape一样,然后就可以直接做矩阵减法了。
    # 比如,dataset有4个样本,就是4*2的矩阵,输入测试样本肯定是一个了,就是1*2,为了计算输入样本与训练样本的距离
    # 那么,需要对这个数据进行作差。这是一次比较,因为训练样本有n个,那么就要进行n次比较;
    # 为了方便计算,把输入样本复制n次,然后直接与训练样本作矩阵差运算,就可以一次性比较了n个样本。
    # 比如inX = [01]dataset就用函数返回的结果,那么
    # tile(inX (41))= [[ 0.0 1.0]
    #                    [ 0.0 1.0]
    #                    [ 0.0 1.0]
    #                    [ 0.0 1.0]]
    # 作差之后
    # diffMat = [[-1.0-0.1]
    #            [-1.0 0.0]
    #            [ 0.0 1.0]
    #            [ 0.0 0.9]]
    diffMat = tile(inX (dataSetSize 1)) - dataset
    
    # diffMat就是输入样本与每个训练样本的差值,然后对其每个x和y的差值进行平方运算。
    # diffMat是一个矩阵,矩阵**2表示对矩阵中的每个元素进行**2操作,即平方。
    # sqDiffMat = [[1.0 0.01]
    #              [1.0 0.0 ]
    #              [0.0 1.0 ]
    #              [0.0 0.81]]
    sqDiffMat = diffMat ** 2
    
    # axis=1表示按照横轴,sum表示累加,即按照行进行累加。
    # sqDistance = [[1.01]
    #               [1.0 ]
    #               [1.0 ]
    #               [0.81]]
    sqDistance = sqDiffMat.sum(axis=1)
    
    # 对平方和进行开根号
    distance = sqDistance ** 0.5
    
    # 按照升序进行快速排序,返回的是原数组的下标。
    # 比如,x = [30 10 20 40]
    # 升序排序后应该是[10203040]他们的原下标是[1203]
    # 那么,numpy.argsort(x) = [1 2 0 3]
    sortedDistIndicies = distance.argsort()
    
    # 存放最终的分类结果及相应的结果投票数
    classCount = {}
    
    # 投票过程,就是统计前k个最近的样本所属类别包含的样本个数
    for i in range(k):
        # index = sortedDistIndicies[i]是第i个最相近的样本下标
        # voteIlabel = labels[index]是样本index对应的分类结果(‘A‘ or ‘B‘)
        voteIlabel = labels[sortedDistIndicies[i]]
        # classCount.get(voteIlabel 0)返回voteIlabel的值,如果不存在,则返回0
        # 然后将票数增1
        classCount[voteIlabel] = classCount.get(voteIlabel

 属性            大小     日期    时间   名称
----------- ---------  ---------- -----  ----

    I.A....      4791  2015-11-07 16:17  chapter2\2.1最简单的分类器\simple kNN.py

    I.A....     35725  2012-03-01 15:40  chapter2\2.2改进kNN分类约会网站\datingTestSet.txt

    I.A....     27067  2012-03-01 15:39  chapter2\2.2改进kNN分类约会网站\datingTestSet2.txt

    I.A....      7151  2015-11-07 16:47  chapter2\2.2改进kNN分类约会网站\kNN_improve.py

    I.A....      8325  2015-11-07 17:09  chapter2\2.3手写数字识别\kNN.py

    I.A....      1088  2010-10-07 21:35  chapter2\2.3手写数字识别\testDigits\0_0.txt

    I.A....      1088  2010-10-07 21:35  chapter2\2.3手写数字识别\testDigits\0_1.txt

    I.A....      1088  2010-10-07 21:35  chapter2\2.3手写数字识别\testDigits\0_10.txt

    I.A....      1088  2010-10-07 21:35  chapter2\2.3手写数字识别\testDigits\0_11.txt

    I.A....      1088  2010-10-07 21:35  chapter2\2.3手写数字识别\testDigits\0_12.txt

    I.A....      1088  2010-10-07 21:35  chapter2\2.3手写数字识别\testDigits\0_13.txt

    I.A....      1088  2010-10-07 21:35  chapter2\2.3手写数字识别\testDigits\0_14.txt

    I.A....      1088  2010-10-07 21:35  chapter2\2.3手写数字识别\testDigits\0_15.txt

    I.A....      1088  2010-10-07 21:35  chapter2\2.3手写数字识别\testDigits\0_16.txt

    I.A....      1088  2010-10-07 21:35  chapter2\2.3手写数字识别\testDigits\0_17.txt

    I.A....      1088  2010-10-07 21:35  chapter2\2.3手写数字识别\testDigits\0_18.txt

    I.A....      1088  2010-10-07 21:35  chapter2\2.3手写数字识别\testDigits\0_19.txt

    I.A....      1088  2010-10-07 21:35  chapter2\2.3手写数字识别\testDigits\0_2.txt

    I.A....      1088  2010-10-07 21:35  chapter2\2.3手写数字识别\testDigits\0_20.txt

    I.A....      1088  2010-10-07 21:35  chapter2\2.3手写数字识别\testDigits\0_21.txt

    I.A....      1088  2010-10-07 21:35  chapter2\2.3手写数字识别\testDigits\0_22.txt

    I.A....      1088  2010-10-07 21:35  chapter2\2.3手写数字识别\testDigits\0_23.txt

    I.A....      1088  2010-10-07 21:35  chapter2\2.3手写数字识别\testDigits\0_24.txt

    I.A....      1088  2010-10-07 21:35  chapter2\2.3手写数字识别\testDigits\0_25.txt

    I.A....      1088  2010-10-07 21:35  chapter2\2.3手写数字识别\testDigits\0_26.txt

    I.A....      1088  2010-10-07 21:35  chapter2\2.3手写数字识别\testDigits\0_27.txt

    I.A....      1088  2010-10-07 21:35  chapter2\2.3手写数字识别\testDigits\0_28.txt

    I.A....      1088  2010-10-07 21:35  chapter2\2.3手写数字识别\testDigits\0_29.txt

    I.A....      1088  2010-10-07 21:35  chapter2\2.3手写数字识别\testDigits\0_3.txt

    I.A....      1088  2010-10-07 21:35  chapter2\2.3手写数字识别\testDigits\0_30.txt

............此处省略2864个文件信息

评论

共有 条评论