美文网首页web服务器
数据科学(k-近邻算法判定约会网站配对效果 )

数据科学(k-近邻算法判定约会网站配对效果 )

作者: GHope | 来源:发表于2018-11-23 11:14 被阅读116次

    k-近邻算法的一般流程:
    收集数据:可以使用爬虫进行数据的收集,也可以使用第三方提供的免费或收费的数据。一般来讲,数据放在txt文本文件中,按照一定的格式进行存储,便于解析及处理。
    准备数据:使用Python解析、预处理数据。
    分析数据:可以使用很多方法对数据进行分析,例如使用Matplotlib将数据可视化。
    测试算法:计算错误率。
    使用算法:错误率在可接受范围内,就可以运行k-近邻算法进行分类。

    海伦女士一直使用在线约会网站寻找适合自己的约会对象

    她发现自己交往过的人可以进行如下分类:
    不喜欢的人
    魅力一般的人
    极具魅力的人

    海伦收集约会数据存放在文本文件datingTestSet.txt

    样本数据主要包含以下3种特征:
    每年获得的飞行常客里程数
    玩视频游戏所消耗时间百分比
    每周消费的冰淇淋淋公升数

    import numpy as np 
    """ 
    函数说明:打开并解析文件,对数据进行分类:
    1代表不喜欢,2代表魅力一般,3代表极具魅力
    Parameters:
        filename - 文件名 
    Returns:
        returnMat - 特征矩阵
        classLabelVector - 分类Label向量
    """ 
    def file2matrix(filename):
        # 打开文件
        fr = open(filename)
        #读取⽂文件所有内容
        arrayOLines = fr.readlines()
        #得到文件行数
        numberOfLines = len(arrayOLines)
        #返回的NumPy矩阵,解析完成的数据:numberOfLines行,3列
        returnMat = np.zeros((numberOfLines,3))
        #返回的分类标签向量
        classLabelVector = []
        #行的索引值
        index = 0 
        for line in arrayOLines:
            #s.strip(rm),当rm空时,默认删除空白符(包括'\n','\r','\t',' ')
            line = line.strip()
            #使用s.split(str="",num=string,cout(str))将字符串根据'\t'分隔符进行切片。
            listFromLine = line.split('\t')
            #将数据前三列提取出来,存放到returnMat的NumPy矩阵中,也就是特征矩阵
            returnMat[index,:] = listFromLine[0:3]
            #根据文本中标记的喜欢的程度进行分类,1代表不喜欢,2代表魅力一般,3代表极具魅力
            if listFromLine[-1] == 'didntLike':
                classLabelVector.append(1)
            elif listFromLine[-1] == 'smallDoses':
                classLabelVector.append(2)
            elif listFromLine[-1] == 'largeDoses':
                classLabelVector.append(3)
            index += 1
        return returnMat, classLabelVector
    
    #打开的文件名
    filename = 'examples/knn/datingTestSet.txt' 
    #打开并处理数据 
    datingDataMat, datingLabels = file2matrix(filename) 
    print(datingDataMat) 
    print(datingLabels)
    
    打开并处理数据输出处理结果验证代码

    分析数据:数据可视化

    import matplotlib.lines as mlines 
    import matplotlib.pyplot as plt 
    """ 
    函数说明:可视化数据
    Parameters:
        datingDataMat - 特征矩阵
        datingLabels - 分类Label 
    Returns:
        无 
    """
    def showdatas(datingDataMat, datingLabels):
        #当nrow=2,nclos=2时,代表fig画布被分为四个区域,axs[0][0]表示第一行第一个区域
        fig, axs = plt.subplots(nrows=2, ncols=2,sharex=False, sharey=False, figsize=(13,8))
        numberOfLabels = len(datingLabels)
        LabelsColors = []
        for i in datingLabels:
            if i == 1:
                LabelsColors.append('black')
            if i == 2:
                LabelsColors.append('orange')
            if i == 3:
                LabelsColors.append('red')
        #画出散点图,以datingDataMat矩阵的第一(飞行常客例程)、第二列(玩游戏)数据画散点数据,散点大小为15,透明度为0.5
        axs[0][0].scatter(x=datingDataMat[:,0], y=datingDataMat[:,1], color=LabelsColors,s=15, alpha=.5)
        #设置标题,x轴label,y轴label
        axs0_title_text = axs[0][0].set_title('plane vs game')
        axs0_xlabel_text = axs[0][0].set_xlabel('plane')
        axs0_ylabel_text = axs[0][0].set_ylabel(u'game')
        plt.setp(axs0_title_text, size=9, weight='bold', color='red')
        plt.setp(axs0_xlabel_text, size=7, weight='bold', color='black')
        plt.setp(axs0_ylabel_text, size=7, weight='bold', color='black')
        #画出散点图,以datingDataMat矩阵的第一(飞行常客例程)、第三列(冰激凌)数据画散点数据,散点大小为15,透明度为0.5
        axs[0][1].scatter(x=datingDataMat[:,0], y=datingDataMat[:,2], color=LabelsColors,s=15, alpha=.5)
        #设置标题,x轴label,y轴label
        axs1_title_text = axs[0][1].set_title('plane vs ice cream')
        axs1_xlabel_text = axs[0][1].set_xlabel(u'plane')
        axs1_ylabel_text = axs[0][1].set_ylabel(u'ice cream')
        plt.setp(axs1_title_text, size=9, weight='bold', color='red')
        plt.setp(axs1_xlabel_text, size=7, weight='bold', color='black') 
        plt.setp(axs1_ylabel_text, size=7, weight='bold', color='black')
        #画出散点图,以datingDataMat矩阵的第二(玩游戏)、第三列(冰激凌)数据画散点数据,散点大小为 15,透明度为0.5
        axs[1][0].scatter(x=datingDataMat[:,1], y=datingDataMat[:,2], color=LabelsColors,s=15, alpha=.5)
        #设置标题,x轴label,y轴label
        axs2_title_text = axs[1][0].set_title(u'game vs ice cream')
        axs2_xlabel_text = axs[1][0].set_xlabel(u'game')
        axs2_ylabel_text = axs[1][0].set_ylabel(u'ice cream')
        plt.setp(axs2_title_text, size=9, weight='bold', color='red')
        plt.setp(axs2_xlabel_text, size=7, weight='bold', color='black')
        plt.setp(axs2_ylabel_text, size=7, weight='bold', color='black')
        #设置图例
        didntLike = mlines.Line2D([], [], color='black', marker='.',markersize=6, label='didntLike')
        smallDoses = mlines.Line2D([], [], color='orange', marker='.',markersize=6, label='smallDoses')
        largeDoses = mlines.Line2D([], [], color='red', marker='.',markersize=6, label='largeDoses')
        #添加图例
        axs[0][0].legend(handles=[didntLike,smallDoses,largeDoses])
        axs[0][1].legend(handles=[didntLike,smallDoses,largeDoses])
        axs[1][0].legend(handles=[didntLike,smallDoses,largeDoses])
        #显示图片
        plt.show()
    
    画图

    相关文章

      网友评论

      本文标题:数据科学(k-近邻算法判定约会网站配对效果 )

      本文链接:https://www.haomeiwen.com/subject/vyptqqtx.html