为了账号安全,请及时绑定邮箱和手机立即绑定

自然语言处理入门课程与实战

导读:随着人工智能的快速发展,自然语言处理和机器学习应用愈加广泛。但是对于初学者入门还是有一定难度,对于该领域整体概况不能明晰。本章主要从发展历程、研究现状、应用前景等角度整体介绍自然语言处理和机器学习,让读者对该技术领域有个系统而全面的认识。最后,结合一个模拟案例,阐述如何学习自然语言处理这门课程。


快速了解自然语言处理

自然语言

我们要对自然语言进行理解,其实就是我们日常使用的语言(书面文字和语音视频等)。简言之,汉语、日语、韩语、英语、法语等语言都属于此范畴。而自然语言处理是对自然语言处理的一种技术,就是通过我们的语音文字与计算机进行通信,我们称之为“人机交互”。

自然语言处理(英语:Natural Language Processing,简称NLP)是人工智能和语言学领域的分支学科。此领域探讨如何处理及运用自然语言;自然语言认知则是指让电脑“懂”人类的语言。自然语言生成系统把计算机数据转化为自然语言。自然语言理解系统把自然语言转化为计算机程序更易于处理的形式。

自然语言处理发展历史和背景

自然语言处理发展背景

自然语言处理相关研究,最早是从机器翻译系统的研究开始的。20世纪60年代,国外对机器翻译曾有大规模的研究工作,投入了大量的人力物力财力。但是,受的客观历史因素的限制,当时人们低估了自然语言的复杂性,语言处理的理论和技术均不成热,所以进展并不大。其主要的做法是存储两种语言的单词、短语对应译法的大辞典,翻译时一一对应,技术上只是调整语言的同条顺序。但日常生活中语言的翻译远不是如此简单,很多时候还要参考某句话前后的意思。

我国机器翻译的起步较晚,是继美国、前苏联、英国之后世界上第四个开展机器翻译研究的国家。早在20世纪50年代机器翻译就被列入我国科学研究的发展规划。一些研究人员还进行了俄汉机器翻译实验,取得了一定的研究成果,但60年代的有关研究很快因“文革”而完全停顿。我国机器翻译研究的全面展开始于80年代中期以后,特别是90年代以来,一批机器翻译系统相继问世,其中影响力较大的有:中软总公司开发的汉英-汉日翻译系统(1993);中科院计算所研制的IMTEC英汉翻译系统(1992)等。

自然语言处理发展历史

  • 1948年,香农(Shannon)把离散马尔可夫过程的概率模型应用于描述语言的自动机;同时又把“熵” (entropy)的概念引用到语言处理中。而克莱尼(Kleene)在同一时期研究了有限自动机和正则表达式。

  • 1956年,乔姆斯基(Chomsky)又提出了上下文无关语法。这些工作导致了基于规则和基于概率两种不同的自然语言处理方法的诞生,使得该领域的研究分成了采用规则方法的符号派和采用概率方法的随机派两大阵营,进而引发了数十年有关这两种方法孰优孰劣的争执 。同年,人工智能诞生以后,自然语言处理迅速融入了人工智能的研究中。随机派学者在这一时期利用贝叶斯方法等统计学原理取得了一定的进步;而以乔姆斯基为代表的符号派也进行了形式语言理论生成句法和形式逻辑系统的研究。由于这一时期, 多数学者注重研究推理和逻辑问题,只有少数学者在研究统计方法和神经网络,所以 ,符号派的势头明显强于随机派的势头。

  • 1967 年美国心理学家 奈瑟尔(Neisser)提出了认知心理学, 从而把自然语言处理与人类的认知联系起来。

  • 70年代初,由于自然语言处理研究中的一些问题未能在短时间内得到解决,而新的问题又不断地涌现,许多人因此丧失了信心,自然语言处理的研究进入了低谷时期。尽管如此,一些发达国家的学者依旧地研究着。基于隐马尔可夫模型 (Hidden Markov Model,HMM)的统计方法和话语分析 (Discourse Analysis)在这一时期取得了重大进展 。

  • 80年代, 在人们对于过去的工作反思之后 , 有限状态模型和经验主义的研究方法开始复苏 。

  • 90年代以后,随着计算机的速度和存储量大幅增加,自然语言处理的物质基础大幅改善,语音和语言处理的商品化开发成为可能;同时,网络技术的发展和Internet商业化使得基于自然语言的信息检索和信息抽取的需求变得更加突出。然语言处理的应用面不再局限于机器翻译、语音控制等早期研究领域了。

  • 从90年代末到21世纪初 ,人们逐渐认识到,仅用基于规则的方法或仅用基于统计的方法都是无法成功进行自然语言处理的。基于统计、基于实例和基于规则的语料库技术在这一时期开始蓬勃发展, 各种处理技术开始融合,自然语言处理的研究又开始兴旺起来。

思考?

基于规则的方法和基于统计的方法孰优孰劣?

自然语言处理涉及的学科领域

  • 语言学
  • 计算机科学(提供模型表示、算法设计、计算机实现)
  • 数学(数学模型)
  • 心理学(人类言语心理模型和理论)
  • 哲学(提供人类思维和语言的更深层次理论)
  • 统计学(提供样本数据的预测统计技术)
  • 电子工程(信息论基础和语言信号处理技术)
  • 生物学(人类言语行为机制理论)。

自然语言处理技术体系

![](https://i.imgur.com/BRZKLYB.png)

自然语言处理就业与发展前景

招聘网站:

![](https://i.imgur.com/jA843mB.png)

发展前景

思考:如何学习自然语言处理的问题?

- 综述了解,整体技术框架掌握
- 侧重方向,多看论文和会议文章
- 知其原理,重在实际应用
- 归纳总结,提高研究效率
- 资料检索,高效学习效率

基础知识介绍

NLP与数学

线性数学

自然语言处理是以计算机科学、统计学、数学和信息论等多个领域交叉的学科。线性代数又是数学的一个重要分支,对自然语言处理有着很直接的影响。诸如:算法建模、参数设置、验证策略、识别欠拟合和过拟合等等。读者往往知道线性代数很有用,常常全书通读。造成时间不足和效率较低。归因于对线性代数在机器学习中的重点和用途不明。本章主要以简明的方式介绍最常用的线性代数知识,并使读者知道线性代数常用于哪些方面。

概率论

由于基于规则方法向基于统计方法的转型,概率就显得尤为重要,诸如一些随机事件、独立假设、条件概率、完全概率等等。然后对贝叶斯模型进行案例式介绍,旨在读者深度理解。

NLP与统计学

在数据科学中,统计地位尤为显著。其在数据分析的基础上,研究如何测定、收集、整理、归纳和分析反映数据规律,以便给出正确消息的科学。通过揭示数据背后的规律和隐藏信息,给相关角色提供参照价值,做出相应的决策。这在数据挖掘、自然语言处理、机器学习都广泛应用。

地图案例应用场景

适合的场景

  • 某年度国家各个省州的人口情况。 分级统计地图较多的是反映呈面状但属分散分布的现象,如反映人口密度、某农作物播种面积的比、人均收入等。

不适合的场景

  • 2008 年美国总统大选结果。 民主党候选人奥巴马和共和党候选人麦凯恩胜出的州分别用蓝色和红色表示。这个例子的选举可视化很容易给用户造成简介中提到的错觉:数据分布和地理区域大小的不对称。共和党比民主党获得了更多的投票,因为红色的区域所占的面积更大。但是在美国总统大选中,最后的结果是看候选人获得的选举人票数,每个州拥有的选举人票数是不一样的,在一个州获胜的选举人将得到该州所有的选举人票数。纽约州虽然面积很小,却拥有33张选举人票,而蒙大拿州虽然面积很大,却只有3票。

统计可视化

图5-9 iphone销量地图

NLP与机器学习

什么是机器学习

机器学习就是指“计算机利用经验自动改善系统自身性能的行为”。简言之,机器学习是指通过计算机学习数据中的内在规律性信息,获得新的经验和知识,以提高计算机的智能性,使计算机能够像人那样去决策。机器解决问题能力的增强主要表现在:初始状态下,对于问题Q,机器给出结果A,该机器在解决问题{Q1,Q2,… ,Qn}后,再次遇到问题Q时给出结果A1,而结果 A1比结果A更精确,我们就说机器解决问题的能力得到了增强。

机器学习发展简史

  • 1943年, Warren McCulloch 和 Walter Pitts 提出了神经网络层次结构模型 , 确立为神经网络的计算模型理论, 从而为机器学习的发展奠定了基础。

  • 1950年, “人工智能之父”图灵发提出了著名的“图灵测试”,使人工智能成为了计算机科学领域一个重要的研究课题。

  • 1957年, 康内尔大学教授 Frank Rosenblatt 提出感知器概念,并且设计出了第一个计算机神经网络,这个机器学习算法成为神经网络模型的开山鼻祖。

  • 1959年, 美国 IBM 公司的 A. M. Samuel设计了一个具有学习能力的跳棋程序,曾经战胜了美国一个保持 8 年不败的冠军。这个程序向人们初步展示了机器学习的能力。

  • 1962年, Hubel 和 Wiesel 发现猫脑皮层中独特的神经网络结构可以有效降低学习的复杂性,从而提出著名的 Hubel-Wiesel 生物视觉模型,以后提出的神经网络模型均受此启迪。

  • 1969 年,人工智能研究的先驱者 Marvin Minsky和 Seymour Papert 出版了对机器学习研究具有深远影响的著作《Perceptron》, 此后的十几年基于神经网络的人工智能研究进入低潮。

  • 1980 年, 在美国卡内基·梅隆大学举行了第一届机器学习国际研讨会, 标志着机器学习研究在世界范围内兴起。

  • 1986 年,Rumelhart、Hinton 和 Williams 联合在《自然》杂志发表了著名的反向传播算法(BP) , 首次阐述了 BP 算法在浅层前向型神经网络模型的应用,从此,神经网络的研究与应用开始复苏。

  • 1989 年, 美国贝尔实验室学者 Yann LeCun 教授提出了目前最为流行的卷积神经网络( CNN) 计算模型,推导出基于 BP 算法的高效训练方法, 并成功地应用于英文手写体识别。CNN 是第一个被成功训练的人工神经网络,也是后来深度学习最成功、应用最广泛的模型之一。

  • 90 年代后, 多种浅层机器学习模型相继问世,诸如逻辑回归、支持向量机等.基于统计规律的浅层学习方法比起传统的基于规则的方法具备很多优越性, 取得了不少成功的商业应用的同时, 浅层学习的问题逐渐暴露出来,由于有限的样本和计算单元导致对数据间复杂函数的表示能力有限,学习能力不强,只能提取初级特征。

  • 2006 年, 在学界及业界巨大需求刺激下, 特别是计算机硬件技术的迅速发展提供了强大的计算能力。机器学习领域的泰斗 Geoffrey Hinton 和 Ruslan Salakhutdinov 发表文章 ,提出了深度学习模型, 主要论点包括:多个隐层的人工神经网络具有良好的特征学习能力;通过逐层初始化来克服训练的难度,实现网络整体调优。这个模型的提出, 开启了深度神经网络机器学习的新时代。

  • 2012 年, Hinton 研究团队采用深度学习模型赢得计算机视觉领域最具影响力的 ImageNet 比赛冠军,从而标志着深度学习进入第二个阶段。

  • 至今, 在云计算、大数据、计算机硬件技术发展的支撑下,深度学习近年来在多个领域取得了令人赞叹的进展,推出一批成功的商业应用,诸如谷歌翻译,苹果语音工具 Siri, 微软的 Cortana 个人语音助手,蚂蚁金服的扫脸技术,特别是谷歌 AlphaGo 人机大战获胜的奇迹等, 使机器学习成为计算机科学的一个新的领域。

自然语言处理和机器学习的联系

语言是人类区别其他动物的本质特性。在所有生物中,只有人类才具有语言能力。人类的多种智能都与语言有着密切的关系。人类的逻辑思维以语言为形式,人类的绝大部分知识也是以语言文字的形式记载和流传下来的。因而,它也是人工智能(机器学习和深度学习为代表的人工智能)的一个重要,甚至核心部分。
用自然语言与计算机进行通信,这是人们长期以来所追求的。因为它既有明显的实际意义和理论意义。实现人机间自然语言通信意味着要使计算机既能理解自然语言文本的意义,也能以自然语言文本来表达给定的意图、思想等。前者称为自然语言理解,后者称为自然语言生成。因此,自然语言处理大体包括了自然语言理解和自然语言生成两个部分。无论实现自然语言理解,还是自然语言生成,都远不如人们原来想象的那么简单,而是十分困难的。从现有的理论和技术现状看,通用的、高质量的自然语言处理系统,仍然是较长期的努力目标,但是针对一定应用,具有相当自然语言处理能力的实用系统已经出现,有些已商品化,甚至开始产业化。典型的例子有:多语种数据库和专家系统的自然语言接口、各种机器翻译系统、全文信息检索系统、自动文摘系统等。

现代NLP算法是基于机器学习,特别是统计机器学习。机器学习范式是不同于一般之前的尝试语言处理。语言处理任务的实现,通常涉及直接用手的大套规则编码。许多不同类的机器学习算法已应用于自然语言处理任务。


案例:NLP技术实现预测天气冷暖感知度

机器学习算法中KNN属于比较简单的典型算法,既可以做聚类又可以做分类使用。通过一个模拟的实际案例进行讲解。整个流程包括:采集数据、数据格式化处理、数据分析、数据归一化处理、构造算法模型、评估算法模型和算法模型的应用。

案例需求

需求描述

现在你来了一个新的任务,任务其实非常简单,就是根据吃冰淇淋和喝水的数量判断成都天气冷热程度。你现在要做的就是去成都春熙路街头采访记录一些游客吃了多少冰淇淋,又喝了几瓶水,他觉得成都天气怎么样(这里只考虑二分类问题,假设只有‘非常热’和‘一般热’)。其中特征向量包括两个分别是冰激凌数t1和喝水数t2,标签类别分别是非常热A和一般热B。

数据准备

创建模拟数据集

现在我们开始行动,随机采访4个游客(暂时不考虑样本数量问题),询问每个游客吃多少冰淇淋、喝多少水、户外活动小时数等(两个整型的特征向量,一个文本向量,不考虑特征重要程度),并记录下他们口中的成都天气感受(非常热A与一般热B)。然后通过采访数据训练一个KNN分类器,新的游客只需要说出特征向量自动判别成都天气冷热程度。创建模拟数据集代码如下:

'''KNN创建数据源,返回数据集和标签'''
def create_dataset():
    group = array([[8,4,2],[7,1,1],[1,4,4],[3,0,5]])
    labels = ['非常热','非常热','一般热','一般热'] # 标签
    return group,labels

运行查看数据集的特征向量和分类标签:

'''1 KNN模拟数据分类算法'''
dataset,labels = create_dataset()
print('特征集:\n'+str(dataset))
print('标签集:\n'+str(labels))

运行结果:

特征集:
[[8 4 2]
 [7 1 1]
 [1 4 4]
 [3 0 5]]
标签集:
['非常热', '非常热', '一般热', '一般热']
耗时:0.0010 s

分析解读:

本段代码没有实际意义,只是帮助读者理解特征向量和分类标签。可以这么理解,A代表非常热,B代表一般热,属性1代表吃冰淇淋数量,属性2代表喝水的数量。那么样本数据可以解读为:

游客 冰淇淋 喝水 户外活动时长 冷热程度 判断描述
小王 8 4 2 A 小王吃了8个冰淇淋喝了4瓶水户外2h,成都天气非常热
小张 7 1 1 A 小张吃了7个冰淇淋喝了1瓶水户外1h,成都天气非常热
小李 1 4 4 B 小王吃了1个冰淇淋喝了4瓶水户外4h,成都天气一般热
小赵 3 0 5 B 小王吃了3个冰淇淋喝了0瓶水户外5h,成都天气一般热

思考:

计算机是不能直接处理自然语言,往往需要将自然语言转化成特征向量,再通过计算机处理。比如这里不是吃喝看天气情况了,而是垃圾邮件自动识别,我们就需要对邮件转化成数值型特征向量再输入计算机进行处理。

数据可视化

基于matplotlib的可视化分析

我们对数据处理后,很不容易进行数据分析。毕竟密密麻麻的数字略显冰冷无趣。我们可以将其可视化展示出来,进而查看数据稀疏程度,离散程度等等。我们查看’玩游戏所耗时间百分比’,'每周消耗在冰淇淋的公升数’两个属性的散点图,实现代码如下:

'''
散列表分析数据:
dataset:数据集
datingLabels:标签集
Title:列表,标题、横坐标标题、纵坐标标题。
'''
def analyze_data_plot(dataset,datingLabels,Title):
    fig = plt.figure()
    # 将画布划分为1行1列1块
    ax = fig.add_subplot(111)
    ax.scatter(dataset[:,0],dataset[:,1])

     # 设置散点图标题和横纵坐标标题
    plt.title(Title[0],fontsize=25,fontname='宋体',fontproperties=myfont)
    plt.xlabel(Title[1],fontsize=15,fontname='宋体',fontproperties=myfont)
    plt.ylabel(Title[2],fontsize=15,fontname='宋体',fontproperties=myfont)

    # 设置刻度标记大小,axis='both'参数影响横纵坐标,labelsize刻度大小
    plt.tick_params(axis='both',which='major',labelsize=10)
    # 截图保存图片
    # plt.savefig('datasets_plot.png',bbox_inches='tight')
    # 显示图形
    plt.show()

这里注意一个问题,横纵坐标是乱码显示,解决这个问题,添加如下代码:

#加入中文显示
import  matplotlib.font_manager as fm
# 解决中文乱码,本案例使用宋体字
myfont=fm.FontProperties(fname=r"C:\\Windows\\Fonts\\simsun.ttc")

调用可视化数据分析方法如下:

'''2 文件数据图形化分析数据 '''
title = ['游客冷热感知散列点','天热吃冰淇淋数目','天热喝水数目']
analyze_data_plot(dataset,labels,title)

游戏占比与冰淇淋公升数关系散点图可视化:

![](https://i.imgur.com/fEQlGLo.png) 图2-2 游戏占比与冰淇淋公升数关系散点图

扩展:

更多matplotlib可视化实现效果图参考文章 70个注意的Python小Notes:完整的matplotlib可视化

基于Echart的可视化分析

我们上面采用的matplotlib可视化效果,采用该方式主要是结合python数据分析绑定比较方便。有些时候我们为了取得更加漂亮的可视化效果,可以选择百度echart进行分析,百度Echart使用简单且文档规范容易上手。我们对原数据进行分析并转化为json代码:

'''array数据转化json'''
def norm_Json(dataset):
    number1 = np.around(dataset[:,0], decimals=4) # 获取数据集第二列
    number2 = np.around(dataset[:,1], decimals=4) # 获取数据集第三列
    returnMat=zeros((dataset.shape[0],2))             # 二维矩阵
    returnMat[:,0] = number1
    returnMat[:,1] = number2

    file_path = os.path.abspath(r"./test.json")
    json.dump(returnMat.tolist(), codecs.open(file_path, 'w', encoding='utf-8'), separators=(',', ':'), sort_keys=True, indent=4)

生成json数据保存在指定文件中,打开文件查看数据如下:

[
    [
        8.0,
        4.0
    ],
    [
        7.0,
        1.0
    ],
    [
        1.0,
        4.0
    ],
    [
        3.0,
        0.0
    ]
]

从百度Echart实例中选择一种散点图并绑定json文件,其html代码如下:

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>图案例</title>
    <script class="lazyload" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB/AAffA0nNPuCLAAAAAElFTkSuQmCC" data-original="https://cdn.bootcss.com/jquery/2.2.0/jquery.min.js"></script>
    <script type="text/javascript" class="lazyload" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB/AAffA0nNPuCLAAAAAElFTkSuQmCC" data-original="./js/echarts.js"></script>
    <script type="text/javascript" class="lazyload" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB/AAffA0nNPuCLAAAAAElFTkSuQmCC" data-original="./js/dark.js"></script>
</head>
<body>
    <div id="chartmain" style="width:800px; height: 400px; margin:auto; ">
    </div>

    <script type="text/javascript">
        //初始化echarts实例
        var myChart = echarts.init(document.getElementById('chartmain'));
        var option = {
            title: {
                text: '天热吃冰淇淋数目和天热喝水数目数据分析',
                left: 'center',
                top: 0
            },
            visualMap: {
                min: 0,
                max: 1,
                dimension: 1,
                orient: 'vertical',
                right: 10,
                top: 'center',
                text: ['非常热', '一般热'],
                calculable: true,
                inRange: {
                    color: ['#f2c31a', '#24b7f2']
                }
            },
            tooltip: {
                trigger: 'item',
                axisPointer: {
                    type: 'cross'
                }
            },
            xAxis: {},
            yAxis: {},
            series: [{
                name: '冰淇淋-喝水',
                type: 'scatter',
                symbolSize:15,
                data: [[8.0,4.0], [7.0, 1.0],[ 1.0, 4.0 ],[ 3.0, 0.0 ]]
            }]
        };
        myChart.setOption(option);
    </script>
</body>
</html>

json文件读取需要在web运行环境中,单纯的运行效果如下图所示:

数据转化工具

本文采用自己构建的方式进行json文件生成,此外我们也可以采用现有的数据转化工具进行处理。比如百度的表格数据转化工具(2.2节已经介绍了)。

选择算法模型及其原理

什么是KNN?

       k-近邻(kNN,k-NearestNeighbor)算法是一种基本分类与回归方法,我们这里只讨论分类问题中的 k-近邻算法。k-近邻算法的输入为实例的特征向量,对应于特征空间的点;输出为实例的类别,可以取多类。k-邻算法假设给定一个训练数据集,其中的实例类别已定。分类时,对新的实例,根据其 k 个最近邻的训练实例的类别,通过多数表决等方式进行预测。因此,k近邻算法不具有显式的学习过程即属于有监督学习范畴。k近邻算法实际上利用训练数据集对特征向量空间进行划分,并作为其分类的“模型”。k值的选择、距离度量以及分类决策规则是k近邻算法的三个基本要素。

KNN算法思想

1 计算已知类别中数据集的点与当前点的距离。[即计算所有样本点跟待分类样本之间的距离]
2 按照距离递增次序排序。[计算完样本距离进行排序]
3 选取与当前点距离最小的k个点。[选取距离样本最近的k个点]
4 确定前k个点所在类别的出现频率。[针对这k个点,统计下各个类别分别有多少个]
5 返回前k个点出现频率最高的类别作为当前点的预测分类。[k个点中某个类别最多,就将样本划归改点]

KNN工作原理

1 假设有一个带有标签的样本数据集(训练样本集),其中包含每条数据与所属分类的对应关系。
2 输入没有标签的新数据后,将新数据的每个特征与样本集中数据对应的特征进行比较。
3 计算新数据与样本数据集中每条数据的距离。
4 对求得的所有距离进行排序(从小到大,越小表示越相似)。
5 取前 k (k 一般小于等于 20 )个样本数据对应的分类标签。
6 求 k 个数据中出现次数最多的分类标签作为新数据的分类。

KNN算法流程

1 搜集数据:数据采集过程,其分为非结构化数据,半结构化数据和数据化数据。诸如:网络爬取,数据库,文件等。
2 准备数据:格式化处理,对不同类别的数据进行统一的格式化处理。诸如:将pdf,word,excel,sql等等统一转化为txt文本。
3 分析数据:主要看看数据特点,有没有缺失值,数据连续性还是离散型,进而选择不同模型。诸如:可视化数据分析
4 训练数据:不适用于KNN,但是在其他一些监督学习中会经常遇到,诸如:朴素贝叶斯分类等。
5 测试算法:评价指标,如计算错误率,准确率,召回率,F度量值等。
6 应用算法:针对完善的模型进行封装重构,然后进行实际应用。

KNN优缺点

优点:精度高、对异常值不敏感、无数据输入假定
缺点:计算复杂度高、空间复杂度好
适用数据范围:数值型和标称型

算法模型构建与实现

通过数据分析,我们查看数据样本是否偏态分别,数据规模情况等等。针对性进行数据预处理后,编写具体算法模型。本文主要是KNN分类器,其代码如下:

''' 构造KNN分类器
vecX:输入向量,待测数据
filename: 特征集文件路径
isnorm:是否进行归一化处理
k:k值的选择,默认选择3
'''
def knn_classifier(vecX,dataset,labels,k=3):
    dataSetSize = dataset.shape[0]
    # tile方法是在列向量vecX,datasetSize次,行向量vecX1次叠加
    diffMat = tile(vecX,(dataSetSize,1)) - dataset
    sqDiffMat = diffMat ** 2
    sqDistances = sqDiffMat.sum(axis=1)   # axis=0 是列相加,axis=1是行相加
    distances = sqDistances**0.5
    # print('vecX向量到数据集各点距离:\n'+str(distances))

    sortedDistIndexs = distances.argsort(axis=0)  # 距离排序,升序
    # print(sortedDistIndicies)

    classCount = {}   # 统计前k个类别出现频率
    for i in range(k):
        votelabel = labels[sortedDistIndexs[i]]
        classCount[votelabel] = classCount.get(votelabel,0) + 1 #统计键值
    # 类别频率出现最高的点,itemgetter(0)按照key排序,itemgetter(1)按照value排序
    sortedClassCount = sorted(classCount.items(),key=operator.itemgetter(1),reverse=True)
    # print(str(vecX)+'KNN的投票决策结果:\n'+str(sortedClassCount[0][0]))
    return sortedClassCount[0][0]

算法优化与应用

knn分类器应用

经过如上的改进最终形成实际应用的算法模型API开发给外部程序使用,调用knn算法代码如下:

'''调用可用算法'''
def show_classifyPerson():
    iceCream = float(input('Q:请问你今天吃了几个冰淇淋?\n'))
    drinkWater = float(input('Q:请问你今天喝了几瓶水?\n'))
    palyAct = float(input('Q:请问你今天在户外活动几个小时?\n'))

    dataset,labels = create_dataset() # 数据格式化处理
    inArr = array([iceCream,drinkWater,palyAct])

    classifierResult = knn_classifier(inArr,dataset,labels,3) # 数据归一化并进行分类
    print("该访客认为成都天气是:"+ classifierResult)

运行结果如下:

Q:请问你今天吃了几个冰淇淋?
5
Q:请问你今天喝了几瓶水?
3
Q:请问你今天在户外活动几个小时?
1
该访客认为成都天气是:非常热
耗时:8.1050 s

寄语

机器学习比较偏底层和理论,机器学习本身不够炫酷,结合了具体的自然语言处理以及数据挖掘的问题才能炫酷。机器学习好像内力一样,是一个武者的基础,而自然语言和数据挖掘的东西都是招式。如果你内功足够深厚,招式对你来说都是小意思。但机器学习同时也要求很高的数学基础,现在如果我们只讲工程实现,有很多开源工具可以使用,你所需要的只是知道这些工具都是干嘛用的就好,很多中国本科生对机器学习特别特别特别的狂热,但对矩阵,概率论又有着老子早不想念这门课了,终于过了的思想。我一直觉得,如果你真的矩阵,概率,微积分学的不好,早日勤动手,多编程,对日后找工作很有利!!!一定不要舍本逐末的放弃了程序员最基础的编程功夫。

点击查看更多内容
20人点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消