写点什么

原创万字总结人工智能技术栈与学习路线 上集 基础篇

用户头像
cv君
关注
发布于: 刚刚
原创万字总结人工智能技术栈与学习路线 上集 基础篇

文章目录

一 概述(本文原创)

二 人工智能编程语言/数据结构与算法

三 人工智能基础原理

四 智能信息获取(简称爬虫) 与数据分析

1、发起请求

3、解析内容

4、保存数据

二、Requests 库介绍

2.1 基本介绍

requests 的基本使用流程

三、selenium

四:效率问题

五:资源浪费

六:能被识别

七、scrapy 框架

八、Bs4

整体使用步骤

九、字段匹配方案

十:数据存储与队列任务(MongoDB 与 Rabbitmq)

十一、总结

requests vs Scrapy

两个方法看情况用

相同点

五 统计学原理/离散数学/概率论与数理统计/微积分

六 机器学习(必学)

七 深度学习经典算法(必学)

8 计算机视觉经典算法(与 9 二选一或皆学)

九 自然语言处理与语音识别(与 8 二选一或皆学)

NLP

语音识别

十 推荐系统

十一 模型优化




正文


谨以本文送给所有爱好人工智能的爱好者,完全原创,干货,建议收藏~

谢邀,今天受朋友邀请写下这篇文章~

一 概述(本文原创)

首先你需要数学基础:高等数学,线性代数,概率论数理统计和随机过程,离散数学,数值分析。

其次需要算法的积累:人工神经网络,支持向量机(SVM),遗传算法等等算法;当然还有各个领域需要的算法,比如你要让机器人自己在位置环境导航和建图就需要研究 SLAM;总之算法很多需要时间的积累;

人工智能专业的主要领域是:自动控制原理,传感器,单片机,微机原理,模式识别,人工智能导论,计算机视觉,数字图像处理,MATLAB ,机器人,电机控制,机器学习,数字视频技术等等,分软硬两个方向; 机器学习 人工智能导论(搜索法等) 图像识别 智能信息获取 语音识别 生物演化论 自然语言处理 语义网 博弈论等。 需要的前置课程主要有,信号处理,线性代数,微积分,还有编程(最好有数据结构基础)。


人工智能一般要到研究生才会去学,本科也就是蜻蜓点水看看而已,毕竟需要的基础课过于庞大。


二 人工智能编程语言/数据结构与算法

2.1 编程语言

基础知识语言:C 语言(为了基础知识与学习数据结构与算法)

学习与应用型语言:Python (语言简洁,方便学习,代码,库多等)

嵌入部署语言:C++(计算速度快,落地必备语言)

Cuda 编程:深度学习编程加分项(精通的工程师很少)

不建议使用 Java 语言,计算等不太好,除非使用 NLP 的斯坦福等模型。

2.2 数据结构与算法

数据结构与算法,建议刷上百道 Leetcode 或者剑指 Offer

数据结构与算法是算法工程师必备技能,在人工智能中应用不是特别多,但是却可以在写代码的时候更精练,并且能计算速度更快。

一些必备算法:

广度优先搜索

深度优先搜索

背包问题

动态规划

蚁群问题

其他的我们下面说


三 人工智能基础原理

这门课,你将学习:

知识系统: 分为确定性只是系统和不确定性知识系统 你将学习基础的知识表示和推理方式

智能搜索技术:你将学习启发式搜索算法例如 A*算法和博弈树以及遗传算法

机器学习:这门课程中学习:线性回归 与 决策树与支持向量机 Adaboost 以及 Bagging 算法。

深度学习:这门课程:人工神经网络 单层/多层感知机 BP 神经网络 Hopfield 网络 卷积神经网络 LeNet5

这本书:《人工智能原理及其应用》特别全面,还有很多知识上述没列出来,下面将详细介绍。

四 智能信息获取(简称爬虫) 与数据分析

爬虫,网络资源特别多

我来大致说说:

爬虫的简单理解: 向网站发起请求,获取资源后分析并提取有用数据的程序

1、发起请求

使用库向目标站点发起请求,即发送一个 Request Request 包含:请求头、请求体等

####2、获取响应内容

如果服务器能正常响应,则会得到一个 Response Response 包含:html,json,图片,视频等

3、解析内容

解析 html 数据:正则表达式,第三方解析库如 Beautifulsoup,pyquery 等 解析 json 数据:json 模块 解析二进制数据:以 b 的方式写入文件

4、保存数据

数据库 文件

二、Requests 库介绍

2.1 基本介绍

requests 是基于 urllib3 的一个用于发起 http 请求的库。这个库相较于 urllib 更快,更易用。

requests 易用性强,定制简单,可用性好,文档丰富,入门简单 ,属于页面级爬虫。

本身没有处理 js、提交表单、对应验证码等功能(可扩展)

重点在于页面下载。

Requests 只是一个构建网页请求,获取网页响应的模块,并不是框架。 在构建 request 方面,简单易实现,且功能强大。 Requests 几乎满足如今网络的需求。

requests 的基本使用流程

爬虫三部曲

1.发送请求

def get_page(url): respone=requests.get(url) return respone

2.解析数据

import redef parse_index(html):

findall 匹配所有

re.findall(“匹配所有”,html,re.S)

re.S(对全部文本进行匹配)

detail_urls=re.findall(’

<a class=“imglink” href="(.*?)"’,html,re.S) return detail_urls

解析详情页

def parse_detail(html): movie_url=re.findall(’’,html,re.S) if movie_url: return movie_url[0]

三、selenium

四:效率问题

从启动,到模拟种种用户行为,他都没有直接访问接口快。

五:资源浪费

爬虫部署在服务器,大量爬虫启动,极其消耗资源,你在开几个 selenium,分分钟爆炸。所以,进公司,基本见不到 selenium 的踪迹。

六:能被识别

虽然 selenium 模拟浏览器进行用户行为,但其实他还是会被识别。比如淘宝的模拟登陆。 所以对于我们初步 50w 的数据,而且网站反爬措施一般的情况下,可以直接不考虑 seleenium。

七、scrapy 框架

scrapy 是一个功能非常强大的爬虫框架,它不仅能便捷地构建 request,还有强大的 selector 能够方便地解析 response,然而****它最受欢迎的还是它的性能,既抓取和解析的速度,它 的 downloader 是多线程的,request 是异步调度和处理的。这两点使它的爬取速度非常之快。**** 另外还有内置的 logging,exception,shell 等模块,为爬取工作带来了很多便利。

所以在性能方面,****scrapy**** >= Requests + lxml/Beautiful Soup + twisted/tornado + threading + Queue.

然而在易用性方面,他却比 requests 难很多, 初学入手,难度远高于 requests

这一框架就像一条爬虫流水线,有工作队列、有下载器、有分配任务的引擎,有对爬取数据写逻辑的地方、也有写保存处理数据的数据库 SQL 的地方。对于 scrapy 而言,更多的时候是在配置 scrapy。先要继承一个 spider 写爬虫的主体,然后还要在 setting 里写配置,在 pipeline 里写数据库。而且还要注意在主函数 parse 里的返回值,返回 item 时是交给 pipline 做数据处理,返回 Request 回调函数时是向爬取队列注册二级链接等等。

八、Bs4

整体使用步骤

bs4 里面有一个类,BeautifulSoup,然后通过这个类将网页 html 格式字符串生成一个对象,然后通过对象的方法来进行查找指定元素

Beautiful Soup 是一个可以从 HTML 或 XML 文件中提取数据的 Python 库.它能够通过你喜欢的转换器实现惯用的文档导航,查找,修改文档的方式.Beautiful Soup 会帮你节省数小时甚至数天的工作时间.

Beautiful Soup 在解析时实际上依赖解析器,它除了支持 Python 标准库中的 HTML 解析器外,还支持一些第三方解析器(比如 lxml)。下面我列出 Beautiful Soup 支持的几种解析器。

一般常用的是 lxml 解析器,它有解析 HTML 和 XML 的功能,而且速度快,容错能力强,如果使用 lxml,在初始化的时候 Beautiful Soup 时,可以把第二个参数改为 lxml 即可,其他都是一致的。

九、字段匹配方案

CSS selecor, Xpath ,Re 正则表达式

在易用度上:css selector > Xpath> Re

速度上:CSS selector > Xpath > Re

这个方案使用 css 优先,当然使用 xpath 也可以(可选),并不影响大局。应该可以根据喜好写。当然有个标准规定也是有必要的。

十:数据存储与队列任务(MongoDB 与 Rabbitmq)

在上面确定好使用的技术栈,包括框架,请求库,解析库后,接下来到数据存储,使用 MongoDB 会比较方便,首先,使用 MongoDB 做存储,简单实用,方便拓展爬虫的数据。

其次,如果可以,将任务分解成 N 个子任务,放到一个 MessageQueue 中。接着,在写程序的时候,不要考虑任何多线程多进程 gevent 或者任何会让你的程序“提速”的东西,爬虫只要完成一个简单的功能:接受一个输入,这里就是某一页的页码,得到的输出是这一页的 15 条数据,最好直接存储到数据库中。最后一步,将上两步具体实现,使用 RabbitMQ,然后在上一步的接受输入变成从 Queue 中取一条任务。

如果源网站不会因为访问频率过高而封你的 IP,那么可以在一台机器上多部几个爬虫实例,否则的话,你可以将你的代码部署到多台机器上。阿里云按时间付费的机器很便宜,可以开多点机器以加快速度。这样的好处是,可以随时新增或减少一个爬虫实例,而不会影响之前已经部署的任何爬虫,也可以随时将抓取失败的页码数再次放入 Queue 中,而不影响正在抓取任务的爬虫

十一、总结

requests vs Scrapy

requests Scrapy

页面级爬虫 网站级爬虫

功能库 框架

并发性考虑不足,性能较差 并发性好,性能较高

重点在于页面下载 重点在于爬虫结构

定制灵活 一般定制灵活,深度定制困难

上手十分简单 入门稍难

两个方法看情况用

非常小的需求,用 requests 库

不太小的需求,Scrapy 框架(持续周期性不间断爬取)

定制程度很高的需求(不考虑规模),自搭框架,requests>Scrapy

相同点

两者都可以进行页面请求和爬取,python 爬虫的两个重要技术路线。

两者可用性都好,文档丰富,入门简单。

两者都没有处理 js、提交表单、应对验证码等功能(可扩展)。

五 统计学原理/离散数学/概率论与数理统计/微积分

这是一些必备数学知识,如果你不会,很难坚持学完机器学习基础算法。

详见各科书本,其中统计学原理最重要,是机器学习的前身,例如支持向量机,决策树算法 ,Adaboost 等算法都会学原理。

六 机器学习(必学)


这一节很重要,我详细给大家说说要学哪些算法:强调一下,以下算法建议必会,就算自己没有用于项目中,也建议跑一炮算法和简单应用。

1:线性回归与多项式回归

参见博客:传送门

2:梯度下降法:传送门

3:决策树 ID3 和 C4.5 算法:传送门 与简单使用

4:SVM 算法从原理到实战(必学算法):SVM 原理

支持向量机 SVM 基础实战篇(一);

支持向量机 SVM 基础实战篇(二);

SVM 基础实战篇之经典预测(三);

基于 OpenCv 的 SVM 实现车牌检测与识别(一)

【实战】基于 OpenCv 的 SVM 实现车牌检测与识别(二)

关注我合集 都会放上来

5、kNN: k-nearest neighbor classification

K 最近邻(k-Nearest Neighbor,KNN)分类算法,是一个理论上比较成熟的方法,也是最简单的机器学习算法之一。该方法的思路是:如果一个样本在特征空间中的 k 个最相似(即特征空间中最邻近)的样本中的大多数属于某一个类别,则该样本也属于这个类别。

6、The k-means algorithm 即 K-Means 算法

k-means algorithm 算法是一个聚类算法,把 n 的对象根据他们的属性分为 k 个分割,k < n。它与处理混合正态分布的最大期望算法很相似,因为他们都试图找到数据中自然聚类的中心。它假设对象属性来自于空间向量,并且目标是使各个群组内部的均方误差总和最小。

7、最大期望(EM)算法

在统计计算中,最大期望(EM,Expectation–Maximization)算法是在概率(probabilistic)模型中寻找参数最大似然估计的算法,其中概率模型依赖于无法观测的隐藏变量(Latent Variabl)。最大期望经常用在机器学习和计算机视觉的数据集聚(Data Clustering)领域。

8、AdaBoost

Adaboost 是一种迭代算法,其核心思想是针对同一个训练集训练不同的分类器(弱分类器),然后把这些弱分类器集合起来,构成一个更强的最终分类器(强分类器)。其算法本身是通过改变数据分布来实现的,它根据每次训练集之中每个样本的分类是否正确,以及上次的总体分类的准确率,来确定每个样本的权值。将修改过权值的新数据集送给下层分类器进行训练,最后将每次训练得到的分类器最后融合起来,作为最后的决策分类器。

9、Naive Bayes 朴素贝叶斯

在众多的分类模型中,应用最为广泛的两种分类模型是决策树模型(Decision Tree Model)和朴素贝叶斯模型(Naive Bayesian Model,NBC)。朴素贝叶斯模型发源于古典数学理论,有着坚实的数学基础,以及稳定的分类效率。同时,NBC 模型所需估计的参数很少,对缺失数据不太敏感,算法也比较简单。理论上,NBC 模型与其他分类方法相比具有最小的误差率。但是实际上并非总是如此,这是因为 NBC 模型假设属性之间相互独立,这个假设在实际应用中往往是不成立的,这给 NBC 模型的正确分类带来了一定影响。在属性个数比较多或者属性之间相关性较大时,NBC 模型的分类效率比不上决策树模型。而在属性相关性较小时,NBC 模型的性能最为良好。

10,随机森林(集成算法中最简单的,模型融合算法)

随机森林如何缓解决策树的过拟合问题,又能提高精度?

a. Random Forest, 本质上是多个算法****平等的****聚集在一起。每个单个的决策树,都是随机生成的训练集(行),随机生成的特征集(列),来进行训练而得到的。

b. 随机性的引入使得随机森林不容易陷入过拟合,具有很好的抗噪能力,有效的缓解了单棵决策树的过拟合问题。

c. 每一颗决策树训练样本是随机的有样本的放回抽样。

11,马尔可夫

a. 马尔可夫线没有箭头,马尔可夫模型允许有环路。

b. affinity 亲和力关系,energy(A,B,C),发现 A,B,C 之间有某种规律性东西,但不一定是概率,但是可以表示 ABC 之间的一种亲和力。

c. potential = e1e2e3*en potential 函数一般来说不是概率

d. 归一化 -> 概率分布 probability

e. 贝叶斯模型与马尔可夫模型:任何一个贝叶斯模型对应于唯一的一个马尔可夫模型,而任意一个马尔可夫模型,可以对应于多个贝叶斯模型。

f. 贝叶斯模型类似于象棋,等级分明;马尔可夫模型类似于围棋,人人平等。

g. 马尔可夫模型(Markov Model)是一种统计模型,广泛应用在语音识别,词性自动标注,音字转换,概率文法等各个自然语言处理等应用领域。

12、Gradient Boosting 和 AdaBoost 算法

当我们要处理很多数据来做一个有高预测能力的预测时,我们会用到 GBM 和 AdaBoost 这两种 boosting 算法。boosting 算法是一种集成学习算法。它结合了建立在多个基础估计值基础上的预测结果,来增进单个估计值的可靠程度。这些 boosting 算法通常在数据科学比赛如 Kaggle、AV Hackathon、CrowdAnalytix 中很有效。


用户头像

cv君

关注

还未添加个人签名 2021.03.22 加入

还未添加个人简介

评论

发布
暂无评论
原创万字总结人工智能技术栈与学习路线 上集 基础篇