2-2节 k-近邻算法-使用 Python 解析文本文件|优化约会网站的配对效果项目|机器学习实战-学习笔记

文章原创,最近更新:2018-08-8

本章节的主要内容是:

重点介绍项目案例1: 优化约会网站的配对效果中的 准备数据:使用 Python 解析文本文件

1.KNN项目案例介绍:

项目案例1:

优化约会网站的配对效果

项目概述:

1)海伦使用约会网站寻找约会对象。经过一段时间之后,她发现曾交往过三种类型的人: 不喜欢的人、魅力一般的人、 极具魅力的人。
2)她希望: 1. 工作日与魅力一般的人约会 2. 周末与极具魅力的人约会 3. 不喜欢的人则直接排除掉。现在她收集到了一些约会网站未曾记录的数据信息,这更有助于匹配对象的归类。

开发流程:
  • 收集数据:提供文本文件
  • 准备数据:使用 Python 解析文本文件
  • 分析数据:使用 Matplotlib 画二维散点图
  • 训练算法:此步骤不适用于 k-近邻算法
  • 测试算法:使用海伦提供的部分数据作为测试样本。
    测试样本和非测试样本的区别在于:测试样本是已经完成分类的数据,如果预测分类与实际类别不同,则标记为一个错误。
  • 使用算法:产生简单的命令行程序,然后海伦可以输入一些特征数据以判断对方是否为自己喜欢的类型。
数据集介绍

海伦把这些约会对象的数据存放在文本文件 datingTestSet2.txt (数据来源于《机器学习实战》第二章 k邻近算法)中,总共有 1000 行。

本文使用的数据主要包含以下三种特征:每年获得的飞行常客里程数,玩视频游戏所耗时间百分比,每周消费的冰淇淋公升数。其中分类结果作为文件的第四列,并且只有3、2、1三种分类值。datingTestSet2.csv文件格式如下所示:

飞行里程数 游戏耗时百分比 冰淇淋公升数 分类结果
40920 8.326976 0.953952 3
14488 7.153469 1.673904 2
26052 1.441871 0.805124 1

数据在datingTestSet2.txt文件中的格式如下所示:


2.准备数据:使用 Python 解析文本文件代码

这段代码主要是准备数据,并将数据转化为numpy解析程序

def file2matrix(filename):
    """
    导入训练数据
    filename: 数据文件路径
    return: 数据矩阵returnMat和对应的类别classLabelVector
    """
    # 打开文件
    fr=open(filename)
    # 读取每一行的信息
    array0Lines=fr.readlines()
    # 获得文件中的数据行的行数
    numberofLines=len(array0Lines)
    # 生成numberofLines行3列的零矩阵,这3列都是用来存放特征信息
    returnMat=np.zeros((numberofLines,3))
    # 存放类别是列表
    classLabelVector=[]
    index=0
    for line in array0Lines:
        # 去掉回车制表符,生成新的字符串
        line=line.strip()
        # 通过split以\t切割字符串,返回元素列表
        listFromLine=line.split('\t')
        # 选取前三个数据的特征值放进矩阵
        returnMat[index,:]=listFromLine[0:3]
        # 将listFromLine列表中的最后一列元素存储到classLabelVector
        # 这列的数据是类别数据
        classLabelVector.append(int(listFromLine[-1]))
        # 更新index
        index +=1
    #返回特征矩阵returnMat和类别矩阵classLabelVector
    return returnMat,classLabelVector

测试代码及其结果如下:

import kNN
kNN.file2matrix('datingTestSet2.txt')

datingDataMat
Out[46]: 
array([[  4.09200000e+04,   8.32697600e+00,   9.53952000e-01],
       [  1.44880000e+04,   7.15346900e+00,   1.67390400e+00],
       [  2.60520000e+04,   1.44187100e+00,   8.05124000e-01],
       ..., 
       [  2.65750000e+04,   1.06501020e+01,   8.66627000e-01],
       [  4.81110000e+04,   9.13452800e+00,   7.28045000e-01],
       [  4.37570000e+04,   7.88260100e+00,   1.33244600e+00]])

3.相关知识点

知识点1:文件的打开、路径、打开模式、关闭

文件的打开,如下:


文件路径,如下:

打开模式,如下:


文件关闭,如下:

综合案例,如下:

知识点2:文件内容的读取


知识点3:python中numpy.zeros(np.zeros)的使用方法

zeros(shape, dtype=float, order='C')

  • 返回:返回来一个给定形状和类型的用0填充的数组;
  • 参数:shape:形状
  • dtype:数据类型,可选参数,默认numpy.float64
np.zeros(5)
Out[35]: array([ 0.,  0.,  0.,  0.,  0.])

np.zeros((5,),dtype=int)
Out[37]: array([0, 0, 0, 0, 0])

np.zeros((2,1))
Out[38]: 
array([[ 0.],
       [ 0.]])

s=(2,2)

np.zeros(s)
Out[40]: 
array([[ 0.,  0.],
       [ 0.,  0.]])

知识点4:Python3 字符串的strip()方法

Python strip() 方法用于移除字符串头尾指定的字符(默认为空格)或字符序列。
注意:

  • 该方法只能删除开头或是结尾的字符,不能删除中间部分的字符。
  • strip() 处理的时候,如果不带参数,默认是清除两边的空白符,例如:/n, /r, /t, ' ')。

strip()方法语法:

str.strip([chars]);
  • 参数:chars -- 移除字符串头尾指定的字符序列。
  • 返回值:返回移除字符串头尾指定的字符序列生成的新字符串。

而这里的代码有导入数据的时候,每行末尾都有\n



故使用如下代码:

line=line.strip()

小案例如下:

addr = '123@163.com'

addr1 = addr.strip('12')#案例1

addr1
Out[43]: '3@163.com'

addr2 = addr.strip('23')#案例2

addr2
Out[45]: '123@163.com'

解析:
strip() 带有参数的时候,这个参数可以理解一个要删除的字符的列表,是否会删除的前提是从字符串最开头和最结尾是不是包含要删除的字符,如果有就会继续处理,没有的话是不会删除中间的字符的。

  • 案例1:1 在字符串的左边第一个,所以删除了继续判断,2 也存在,所以也删除。
  • 案例2:要删除的字符列表不包含第一个字符,时 2 不是第一个字符,所以无法继续。

知识点5:Python3 字符串的split()方法

split()通过指定分隔符对字符串进行切片,如果参数num 有指定值,则仅分隔 num 个子字符串。

split()方法语法:

str.split(str="", num=string.count(str))
  • 参数:
    • str -- 分隔符,默认为所有的空字符,包括空格、换行(\n)、制表符(\t)等。
    • num -- 分割次数。
  • 返回值:返回分割后的字符串列表。

小案例如下:

str = "this is string example....wow!!!"
print (str.split( ))
print (str.split('i',1))
print (str.split('w'))

输出结果如下:

['this', 'is', 'string', 'example....wow!!!']
['th', 's is string example....wow!!!']
['this is string example....', 'o', '!!!']

而这里的代码有导入数据的时候,每行都有\t



故使用如下代码:

listFromLine=line.split('\t')

知识点6:Python3 List append()方法

append() 方法用于在列表末尾添加新的对象。

append()方法语法:

list.append(obj)
  • 参数:obj -- 添加到列表末尾的对象。
  • 返回值:该方法无返回值,但是会修改原来的列表。

小案例如下:

list1 = ['Google', 'Runoob', 'Taobao']
list1.append('Baidu')
print ("更新后的列表 : ", list1)

输出结果如下:

更新后的列表 :  ['Google', 'Runoob', 'Taobao', 'Baidu']
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 205,132评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,802评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,566评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,858评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,867评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,695评论 1 282
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,064评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,705评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,915评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,677评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,796评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,432评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,041评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,992评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,223评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,185评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,535评论 2 343

推荐阅读更多精彩内容

  • 官网 中文版本 好的网站 Content-type: text/htmlBASH Section: User ...
    不排版阅读 4,365评论 0 5
  • Lua 5.1 参考手册 by Roberto Ierusalimschy, Luiz Henrique de F...
    苏黎九歌阅读 13,733评论 0 38
  • 2017.2.23 你需要给出努力,为了自己的梦想进行付出,许多光在路上,就这样且且前行,不断索取,最终获得,必然...
    kisslight阅读 705评论 0 0
  • 似乎很多时候我们据理力争的,并不是我们真正想要的,只不过是内心的感情偏移罢了。 中学时代的我们,会因为一道题的不同...
    姜郁桐阅读 6,046评论 6 22
  • 小儿推拿在中国已有数千年的历史,从远古时代起,推拿按摩就是我国人民防治疾病的方法之一,小儿推拿具有悠久的历史,为小...
    麦子育儿说阅读 935评论 1 1