• 使用k-近邻算法改进约会网站的配对效果


    实行步骤

    1)收集数据

    将1000个数据样本存放在文本文件datingTestSet2.txt中,每个样本数据占一行。样本主要包含以下三种特征:

    1.每年获得的飞行常客里程数

    2.玩视频游戏所耗时间百分比

    3.每周消费的冰淇淋公升数

    2)准备数据

    使用python解析文本文件

    3)分析数据

    使用Matplotlib创建散点图,使用之前要确保Matplotlib已安装(确认方法:打开Anaconda prompt,输入命令pip list,然后查看是否有matplotlib)

    image-20200402013252978.png

    4)测试算法

    5)使用算法

    产生简单的命令行程序


    代码模块及功能展示

    #将测试的文本数据格式转换为分类器接受的格式
    def file2matrix(filename):
        fr = open(filename)
        arrayOfLines = fr.readlines()   #读取文件的每一行
        numberOfLines = len(arrayOfLines) #获得文件行数
        returnMat = numpy.zeros((numberOfLines, 3))   #生成一个行为numberofLines,列为3的零矩阵
        classLabelVector = []
        index = 0
        for line in arrayOfLines:
            line = line.strip() #去除首尾空格和回车
            listFromLine = line.split() #按照tab键分割数据
            returnMat[index,:] = listFromLine[0:3]   #前三个数据由returnMat存储
            classLabelVector.append(int(listFromLine[-1]))    #最后一个数据由classLabelVector存储
            index += 1
        return  returnMat,classLabelVector
    
    def autoNorm(dataSet):
        """
        归一化模块
       :param dataSet: 需要归一化的数据集
       :return: 归一化的数据集,最大与最小值的差值,最小值
       """
        minVals = dataSet.min(0)      #得到最小那行数据
        maxVals = dataSet.max(0)      #得到最小那行数据
        ranges = maxVals-minVals      #取最大最小的差值
        normDataset = numpy.zeros(dataSet.shape)    #定义一个和dataSet一样大的零矩阵
        m = dataSet.shape[0]       #m为dataset的形状,shape[0]为列值
        normDataSet = dataSet - numpy.tile(minVals,(m,1))     #tile(A,b)是将数组A重复b次
        normDataSet = normDataSet/numpy.tile(ranges,(m,1))   #numDataSet为归一化后的值
        return normDataSet,ranges,minVals
    
    
    #测试模块
    def datingClassTest():
        hoRatio = 0.10
        datingDataMat,datingLabels = file2matrix('datingTestSet2.txt')
        normMat,ranges,minVals = autoNorm(datingDataMat)  #normMat为归一化之后的值
        m = normMat.shape[0]         # m为norMat的行数
        numTestVecs = int(m*hoRatio)    #0.10*行数,就是拿1/10的数据去测试
        errorCount = 0.0    #用于存储错误率
        for i in range(numTestVecs):
            classifierResult = classify0(normMat[i,:],normMat[numTestVecs:m,:]
                                         ,datingLabels[numTestVecs:m],3)
            #将除去测试数据集的数据集作为训练集合
            print("the classifier came back with: %d, the real answer is: %d"
                  % (classifierResult,datingLabels[i]))
            if(classifierResult != datingLabels[i]): errorCount +=1.0
        print( "the total error rate is: %f" % (errorCount/float(numTestVecs)))
    
    #为海伦打造的简单的可运行程序函数(约会网站预测函数)
    def classifyperson():
        resultList = ['not at all','in small doses','in large doses']
        percentTats = float(input(
           "percentage of time spent playing video games?" ))
        ffMiles = float(input("frequent flier miles earned per year?"))
        iceCream = float(input("liters of ice cream consumed per year?"))
        datingDataMat,datingLabels = file2matrix('datingTestSet2.txt')
        normMat,ranges,minVals = autoNorm(datingDataMat)
        inArr = numpy.array([ffMiles,percentTats,iceCream])
        classifierResult = classify0((inArr-minVals)/ranges,normMat,datingLabels,3)
        print("You will probably like this person: ",resultList[classifierResult - 1])
    

    运行结果分析

    数据处理

    在python命令窗输入

    import KNN
    
    datingDataMat,datingLabels = KNN.file2matrix('datingTestSet2.txt')
    
    datingDataMat
    
    datingLabels[0:20]
    

    image-20200402015647632.png

    成功导入数据,并简单的查看一下数据内容。

    Matplotlib创建散点图

    命令框中输入代码:

    import matplotlib
    
    import matplotlib.pyplot as plt
    
    fig = plt.figure()
    
    ax = fig.add_subplot(111)
    
    import numpy
    
    ax.scatter(datingDataMat[:,0],datingDataMat[:,1],15.0*numpy.array(datingLabels), 15.0*numpy.array(datingLabels))
    
    plt.show()
    
    

    即会使用matplotlib库图形化展示数据,展示结果如下:

    image-20200402020054582.png

    归一化特征值

    创建autoNorm()函数,通过公式

    [newValue=(oldValue-min)/(max-min) ]

    将特征值等权重。

    python命令提示符下,执行autoNorm函数,输入如下:

    import KNN
    
    norMat,ranges,MinVals = KNN.autoNorm(datingDataMat)
    
    norMat
    
    MinVals
    
    KNN.datingClassTest()
    

    结果为:

    image-20200402020843084.png

    此函数返回normMat矩阵。

    测试算法

    执行KNN.datingClassTest(),(执行分类器测试程序):

    image-20200402021127759.png

    表示分类器处理约会数据集的错误率是5.0%

    约会网站预测函数

    执行约会预测函数,并按提示输入相应数据:

    image-20200402021451187.png

    系统最终给出这个人的类型: in small doses(一般魅力的人)。

  • 相关阅读:
    设计模式总结
    centos7.5 安装python3.7
    搭建yum软件源
    centos安装gitbook
    编译技术
    samba安装
    docker命令
    shell基础知识
    随笔
    虚拟机字节码执行引擎(三)
  • 原文地址:https://www.cnblogs.com/AJAJAJfighting/p/12620123.html
Copyright © 2020-2023  润新知