b站唐老师人工智能基础知识笔记

  • 0.机器学习(常用科学计算库的使用)基础定位、目标定位
  • 1.机器学习概述
    • 1.1.人工智能概述
    • 1.2.人工智能发展历程
    • 1.3.人工智能主要分支
    • 1.4.机器学习工作流程
    • 1.5.机器学习算法分类
    • 1.6.模型评估
    • 1.7.Azure机器学习模型搭建实验
    • 1.8.深度学习简介【了解】
  • 2.机器学习基础环境安装与使用
    • 2.1 库的安装
    • 2.2 jupyter notebook使用
  • 3. Matplotlib
    • 3.1 Matplotlib之HelloWorld
    • 3.2折线图(plot)与基础绘图功能
    • 3.3.常见图形绘制
  • 4.Numpy
    • 4.1Numpy 的优势
    • 4.2N维数组-ndarray
    • 4.3基本操作
    • 4.4ndarray运算
    • 4.5数学:矩阵
    • 4.6数组间的运
  • 5.Pandas
    • 5.1
    • 5.2 基本数据操作
    • 5.3 DataFrame运算
    • 5.4 Pandas画图
    • 5.5 文件读取与存储
    • 5.6 高级处理-缺失值处理
    • 5.7 高级处理-数据离散化
    • 5.8 高级处理-合并
    • 5.9 高级处理-交叉表与透视表
    • 5.10 高级处理-分组与聚合
    • 5.10 案例

0.机器学习(常用科学计算库的使用)基础定位、目标定位

定位
作为人工智能领域(数据挖掘/机器学习方向)的基础课程,为长期从事人工智能方向打下坚实的基础。

目标
●了解机器学习定义以及应用场景
●掌握机器学习基础环境的安装和使用
●掌握利用常用的科学计算库对数据进行分析

1.机器学习概述

学习目标

  • 了解人工智能发展历程
  • 了解机器学习定义以及应用场景
  • 说明机器学习算法监督学习与无监督学习的区别
  • 说明监督学习总分的分类、递归特点
  • 说明机器学习的发展流程

1.1.人工智能概述

  • 目标

  • 了解人工智能再现实生活中的应用

  • 了解人工智能阶段授课内容

  • 应用


1.人工智能应用场景

2.人工智能小案例
案例一:


案例二:

案例三:

3.人工智能阶段课程安排
4.小结

  • 人工智能应用场景【了解】

  • 网络安全,电子商务,计算模拟,社交网络。。。。。

1.2.人工智能发展历程

学习目标

  • 目标
  • 了解图灵测试
  • 了解人工智能发展历程
  • 应用

1图灵测试

测试者与被测试者(一个人和一台机器)隔开的情况下,通过一些装置(如键盘向被测试者随意提问。多次测试(一般为5min之内),如果有超过30%的测试者能确定被测试者是人还是机器,那么这台机器就通过了测试,并被认为具有人类智能。


●达特茅斯会议-人工智能的起点
1956年8月,在美国汉诺斯小镇宁静的达特茅斯学院中,
约翰麦卡锡(John McCarthy)
马文.闵斯基(Marvin Minsky,人工智能与认知学专家)
克劳德香农(Claude Shannon,信息论的创始人)
艾伦.纽厄尔(Allen Newell,计算机科学家)
赫伯特西蒙(Herbert Simon,诺贝尔经济学奖得主)等科学家正聚在一起, 讨论着一个完全不食人间烟火的主题:用机器来模仿人类学习以及其他方面的智能。
会议足足开了两个月的时间,虽然大家没有达成普遍的共识,但是却为会议讨论的内容起了一个名字:
人工智能
因此,1956年也就成为了人工智能元年。

2发展历程
●第一个黄金时期(1956- 20世纪70年代)
美国国防部赞助MIT222万美金,之后每年300万美金;
1963年斯坦福第一个AI实验室成立
●第二个黄金时期(1956-20世纪70年代)
日本的第五代计算机项目拔款8.5亿美金;
1986,误差反向传播(BP)算法诞生;
●第一个低谷时期(20世纪70年代至80年代初)
James Lighthll:《Artificial Itelligence: A general survey》
专家系统:“知识期”
●第二个低谷时期(20世纪80年代至90年代初)
IBM与Apple普通台式机性能超越“智能计算机"
1991,日本的第五代计算机宣告失败

3小结
●人工智能的起源[了解]
。图灵测试
。达特茅斯会议
●人工智能的发展经历了3个阶段[了解]
。1980年代是正式成形期,尚不具备影响力。
。1990-2010年代是蓬勃发展期,诞生了众多的理论和算法,真正走向了实用。
。2012年之后是深度学习期,深度学习技术诞生并急速发展,较好的解决了现阶段AI的一些重点问
题,并带来了产业界的快速发展。

1.3.人工智能主要分支

学习目标

  • 目标
  • 了解人工智能、机器学习和深度学习的区别
  • 了解人工智能主要分支
  • 应用

1.人工智能、机器学习和深度学习


●人工智能和机器学习,深度学习的关系
。机器学习是人工智能的-一个实现途径
。深度学习是机器学习的一个方法发展而来

2.主要分支介绍

通讯、感知与行动是现代人工智能的三个关键能力,在这里我们将根据这些能力/应用对这三个技术领域进行介绍:计算机视觉(CV)、自然语言处理(NLP)和机器人。在NLP领域中,将覆盖文本挖掘/分类、机器翻译和语音识别。
●分支一:计算机视觉
计算机视觉(CV)是指机器感知环境的能力。这一技术类别中的经典任务有图像形成、图像处理、图像提取和图像的三维推理。物体检测和人脸识别是其比较成功的研究领域。

当前阶段:
计算机视觉现已有很多应用,这表明了这类技术的成就,也让我们将其归入到应用阶段。随着深度学习的发展,机器甚至能在特定的案例中实现超越人类的表现。但是,这项技术离社会影响阶段还有一定距离,那要等到机器能在所有场景中都达到人类的同等水平才行(感知其环境的所有相关方面。

发展历史:


●分支二:
语音识别是指识别语音(说出的语言)并将其转换成对应文本的技术。相反的任务(文本转语音/TTS)也是这一领域内一个类似的研究主题。

当前阶段:
语音识别已经处于应用阶段很长时间了。最近几年,随着大数据和深度学习技术的发展,语音识别进展颇丰,现在已经非常接近社会影响阶段了。
语音识别领域仍然面临着声纹识别和「鸡尾酒会效应」等一些特殊情况的难题。
现代语音识别系统严重依赖于云,在离线时可能就无法取得理想的工作效果。
发展历史:

●百度语音识别:

  • 距离小于1米,中文字准率97%
  • 支持耳语、长语音、中英文混合以及方言

分支三:文本挖掘/分类
这里的文本挖掘主要是指文本分类,该技术可用于理解、组织和分类结构化或非结构化文本文档。其涵盖的主要任务有句法分析、情绪分析和垃圾信息检测。

当前阶段:
我们将这项技术归类到应用阶段,因为现在有很多应用都已经集成了基于文本挖掘的情绪分析或垃圾信息检测技术。文本挖掘技术也在智能投顾的开发中有所应用,并且提升了用户体验。

文本挖掘和分类领域的一个瓶颈出现在歧义和有偏差的数据上。

发展历史:

●分支四:机器翻译
机器翻译(MT)是利用机器的力量自动将一种自然语言(源语言)的文本翻译成另一种语言(目标语言)。机器翻译方法通常可分成三大类:基于规则的机器翻译(RBMT)、统计机器翻译(SMT)和神经机器翻译(NMT)。

当前阶段:
机器翻译是一个见证了大量发展历程的应用领域。该领域最近由于神经机器翻译而取得了非常显著的进展,但仍然没有全面达到专业译者的水平;但是,我们相信在大数据、云计算和深度学习技术的帮助下,机器翻译很快就将进入社会影响阶段。

在某些情况下,俚语和行话等内容的翻译会比较困难(受限词表问题)。

专业领域的机器翻译(此如医疗领域)表现通常不好。

发展历史:

●分支五:机器人
机器人学(Robotics)研究的是机器人的设计、制造、运作和应用,以及控制它们的计算机系统、传感反馈和信息处理。

机器人可以分成两大类:固定机器人和移动机器人。固定机器人通常被用于工业生产(此如用于装配线)。常见的移动机器人应用有货运机器人、空中机器人和自动载具。机器人需要不同部件和系统的协作才能实现最优的作业。其中在硬件上包含传感器、反应器和控制器;另外还有能够实现感知能力的软件,比如定位、地图测绘和目标识别。

当前阶段:

自上世纪「Robot」一词诞生以来,人们已经为工业制造业设计了很多机器人。工业机器人是增长最快的应用领域,它们在20世纪80年代将这一领域带入了应用阶段。在安川电机、Fanuc、 ABB、库卡等公司的努力下,我们认为进入21世纪之后,机器人领域就已经进入了社会影响阶段,此时各种工业机器人已经主宰了装配生产线。此外,软体机器人在很多领域也有广泛的应用,比如在医疗行业协助手术或在金融行业自动执行承销过程。
但是,法律法规和「机器人威胁论」可能会妨碍机器人领域的发展。还有设计和制造机器人需要相对较高的投资。

发展历史:

总的来说,人工智能领域的研究前沿正逐渐从搜索、知识和推理领域转向机器学习、深度学习、计算机视觉和机器人领域。大多数早期技术至少已经处于应用阶段了,而且其中-些已经显现出了社会影响力。一些新开发的技术可能仍处于工程甚至研究阶段,但是我们可以看到不同阶段之间转移的速度变得越来越快。

3.人工智能发展必备三要素
●数据
●算法
●计算力

 逐层、分布、并行算法能力提升GPU、FPGA、TPU能力答复提升

4.拓展:GPU和CPU对比

Cache, local memory: CPU> GPU
Threads(线程数): GPU> CPU
SIMD Unit(单指令多数据流,以同步方式,在同一时间内执行同一条指令): GPU> CPU
●1.GPU 加速计算可以将应用程序计算密集部分的工作负载转移到GPU,同时仍由CPU运行其余程序代码。从用户的角度来看,应用程序的运行速度明显加快.
●2,CPU由专为顺序串行处理而优化的几个核心组成,而GPU则拥有-个由数以千计的更小。更高效的核心(专为同时处理多重任务而设计)组成的大规模并行计算架构.


●3,CPU需要很强的通用性来处理各种不同的数据类型,同时又要逻辑判断又会引入大量的分支跳转和中断的处理。这些都使得CPU的内部结构异常复杂。而GPU面对的则是类型高度统一的、 相互无依赖的大规模数据和不需要被打断的纯净的计算环境。GPU采用了数量众多的计算单元和超长的流水线,但只有非常简单的控制逻辑并省去了Cache.而CPU不仅被Cache占据了大量空间,而且还有复杂的控制逻辑和诸多优化电路,相比之下计算能力只是CPU很小的一部分.

●提问:什么类型的程序适合在GPU上运行?
(1)计算密集型的程序。所谓计算密集型(Compute-intensive)的程序,就是其大部分运行时间花在了寄存器运算上,寄存器的速度和处理器的速度相当,从寄存器读写数据几乎没有延时。可以做一下对比, 读内存的延迟大概是几百个时钟周期;读硬盘的速度就不说了,即便是SSD,也实在是太慢了。

(2)易于并行的程序。GPU其实是一种SIMD(Single Instruction Multiple Data)架构,他有成百上千个核,每一个核在同一时间最好能做同样的事情。

Google cloud链接(拓展) :
https://cloud.google. com/tpu/?hl=zh-cn

AI芯片发展史链接(拓展) :
https://buzzorange. com/techorange/2017/09/27/what-intel-google-nvidia-microsoft-do-for-ai-chips/

4小结
●人工智能和机器学习,深度学习的关系[知道]
。机器学习是人工智能的一个实现途径
。深度学习是机器学习的一个方法发展而来
●人工智能主要分支[了解]
。计算机视觉
。语音识别
。文本挖掘/分类
。机器翻译
。机器人

1.4.机器学习工作流程

学习目标

  • 目标
  • 了解机器学习的定义
  • 了解机器学习的工作流程
  • 应用

1.什么是机器学习
机器学习是从数据中自动分析获得模型,并利用模型对未知数据进行预测.

2.机器学习工作流程

●机器学习工作流程总结
。1.获取数据
。2.数据基本处理
。3.特征工程
。4.机器学习(模型训练)
。5.模型评估

2.1获得到的数据集介绍



●数据简介
在数据集中一般:
。一行数据我们称为一个样本
。一列数据我们成为一个特征
。有些数据有目标值(标签值),有些数据没有目标值(如上表中,电影类型就是这个数据集的目标值)

●数据类型构成:
。数据类型一:特征值+目标值(目标值是连续的或离散的)
。数据类型二:只有特征值,没有目标值

●数据分割:
。机器学习一般的数据集会划分为两个部分:
■训练数据:用于训练,构建模型
■测试数据:在模型检验时使用,用于评估模型是否有效
。划分比例:
■训练集: 70% 80% 75%
■测试集: 30% 20% 25%

2.2数据基本处理
即对数据进行缺失值、取出异常值等处理

2.3特征工程
2.3.1什么是特征工程
特征工程是使用专业背景知识和技巧处理数据,使得特征能在机器学习算法上发挥更好的作用的过程。
●意义:会直接影响机器学习的效果

特征工程就是让我们的数据转换成机器更容易识别的数据。
2.3.2为什么需要特征工程(Feature Engineering)机器学习领域的大神Andrew Ng(吴恩达)老师说“Coming up with features is difiult, time-consuming, requires expert knowledge. "Applied machine learning" is basically feature engineering.”

注:业界广泛流传:数据和特征决定了机器学习的上限,而模型和算法只是逼近这个上限而已。
···
这句话的意思就是让模型训练的效果更好一些。
···
2.3.3特征工程包含内容
●特征提取
●特征预处理
●特征降维

2.3.3.1特征提取
特征提取: 将任意数据(如文本或 图像)转换为可用于机器学习的数字特征


2.3.3.2特征预处理
特征预处理: 通过一些转换函数将特征数据转换成更加适合算法模型的特征数据过程。(目的:把数值映射到一定的范围之内)

2.3.3.3特征降维
特征降维:指再某些限定条件下, 降低随机变量(特征)个数, 得到一组“不相关”主变量的过程。

2.4机器学习
选择合适的算法对模型进行训练(具体内容见1.5)

2.5模型评估
对训练好的模型进行评估(具体内容见1.6)

3 完整机器学习项目的流程(拓展阅读)
(1) 抽象成数学问题
明确问题是进行机器学习的第-步。 机器学习的训练过程通常都是一件非常耗时的事情,胡乱尝试时间成本是非常高的。

这里的抽象成数学问题,指的明确我们可以获得什么样的数据,抽象出的问题,是一个分类还是回归或者是聚类的问题。

(2)获取数据
数据决定了机器学习结果的上限,而算法只是尽可能逼近这个上限。

数据要有代表性,否则必然会过拟合。

而且对于分类问题,数据偏斜不能过于严重,不同类别的数据数量不要有数量级的差距。

而且还要对数据的量级有一一个评估,多少个样本,多少个特征,可以估算出其对内存的消耗程度,判断训练过程中内存是否能够放得下。如果放不下就得考虑改进算法或者使用一些降维的技巧了。 如果数据量实在太大,那就要考虑分布式了。

(3)特征预处理与特征选择
良好的数据要能够提取出良好的特征才能真正发挥作用。

特征预处理、数据清洗是很关键的步骤,往往能够使得算法的效果和性能得到显著提高。归一化、离散化、因子化、缺失值处理、去除共线性等,数据挖掘过程中很多时间就花在它们上面。这些工作简单可复制,收益稳定可预期,是机器学习的基础必备步骤。

筛选出显著特征、摒弃非显著特征,需要机器学习工程师反复理解业务。这对很多结果有决定性的影响。特征选择好了,非常简单的算法也能得出良好、稳定的结果。这需要运用特征有效性分析的相关技术,如相关系数、卡方检验、平均互信息、条件熵、后验概率、逻辑回归权重等方法。

(4)训练模型与调优
直到这一步才用到我们上面说的算法进行训练。现在很多算法都能够封装成黑盒供人使用。但是真正考验水平的是调整这些算法的(超)参数,使得结果变得更加优良。这需要我们对算法的原理有深入的理解。理解越深入,就越能发现问题的症结,提出良好的调优方案。

(5)模型诊断
如何确定模型调优的方向与思路呢?这就需要对模型进行诊断的技术。

过拟合、欠拟合判断是模型诊断中至关重要的一步。常见的方法如交叉验证,绘制学习曲线等,过拟合的基本调优思路是增加数据量,降低模型复杂度。欠拟合的基本调优思路是提高特征数量和质量,增加模型复杂度。.

误差分析也是机器学习至关重要的步骤。通过观察误差样本全面分析产生误差的原因:是参数的问题还是算法选择的问题,是特征的问题还是数据本身的问题…

诊断后的模型需要进行调优,调优后的新模型需要重新进行诊断。这是-一个反复迭代不断逼近的过程,需要不断地尝试,进而达到最优状态。

(6)模型融合
一般来说,模型融合后都能使得效果有一定提升。而且效果很好。

工程上,主要提升算法准确度的方法是分别在模型的前端(特征清洗和预处理,不同的采样模式)与后端(模型融合)上下功夫。因为他们比较标准可复制,效果比较稳定。而直接调参的工作不会很多,毕竟大量数据训练起来太慢了,而且效果难以保证。

(7)上线运行
这一部分内容主要跟工程实现的相关性比较大。工程上是结果导向,模型在线上运行的效果直接决定模型的成败。不单纯包括其准确程度、误差等情况,还包括其运行的速度(时间复杂度)、资源消耗程度(空间复杂度)、稳定性是否可接受。

这些工作流程主要是工程实践上总结出的一些经验。并不是每个项目都包含完整的-个流程。这里的部分只是一个指导性的说明,只有大家自己多实践,多积累项目经验,才会有自己更深刻的认识。

1.5.机器学习算法分类

学习目标

  • 目标

  • 了解机器学习常用算法的分类

  • 应用


根据数据集组成不同,可以把机器学习算法分为:
●监督学习

●无监督学习

●半监督学习

●强化学习


1 监督学习
●定义:

  • 输入数据是由输入特征值和目标值所组成。
    ■函数的输出可以是一个连续的值(称为回归),
    ■或是输出是有限个离散值(称作分类)。

1.1回归问题
例如:预测房价,根据样本集拟合出一条连续曲线。

1.2分类问题

例如:根据肿瘤特征判断良性还是恶性,得到的是结果是“良性”或者“恶性”,是离散的。

2无监督学习

●定义:输入数据是由输入特征值组成。

输入数据没有被标记,也没有确定的结果。样本数据类别未知,需要根据样本间的相似性对样本集进
行分类(聚类,clustering) 试图使类内差距最小化,类间差距最大化。
举例:

  • 有监督,无监督算法对比

    3半监督学习

半监督学习:即训练集同时包含有标记样本数据和未标记样本数据。

举例:
●监督学习训练方式:

  • 半监督训练方式

4强化学习
强化学习:实质是,make decisions问题,即自动进行决策,并且可以做连续决策。

举例:
小孩想要走路,但在这之前,他需要先站起来,站起来之后还要保持平衡,接下来还要先迈出一条腿,是左腿还是右腿,迈出一步后还要迈出下一-步。

小孩就是agent,他试图通过采取行动(即行走)来操纵环境(行走的表面),并且从一个状态转变到另
一个状态(即他走的每一步),当他完成任务的子任务(即走了几步)时,孩子得到奖励(给巧克力
吃),并且当他不能走路时,就不会给巧克力。

主要包含四个元素: agent, 环境状态,行动,奖励;

强化学习的目标就是获得最多的累计奖励。

监督学习和强化学习的对比:

拓展阅读: Alphago进化史漫画告诉你Zero为什么这么牛http://sports. sina.com.cn/chess/weiqi/2017-10-
21/doc-ifymyyxw4023875.shtml

5机器学习算法分类
●监督学习(supervised lerning) (预测)

  • 定义:输入数据是由输入特征值和目标值所组成。函数的输出可以是一个连续的值(称为回归),或是输出是有限个离散值(称作分类)。

  • In: 有标签,Out:有反馈
    目的:预测结果
    案例:猫狗分类,房价预测

  • 分类 k-近邻算法、贝叶斯分类、决策树与随机森林、逻辑回归、神经网络

  • 回归 线性回归、岭回归
    ●无监督学习(unsupervised learning)

  • 定义:门输入数据是由输入特征值所组成。

  • In:无标签,Out:无反馈
    目的:发现潜在结构
    案例:“物以类聚,人以群分”

  • 聚类k-means , 降维
    ●半监督学习

  • 已知:训练样本Data和待分类的类别
    未知:训练样本有无标签均可
    应用(案例) :训练数据量过多时,监督学习效果不能满足需求.因此用来增强效果。

●强化学习

  • In: 决策流程及激励系统,Out: 一系列行动
    目的:长期利益最大化,回报函数(只会提示你是否在朝着目标方向前进的延迟反映)
    案例:学下棋
    算法:马尔科夫决策,动态规划

6小结
●监督学习 - - - 有特征值,有目标值[重点]

  • 回归问题 - - - 目标值是连续
  • 分类问题 - - - 目标值是离散的
    ●无监督学习 - - - 有特征值,无目标值
    ●半监督学习 - - - 有特征值,但是一部分数据有目标值,其他数据没有目标值
    ●强化学习 - - - 根据动态数据
  • 主要关注四个元素: agent, environment, action, reward

1.6.模型评估

学习目标

  • 目标

  • 了解机器学习中模型评估的方法

  • 知道过拟合、欠拟合发生情况

  • 应用


模型评估是模型开发过程不可或缺的一部分。它有助于发现表达数据的最佳模型和所选模型将来工作的性能如何。按照数据集的目标值不同,可以把模型评估分为分类模型评估和回归模型评估。


1分类模型评估
●准确率

  • 预测正确的数占样本总数的比例。

●精确率

  • 正确预测为正占全部预测为正的比例

●召回率

  • 正确预测为正占全部正样本的比例

●F1-score

  • 主要用于评估模型的稳健性

●AUC指标

  • 主要用于评估样本不均衡的情况

2.回归模型评估


3拟合
模型评估用于评价训练好的的模型的表现效果,其表现效果大致可以分为两类:过拟合、欠拟合。

在训练过程中,你可能会遇到如下问题:
训练数据训练的很好啊,误差也不大,为什么在测试集上面有问题呢?
当算法在某个数据集当中出现这种情况,可能就出现了拟合问题。

3.1欠拟合

因为机器学习到的天鹅特征太少了,导致区分标准太粗糙,不能准确识别出天鹅。

3.2过拟合

机器已经基本能区别天鹅和其他动物了。然后,很不巧已有的天鹅图片全是白天鹅的,于是机器经过学习后,会认为天鹅的羽毛都是白的,以后看到羽毛是黑的天鹅就会认为那不是天鹅。

过拟合(ove-itting) : 所建的机器学习模型或者是深度学习模型在训练样本中表现得过于优越,导致在验证数据集以及测试数据集中表现不佳。

4小结
●分类模型评估[知道]

  • 精确率 - - - 查的准
  • 召回率 - - - 查的全
  • F1-score - - - 评判模型的稳健性

●回归模型评估[知道]

  • MSE - - - 均方误差
  • RMSE - - - 均方根误差
  • MAE - - - 平方绝对误差

●拟合[掌握]

  • 举例-判断是否是人

1.7.Azure机器学习模型搭建实验

学习目标

  • 目标

  • 了解Azure机器学习平台

  • 应用

  • 使用Azure平台完成机器学习简单实验


Azure平台简介

Azure Machine Learning (简称“AML") 是微软在其公有云Azure上推出的基于Web使用的一项机器学习服务,机器学习属人工智能的一个分支,它技术借助算法让电脑对大量流动数据集进行识别。这种方式能够通过历史数据来预测未来事件和行为,其实现方式明显优于传统的商业智能形式。

微软的目标是简化使用机器学习的过程,以便于开发人员、业务分析师和数据科学家进行广泛、便捷地应用。

这款服务的目的在于“将机器学习动力与云计算的简单性相结合”。

AML目前在微软的Global Azure云服务平台提供服务,用户可以通过站点: https://studio.azureml.net/申请免费试用。

●Azure机器学习实验
实验目的:了解机器学习从数据到建模并最终评估预测的整个流程。

1.8.深度学习简介【了解】

学习目标

  • 目标

  • 了解什么是深度学习

  • 应用


1.深度学习 - - - 神经网络简介

●深度学习演示
链接http://playground.tensorflow.org

2.深度学习各层负责内容

神经网络各层负责内容:
1层:负责识别颜色及简单纹理

2层:一些神经元可以识别更加细化的纹理,布纹,刻纹,叶纹等

3层:一些神经元负责感受黑夜里的黄色烛光,高光,萤火,鸡蛋黄色等。

4层:一些神经元识别萌狗的脸,宠物形貌,圆柱体事物,七星瓢虫等的存在。

5层:一些神经元负责识别花,黑眼圈动物,鸟,键盘,原型屋顶等。

增加层数: 通过更抽象的概念识别物体,器官曾,分子层,原子层。
增加节点数: 增加同一层物质的种类。

4.小结

  • 深度学习的发展源头 - - - 神经网络【了解】

2.机器学习基础环境安装与使用

学习目标

  • 完成机器学习基础阶段的所有环境安装
  • 应用jupyter notebook完成代码编写运行

2.1 库的安装

学习目标

  • 目标

  • 搭建好机器学习基础阶段的环境

  • 应用


整个机器学习基础阶段会用到Matplotib. Numpy. Pandas等库, 为了统- -版本号在环境中使用,将所有的库及其版本放到了文件requirements.txt当中,然后统-一安装。

新建一个用于人工智能环境的虚拟环境

mkvirtualenv -p /user/local/bin/python3 ai
matplotlib==2.2.2
numpy==1.14.2
pandas==0.20.3
tables==3.4.2
jupyter==1.0.0

使用pip命令安装

pip install -r requirements. txt

小结
●注意:

  • 每个包安装的过程中,尽量指定稳定版本进行安装

2.2 jupyter notebook使用

学习目标

  • 目标

  • 学会使用 jupyter notebook编写运行代码

  • 应用

  • 创建文件

  • 操作cell

  • 运行操作


1 jupyter notebook介绍
Jupyter项目是一个非盈利的开源项目,源于2014年的ipython项目, 因为它逐渐发展为支持跨所有编程语言的交互式数据科学和科学计算

●Jupyter Notebook,原名IPython Notbook,是IPython的加强网页版, 一个开源Web应用程序
●名字源自Julia、Python和R (数据科学的三种开源语言)
●是一款程序员和科学工作者的编程/文档/笔记/展示软件
●.ipynb文件格式是用于计算型叙述的JSON文档格式的正式规范

Jupyter项目旨在开发跨几十种编程语言的开源软件,开放标准和用于交互式计算的服务。

2 为什么使用Jupyter Notebook?
●传统软件开发: 工程/目标明确

  • 需求分析,设计架构,开发模块,测试

●数据挖掘: 艺术/目标不明确

  • 目的是具体的洞察目标,而不是机械的完成任务
  • 通过执行代码来理解问题
  • 迭代式地改进代码来改进解决方法

实时运行的代码、叙事性的文本和可视化被整合在一起,方便使用代码和数据来讲述故事

对比Jupyter Notebook和Pycharm
●画图

●数据展示

  • 总结: Jupyter Notebook 相比 pycharm 在画图和数据展示方面更有优势。

3 Jupyter Notebook的使用-helloworld
3.1界面启动、创建文件
●界面启动
环境搭建好后,本机输入jupyter notebook命令,会自动弹出浏览器窗口打开Jupyter Notebook

#进入虚拟环境
workon ai
#输入命令
jupyter notebook

本地notebook的默认URL为: http://localhost:8888
想让notebook打开指定目录,只要进入此目录后执行命令即可

● 新建notebook文档

  • notebook的文档格式是.ipynb

    ●内容操作界面 - - - helloworld

标题栏:点击标题(如Untitled) 修改文档名菜单栏

●导航-File-Download as, 另存为其他格式
●导航-Kernel

  • Interrupt, 中断代码执行(程序卡死时)
  • Restart, 重启Python内核(执行太慢时重置全部资源)
  • Restart & Clear Output,重启并清除所有输出
  • Restart & Run AlI,重启并重新运行所有代码

3.2 cell 操作
什么是cell?
cell: 一对In Out会话被视作一个代码单元, 称为cell

Jupyter支持两种模式 :
●编辑模式(Enter)

  • 命令模式下回车Enter或鼠标双击cell进入编辑模式
  • 可以操作cell内文本或代码,剪切 / 复制 /粘贴移动等操作

●命令模式(Esc)

  • 按Esc退出编辑,进入命令模式
  • 可以操作cell单元本身进行 剪切 / 复制 / 粘贴 / 移动等操作

3.2.1鼠标操作

3.2.2 快捷键操作

●两种模式通用快捷键

  • Shift+Enter,执行本单元代码,并跳转到下一单元
  • Ctrl+Enter,执行本单元代码,留在本单元

cel行号前的“,表示代码正在运行

●命令模式 : 按ESC进入

  • Y , cel切换到Code模式
  • M ,cell切换到Markdown模式
  • A , 在当前cell的上面添加cell
  • B , 在当前Cell的下面添加cell
  • 双击D : 删除当前cell
  • Z , 回退
  • L ,为当前Cel加上行号<!–
  • Ctrl+Shift+P ,对话框输入命令直接运行
  • 快速跳转到首个cell, Crtl+Home
  • 快速跳转到最后一个cell,Crtl+End -->

●编辑模式:按Enter进入

  • 多光标操作: Ctrl键点击鼠标 (Mac:CMD+点击鼠标)
  • 回退: Ctrl+Z (Mac:CMD+Z)
  • 重做: Ctrl+Y (Mac:CMD+Y)
  • 补全代码: 变量、方法后跟Tab键
  • 为一行或多行代码添加/取消注释: Ctrl+/ (Mac:CMD+/)
  • 屏蔽自动输出信息 : 可在最后一条语句之后加一个分号

3.3 markdown 演示


4.【拓展】- - - - Jupyter Notebook中自动补全代码等相关功能拓展

效果展示:

4.1安装jupyter. contrib_ nbextensions库

安装该库的命令如下:

python -m pip install jupyter._contrib_ nbextensions

然后执行:

jupyter contrib nbextension install --user --skip-running-check

在原来的基础.上勾选: “Table of Contents"以及"Hinterland”
部分功能:

5小结
●为什么要使用jupyter

  • 用于数据探索过程

●是什么

  • 是一个ipython的web加强版

●怎么用

3. Matplotlib

学习目标
●知道Matplotlib的架构
●应用Matplotlib的基本功能实现图形显示
●应用Matplotlib实现多图显示
●应用Matplotlib实现不同画图种类


3.1 Matplotlib之HelloWorld

学习目标

●目标

  • 了解什么是matplotlib
  • 为什么要学习matplotlib
  • matplotlib的三层结构介绍

●应用


1 什么是Matplotlib

●是专门用于开发2D图表(包括3D图表)

●使用起来及其简单

●以渐进、交互式方式实现数据可视化

2 为什么要学习Matplotib

可视化是在整个数据挖掘的关键辅助工具,可以清晰的理解数据,从而调整我们的分析方法。
●能将数据进行可视化,更直观的呈现
●使数据更加客观、更具说服力

例如下面两个图为数字展示和图形展示:

3 实现一个简单的Matplotlib画图

import matplotlib.pyplot as plt
# 1.创建画布
plt. figure(figsize=(20,8),dpi=100)
# 2.绘制图像
x = [1,2,3]
y = [4,5,6]
plt.plot(x, y)
# 3.显示图像
plt. show( ) ;

4.认识Matplotlib图像结构(拓展,了解)

5 Matplotlib三层结构(拓展,了 解)
5.1容器层
容器层主要由Canvas、Figure、 Axes组成。
Canvas是位于最底层的系统层,在绘图的过程中充当画板的角色,即放置画布(Figure)的工具。
Figure是Canvas上方的第一层,也是需要用户来操作的应用层的第一层,在绘图的过程中充当画布的角色。
Axes是应用层的第二层,在绘图的过程中相当于画布上的绘图区的角色。

●Figure: 指整 个图形可以通过plt.figure()设置画布的大小和分辨率等)
●Axes(坐 标系): 数据的绘图区域
●Axis(坐标轴): 坐标系中的一条轴,包含大小限制、刻度和刻度标签

特点为:
●一个figure(图像)可以包含 多个axes(坐标系/绘图区),但是一个axes只能属于一个figure。
●一个axes(坐标系/绘图区)可以包含多个axis(坐标轴),包含两个即为2d坐标系,3个即为3d坐标系

5.2辅助显示层

辅助显示层为Axes(绘图区)内的除了根据数据绘制出的图像以外的内容,主要包括Axes外观(facecolor)、边框线(spines)、坐标轴(axis)、坐标轴名称(axis label)、坐标轴刻度(tick)、坐标轴刻度标签(tick label)、网格线(grid)、图例(legend)、 标题(title)等内容。

该层的设置可使图像显示更加直观更加容易被用户理解,但又不会对图像产生实质的影响。

5.3图像层
图像层指Axes内通过plot、scatter、 bar.、histogram、pie等 函数根据数据绘制出的图像。


●总结:
。Canvas (画板) 位于最底层,用户一般接触不到
。Figure (画布)建立在Canvas之上
。Axes (绘图区)建立在Figure之上
。坐标轴(axis) 、图例(legend) 等辅助显示层以及图像层都是建立在Axes之上

3.2折线图(plot)与基础绘图功能

学习目标

●目标

  • 学习折线图的绘制和图形保存
  • 给图形添加辅助功能(如:标注、x,y轴名称、 标题等)
  • 多次plot绘制图形
  • 多个坐标系显示图形
  • 知道折线图的应用场景

●应用

  • 天气的温度变化显示

1 折线图绘制与保存图片

为了更好地理解所有基础绘图功能,我们通过天气温度变化的绘图来融合所有的基础API使用

1.1 matplotlib.pyplot模块
matplotlib.pytplot包含了一系列类似于matlab的画图函数。它的函数作用于当前图形(figure)的当前坐标系(axes)。

import matplotlib.pyplot as plt

1.2折线图绘制与显示
展现上海一周的天气, 比如从星期一到星期日的天气温度如下

# 1.创建画布(容器层)
plt.figure(figsize=(10,101))
# 2.绘制折线图(图像层)
plt.plot([1, 2, 3, 4, 5, 6 ,7], [17,17,18,15,11,11,131])
# 3.显示图像
plt. show()

可以看到这样显示效果并不好,我们可以加入更多的功能:

1.3设置画布属性与图片保存

plt.figure(figsize=(), dpi=)figsize:指定图的长宽dpi:图像的清晰度返回fig对象
plt.savefig(path)
# 1.创建画布,并设置画布属性
plt. figure(figsize=(20, 8),dpi=80)
# 2.保存图片到指定路径
plt. savefig(" test. png" )

●注意: plt.show()会释放figure资源,如果在显示图像之后保存图片将只能保存空图片。【图像保存一定要放到show()前面】

2 完善原始折线图1 (辅助显示层)
案例: 显示温度变化状况

需求: 画出某城市11点到12点1小时内每分钟的温度变化折线图,温度范围在15度~18度

效果:

2.1 准备数据并画出初始折线图

#画出温度变化图# 0.准备X,y坐标的数据
x = range(60)
y_ shanghal = [random. uniform(15,18) for i in x]# 1.创建画布
plt.figure(figsize=(20,8), dpi=80)# 2.绘制折线图
plt.plot(x, y_ .shanghai)# 3.显示图像
plt. show( )

2.2添加自定义x,y刻度

●plt.xticks(x, **kwargs)
x:要显示的刻度值
●plt.yticks(y, **kwargs)
y:要显示的刻度值

#增加以下两行代码#构造x轴刻度标签
x_ticks_label = ["11点{}分".format(i) for 1 in x]#构造y轴刻度
y_ ticks = range(40)#修改x,y轴坐标的刻度显示
plt.xticks(x[::5],x _ticks_ label[::5]) #必须最开始传递进去的是数字
plt.yticks(y_ ticks[::5])

如果没有解决过中文问题的话, 会显示这个样子:

2.3 中文显示问题解决
下载中文字体(黑体,看准系统版本)

●下载SimHei字体(或者其他的支持中文显示的字体也行)

●安装字体

  • linux下: 拷贝字体到usr/share/fonts下:
sudo cp ~/SimHei.ttf /usr/share/fonts/SimHei.ttf
  • windows和mac下: 双击安装

●删除~/.matplotlib中的缓存文件

cd ~/.matplotlib
rm -r *

●修改配置文件matplotibrc

vi ~/.matplotlib/matplotlibrc

将文件内容修改为:

font.family : sans-serif
font.sans-serif: SimHei
axes.unicode_ minus : False

2.4 添加网格显示
为了更加清楚地观察图形对应的值

plt.grid(True, linestyle='--', alpha=0.5) 

2.5添加描述信息
添加x轴、y轴描述信息及标题

plt.xlabel("时间")
plt.ylabel("温度")
plt. title("一小时温度变化图",fontsize=20)

3.1 多次plot
需求 : 再添加一个城市的温度变化
收集到北京当天温度变化情况,温度在1度到3度。怎么去添加另一个在同一坐标系当中的不同图形,其实很简单只需要再次plot即可,但是需要区分线条,如下显示

#增加北京的温度数据
y_ beijing = [random. uniform(1, 3) for i in x]
#绘制折线图
plt.plot(x, y_ shanghai, label=" 上海")
#使用多次plot可以画多个折线
plt.plot(x, y_ beijing, color='r', linestyle='-', label="北京")
#显示图例
plt. legend(loc="best" )

我们仔细观察,用到了两个新的地方,一个是对于不同的折线展示效果,一个是添加图例。

3.2设置图形风格


显示图例
●注意:如果只在plt.plot0中设置label还不能最终显示出图例,还需要通过plt.legend0将图例显示出来。

plt. Legend(ioc="best")

完整代码 :

import random#多次plot
# 0.创建数据
x = range(60)
y_ shanghai = [random. uniform(15,18) for i in x]
y_ beijing = [random. uniform(-5, 5) for i in x]# 1.创建画布
plt.figure(figsize=(20, 8),dpi=100)# 2.绘制图
plt.plot(x, y_ shanghai, label="上海", color="r", Linestyle="--")
plt.plot(x, y. beijing, labeL="北京")# 2.1添加x, y轴的刻度
x _labels_ ticks = ["11点{}分".format(i) for i in x]
y_ labels_ ticks = range(-10, 30)plt.xticks(x[::5], x _labels_ ticks[::5])
plt.yticks(y_ labels_ ticks[::5]) # 2.2添加网格线
plt.grid(linestyle="--", alpha=0.5)# 2.3添加描述信息
plt.xlabel("时间",fontsize=16)
plt.ylabel("温度",fontsize=16)
plt. title("某城市11点-12点温度变化”,fontsize=20)# 2.4增加图例
plt. Legend(loc="best")# 3.显示
plt. show()

4 练一练
练习多次plot流程(从上面复制代码,到自己电脑,确保每人环境可以正常运行),
同时明确每个过程执行实现的具体效果.

5 多个坐标系显示—plt.subplots(面向对象的画图方法)
如果我们想要将上海和北京的天气图显示在同一个图的不同坐标系当中,效果如下:

可以通过subplots函数实现(旧的版本中有subplot,使用起来不方便),推荐subplots函数
●matplotlib.pyplot.subplots(nrows=1, ncols=1, *fig_kw) 创建一个带有多个axes(坐标系/绘图区)的图

Parameters:
nrows, ncols : int, optional, default: 1,Number of rows/columns of the subplot grid.
**fig_Kw : All additional keyword arguments are passed to the figure() call.
Returns:
fig :图对象
ax :
设置标题等方法不同:
set_ xticks
set._yticks
set_ xlabel
set_ ylabel

关于axes子坐标系的更多方法:参考https://matplotlib.org/api/axes_api.html#matplotlib.axes.Axes

●注意: plt.函数名() 相当于面向过程的画图方法,axes.set_方法名() 相当于面向对象的画图方法。

#需求:画出某城市11点到12点1小时内每分钟的温度变化折线图,温度范围在15度~18度
#多个axes
# 0.构造数据
x = range(60)
y_ shanghai = [random. uniform(15,18) for i in x]
y_ beijing = [random. uniform(1, 14) for i in x]# 1.创建画布
# plt.figure(figsize=(20, 8))
fig, axes = plt. subplots (nrows=1, ncols=2, figsize=(20, 8),dpi=100)# 2.图像绘制
# plt.plot(x, y_ shanghai, label="上海")
# plt.plot(x, y_ beijing, label="北京", linestyle-=--", color=" r")
axes[0].plot(x, y_ shanghai, label="上海")
axes[1].plot(x, y_ beijing, label="北京", linestyle="--", color="r")# 2.1添加X,y轴刻度
x_ ticks _label = ["11点{}分".format(i) for i in x]
y_ ticks = range(40)#plt.xticks(x[::5],x_ ticks_label[::5])
# plt.yticks(y_ticks[::5])
axes[0].set_ xticks(x[::5])
axes[0].set_yticks(y_ ticks[::5])
axes[0].set_ xticklabels(x_ ticks_label[::5])
axes[1].set_ xticks(x[::5])
axes[1].set_ yticks(y_ ticks[::5])
axes[1].set_ xticklabels(x_ ticks_ label[::5])# 2.2添加网格显示
# plt.grid(True, Linestyle=--", alpha=0.5)
axes [0].grid(True, linestyle="--", alpha=0.5)
axes[1].grid(True, linestyle="--", alpha=0.5)# 2.3添加x,y轴描述和标题
# plt.xlabel("时间” )
# plt.ylabel("温度")
# plt.title("中午11点--12点温度变化图”,fontsize=25)
axes[0].set_xlabel("时间" )
axes[0].set_ylabel("温度" )
axes[0].set_title(" 上海中午11点--12点温度变化图",fontsize=25)
axes[1].set_xlabel("时间" )
axes[1].set_ylabel("温度" )
axes[1].set_title("北京中午11点--12点温度变化图",fontsize=25)# 2.4显示图例
# plt.legend(loc=0)
axes[0].legend(loc=0)
axes[1].legend(loc=0)# 3.显示
plt.show() ;

6 折线图的应用场景

●呈现公司产品(不同区域)每天活跃用户数

●呈现app每天下载数量

●呈现产品新功能上线后,用户点击次数随时间的变化

●拓展 : 画各种数学函数图像
注意: plt.plot()除了可以画折线图,也可以用于画各种数学函数图像


代码:

import numpy as np
# 0.生成数据
x = np.linspace(-10, 10, 1000)
y = np.sin(x)# 1.创建画布
plt. figure(figsize=(20, 8), dpi=100)# 2.绘制函数图像
plt.plot(x, y)# 2.1添加网格显示
plt.grid()# 3.显示图像
plt.show( )

7 小结
●图像保存[知道]

  • plt.savefig(“路径”)

●添加x,y轴刻度【知道】

  • plt.xticks()
  • plt.yticks()
  • 注意:在传递进去的第一个参数必须是数字,不能是字符串,如果是字符串吗,需要进行替换操作

●添加网格显示【知道】

  • plt.grid(linestyle="–", alpha=0.5)

●添加描述信息【知道】

  • plt.xlabel()
  • plt.ylabel()
  • plt.title()

●多次plot 【了解】

  • 直接进行添加就OK

●显示图例【知道】

  • plt.legend(loc= “best”)
  • 注意:一定要在plt.plot()里面设置一个label,如果不设置 ,没法显示

●多个坐标系显示【了解】

  • plt.subplots(nrows=, ncols=)

●折线图的应用【知道】

  • 1.应用于观察数据的变化
  • 2.可是画出一些数学函数图像

3.3.常见图形绘制

学习目标

●目标

  • 掌握常见统计图及其意义
  • 绘制散点图和柱状图

●应用

  • 探究不同变量之间的关系

Matplotlib能够绘制折线图、散点图、柱状图、直方图、饼图。

我们需要知道不同的统计图的意义,以此来决定选择哪种统计图来呈现我们的数据。


1 常见图形种类及意义
折线图 : 以折线的上升或下降来表示统计数量的增减变化的统计图
特点 : 能够显示数据的变化趋势,反映事物的变化情况。(变化)
api: plt.plot(x, y)

散点图:用两组数据构成多个坐标点,考察坐标点的分布,判断两变量之间是否存在某种关联或总结坐标点的分布模式。
特点:判断变量之间是否存在数量关联趋势,展示离群点(分布规律)
api: plt.scatter(x, y)

柱状图:排列在工作表的列或行中的数据可以绘制到柱状图中。
特点:绘制连离散的数据,能够一眼看出各个数据的大小,比较数据之间的差别。(统计/对比)
**api: plt.bar(x, width, align=’ center’, kwargs)

Parameters:
X : sequence of scalars.width : scalar or array-like, optional
柱状图的宽度align : {'center', 'edge'}, optional, default: 'center'
Alignment of the bars to the x coordinates:
'center': Center the base on the x positions.
'edge': Align the left edges of the bars with the x positions .
每个柱状图的位置对齐方式**kwargs :
color:选择柱状图的颜色


●**直方图:**由一系列高度不等的纵向条纹或线段表示数据分布的情况。一般用横轴表示数据范围,纵轴表示分布情况。

特点:绘制连续性的数据展示一组或者多组数据的分布状况(统计)
api: matplotlib.pyplot.hist(x, bins=None)

Parameters:
x : (n,) array or sequence of (n,) arraysbins : integer or sequence or 'auto', optional
组距


●**饼图:**用于表示不同分类的占比情况,通过弧度大小来对比各种分类。
特点:分类数据的占比情况(占比)
api: plt.pie(x, labels=,autopct=,colors)

x:数量,自动算百分比
labels:每部分名称
autopct:占比显示指定%1.2f%%
colors:每部分颜色

2散点图绘制
需求:探究房屋面积和房屋价格的关系
房屋面数据:

x = [225.98, 247.07, 253.14, 457.85, 241.58,301.01, 20.67, 288.64,163.56,120.06, 207.83, 342.75, 147.9 ,53.06, 224.72,29.51,21.61,483.21, 245.25, 399.25, 343.35]

房屋价格数据:

y = [196.63, 203.88, 210.75, 372.74, 202.41, 247.61, 24.9 ,239.34,140.32,104.15, 176.84, 288.23, 128.79, 49.64, 191.74, 33.1 ,30.74,400.02, 205.35, 330.64, 283.45]


代码:

# 0.准备数据
x = [225.98, 247.07, 253.14, 457.85, 241.58, 301.01, 20.67, 288.64,163.56,120.06, 207.83, 342.75, 147.9 ,53.06,224.72, 29.51,21.61, 483.21, 245.25,399.25, 343.35]
y = [196.63, 203.88, 210.75, 372.74, 202.41, 247.61, 24.9 ,239.34,140.32, 104.15, 176.84, 288.23, 128.79,49.64, 191.74,33.1 ,30.74,400.02, 205.35, 330.64, 283.45]# 1.创建画布
plt. figure(figsize=(20, 8),dpi=100)# 2.绘制散点图
plt.scatter(x, y)# 3.显示图像
plt. show()

3 柱状图绘制
需求一对比每部电影的票房收入
电影数据如下图所示:


1 准备数据

['雷神3:诸神黄昏','正义联盟','东方快车谋杀案,'寻梦环游记','全球风暴','降魔传", '追捕','七十七天','密战','狂兽','其他']
[73853, 57767, 22354, 15969, 14839, 8725, 8716, 8318, 7916, 6764, 52222]

2 绘制
●matplotlib.pyplot.bar(x, width, align=‘center’, **kwargs)
绘制柱状图
代码:

# 0.准备数据
#电影名字
movie_ name = ['雷神3: 诸神黄昏",‘正义联盟',‘东方快车谋杀案','寻梦环游记','全球风暴',‘降魔传','追捕','七十七天','密战','狂兽','其他']
#横坐标
x = range(len(movie_ name))
#票房数据
y = [73853, 57767,22354, 15969, 14839 ,8725, 8716, 8318,7916, 6764,52222]# 1.创建画布
plt. figure(figsize=(20, 8),dpi=100)# 2.绘制柱状图
plt.bar(x, y, width=0.5, color=['b','r','g','y','C','m",'y','k','c','g','b'])# 2.1修改x轴的刻度显示
plt.xticks(x, movie_ name)# 2.2添加网格显示
plt.grid(linestyle="--", alpha=0.5)# 2.3添加标题
plt. title(“电影票房收入对比")# 3.显示图像
plt. show()

参考链接:
htts://matplotlib.org/index.html

4 小结
●折线图【知道】
。能够显示数据的变化趋势,反映事物的变化情况。(变化)
。plt.plot()
●散点图【知道】
。判断变量之间是否存在数量关联趋势,展示离群点(分布规律)
。plt.scatter()
●柱状图【知道】
。绘制连离散的数据,能够- 眼看出各个数据的大小,比较数据之间的差别。(统计/对比)
。plt.bar(x, width, align=“center”)
●直方图【知道】
。绘制连续性的数据展示一组或者多组数据的分布状况(统计)
。plt.hist(x, bins)

4.Numpy

Numpy

学习目标

●了解Numpy运算速度上的优势
●知道数组的属性,形状、类型
●应用Numpy实现数组的基本操作
●应用随机数组的创建实现正态分布应用
●应用Numpy实现数组的逻辑运算
●应用Numpy实现数组的统计运算
●应用Numpy实现数组之间的运算

4.1Numpy 的优势

学习目标
●目标

  • 了解Numpy运算速度上的优势
  • 知道Numpy的数组内存块风格
  • 知道Numpy的并行化运算

●应用

  • 机器学习,深度学习各种框架的基础库

1 Numpy介绍

Numpy (Numerical Python)是一个开源的Python科学计算库,用于快速处理任意维度的数组。
Numpy支持常见的数组和矩阵操作。对于同样的数值计算任务,使用Numpy比直接使用Python要简洁的多。
Numpy使用ndarray对象来处理多维数组,该对象是一个快速而灵活的大数据容器。

2 ndarray介绍

NumPy provides an N-dimensional array type, the ndarray, which describes a collection of

NumPy提供了一个N维数组类型ndarray,它描述了相同类型的"items"的集合。

用ndarray进行存储:

import numpy as np#创建ndarray
score = np.array([[80, 89,86, 67, 79],
[78, 97, 89, 67, 81],
[90, 94, 78, 67, 74],
[91, 91, 90, 67, 69],
[76, 87, 75, 67, 86],
[70, 79, 84, 67, 84],
[94,92, 93, 67, 64],
[86,85, 83, 67, 80]]) score

返回结果:

array([[80, 89,86, 67, 79],
[78,97, 89, 67, 81],
[90,94,78, 67, 74],
[91, 91, 90, 67, 69],
[76,87, 75, 67, 86],
[70,79,84, 67, 84],
[94,92, 93, 67,64],
[86,85, 83, 67,80]])

使用Python列表可以存储一维数组, 通过列表的嵌套可以实现多维数组,那么为什么还需要使用Numpy的ndarray呢?

3 ndarray与Python原生list运算效率对比

在这里我们通过一段代码运行来体 会到ndarray的好处

import random
import time
import numpy as np
a=[]
for 1 in range(100000000):a. append( random. random())#通过time魔法方法,查看当前行的代码运行一次所花 费的时间
%time sum1=sum(a)
b=np.array(a)
%time sum2=np. sum(b)

其中第一个时间显示的是使用原生Python计算时间,第二个内容是使用numpy计算时间:

CPU times: user 852 ms, sys: 262 ms, total: 1.11 s
Wall time: 1.13 s
CPU times: user 133 ms, sys: 653 μs,total: 133 ms
wall time: 134 ms

从中我们看到ndarray的计算速度要快很多,节约了时间。
机器学习的最大特点就是大量的数据运算,那么如果没有一个快速的解决方案,那可能现在python也在机器学习领域达不到好的效果。

Numpy专门针对ndarray的操作和运算进行了设计,所以数组的存储效率和输入输出性能远优于Python中的嵌套列表,数组越大,Numpy的优势就越明显。

思考: ndarray为什么可以这么快?

4 ndarray的优势

4.1内存块风格
ndarray到底跟原生python列表有什么不同呢,请看一张图:

从图中我们可以看出ndarray在存储数据的时候,数据与数据的地址都是连续的,这样就给使得批量操作数组元素时速度更快。

这是因为ndarray中的所有元素的类型都是相同的,而Python列表 中的元素类型是任意的,所以ndarray在存储元素时内存可以连续,而python原生list就只能通过寻址方式找到下一 个元素,这虽然也导致了在通用性能方面Numpy的ndarray不及Python原生list,但在科学计算中,Numpy的ndarray就可以省掉很多循环语句,代码使用方面比Python原生list简单的多。

4.2 ndarray支持并行化运算(向量化运算)
意思就是可以进行数组和数组之间的运算,对应起来同时进行计算。

4.3效率远高于纯Python代码
Numpy底层使用C语言编写,内部解除了GIL (全局解释器锁), 其对数组的操作速度不受Python解释器的限制,所以,其效率远高于纯Python代码.

5小结

●numpy介绍【了解】

  • 一个开源的Python科学计算库
  • 计算起来要ipython简洁高效
  • Numpy使甩ndarray对象来处理多维数组

●ndarray介绍 【了解】

  • NumPy提供了一个N维数组类型ndarray.它描述了相同类型的"items"的集合。
  • 生成nmpy对像np.array()

●ndarray的优势【掌握】

  • 内存块风格

    • list - - - 分离式存储,存储内容多样化
    • ndarray - - - 一体式存储,存储类型必须一样
  • ndarray支持并行化运算(向量化运算)
  • ndarray底层是用C语言写的,效率更高,释放了GUL

4.2N维数组-ndarray

学习目标
●目标

  • 说明数组的属性,形状、类型

●应用


1 ndarray的属性
数组属性反应了数组本身固有的信息。

2 ndarray的形状
首先创建一些数组。

#创建不同形状的数组
>>> a = np.array([[1,2,3],[4,5,6]])
>>> b = np.array([1,2,3,4])
>>> C = np.array([[[1,2,3],[4,5,6]],[[1,2,3],[4,5,6]]])

分别打印出形状

>>> a. shape
>>> b. shape
>>> C. shape
(2, 3) #二维数组
(4,) # 一维数组
(2, 2, 3) #三维数组

如何理解数组的形状?
二维数组:

三维数组:

3 ndarray的类型

>>> type (score. dtype)
<type ' numpy.dtype'>

dtype是numpy.dtype类型,先看看对于数组来说都有哪些类型


创建数组的时候指定类型

>>> a = np.array([[1, 2, 3],[4, 5, 6]],dtype=np. float32)
>>> a. dtype
dtype('float32')
>>> arr =np.array(['python', 'tensorflow', 'scikit-learn', 'numpy'], dtype = np.string_ )
>>> arr
array( [b'python', b'tensorflow', b'scikit-learn', b'numpy'], dtype=' |S12')

●注意:若不指定,整数默认int64,小数默认float64

4总结
知道数组的基本属性,不同形状的维度表示以及数组的类型

4.3基本操作

学习目标
●目标

  • 理解数组的各种生成方法
  • 应用数组的索引机制实现数组的切片获取
  • 应用维度变换实现数组的形状改变
  • 应用类型变换实现数组类型改变
  • 应用数组的转换

●应用

  • 应用正态分布实现模拟股票的涨跌幅数据操作

1 生成数组的方法
1.1 生成0和1的数组
●np.ones(shape[, dtype, order])
●np.ones_Jike(a[, dtype, order, subok])
●np.zeros(shape[, dtype, order])
●np.zeros_like(a[, dtype, order, subok])

>>> zero = np.zeros([3, 4])
array([[0.,0.,0.,0.],[ 0., 0.,0.,0.],[ 0., 0.,0.,0.]])

1.2从现有数组生成
1.2.1生成方式
●np.array(object[, dtype, copy, order, subok, ndmin])
●np.asarray(a[, dtype, order])

a = np.array([[1,2,3],[4,5,6]])
#从现有的数组当中创建
a1 = np.array(a)
#相当于索引的形式,并没有真正的创建一个新的
a2 = np.asarray(a)注:
浅拷贝相当于创建一个快捷方式
深拷贝相当于把文件复制一份

1.2.2关于array和asarray的不同


注:
浅拷贝相当于创建一个快捷方式
深拷贝相当于把文件复制一份

1.3生成固定范围的数组
●np.linspace (start, stop, num, endpoint)
生成等间隔的序列

start序列的起始值
stop序列的终止值,
num要生成的等间隔样例数量,默认为50
endpoint序列中是否包含stop值,默认为ture
#生成等间隔的数组
np. linspace(0, 100, 11)

返回结果:

array([ 0., 10. ,20., 30., 40., 50., 60., 70., 80., 90.,100.])

●其它的还有
。numpy.arange(start,stop, step, dtype)
。numpy.logspace(start,stop, num)

np.arange(10, 50,2)

返回结果:

array([10, 12, 14, 16,18, 20, 22, 24, 26, 28, 30, 32, 34,36,38,40,42,44,46,48])
#生成10^x
np. logspace(0, 2, 3)

返回结果:

array([ 1.,10., 100.])

1.4生成随机数组
1.4.1使用模块介绍

●np.random模块

1.4.2均匀分布
●np.random.rand(d0, d1… dn)
返回[0.0,1.0)内的一 组均匀分布的数。

●np.random.uniform(low=0.0, high=1.0, size=None)
功能: 从一个均匀分布[|ow,high)中随机采样,注意定义域是左闭右开,即包含low, 不包含high.
参数介绍:
low:采样下界,float类型, 默认值为0;
high:采样上界,float类型, 默认值为1;
size:输出样本数目,为int或元组(tuple)类型, 例如,size=(m,n,K), 则输出mnk个样本,缺省时输出1个值。
返回值: ndarray类型, 其形状和参数size中描述一致。

●np.random.randint(low, high=None, size=None, dtype=’/’)
从一个均匀分布中随机采样,生成一个整数或N维整数数组,取数范围:若high不为None时,取[low,high)之间随机整数,否则取值[0,low)之间随机整数。

#生成均匀分布的随机数
x1 = np. random. uniform(-1,1, 10000000)

返回结果:

array([ 0.22411206, 0.31414671, 0. 85655613,... ,-0.92972446,0.95985223,0.23197723])

画图看分布状况:

import matplotlib.pyplot as plt#生成均匀分布的随机数
x1 = np. random. uniform(-1, 1, 100000000)#画图看分布状况
# 1)创建西布
plt.figure(figsize=(10,10), dpi=100)# 2)绘制直方图
plt.hist(x=x1, bins=1000) # x代表要使用的数据,bins表示要划分区间数# 3)显示图像
plt. show()


1.4.3正态分布
1.4.3.1基础概念复习: 正态分布 (理解)
a.什么是正态分布
正态分布是一种概率分布。正态分布是具有两个参数μ和σ的连续型随机变量的分布,第一参数μ是服从正态分布的随机变量的均值,第二个参数σ是此随机变量的方差,所以正态分布记作N(u, σ)。

b.正态分布的应用
生活、生产与科学实验中很多随机变量的概率分布都可以近似地用正态分布来描述。

c.正态分布特点
μ决定了其位置,其标准差σ决定了分布的幅度。当μ= 0,σ = 1时的正态分布是标准正态分布。

标准差如何来?
●方差
是在概率论和统计方差衡量一组数据时离散程度的度量

其中M为平均值,n为数据总个数,S为标准差, S^2可以理解一个整体为方差

●标准差与方差的意义
可以理解成数据的一个离散程度的衡量

1.4.3.2正态分布创建方式
●np.random.randn(d0, d1, … dn)
功能:从标准正态分布中返回一个或多个样本值

●np.random.normal(loc=0.0, scale=1.0, size=None)
loc: float
此概率分布的均值(对应着 整个分布的中心centre)
scale: float
此概率分布的标准差(对应于分布的宽度,scale越大越矮胖, scale越小, 越瘦高)
size: int or tuple of ints
输出的shape,默认为None,只输出一个值

●np.random.standard_normal(size =None)
返回指定形状的标准正态分布的数组。

x2 = np. random. normal(1.75,1, 100000000)

返回结果:

array([2. 90646763, 1.46737886, 2.21799024, ... 1.56047411, 1.87969135,0.9028096])
#生成均匀分布的随机数
x2 = np. random. normal(1.75,1, 100000000)#画图看分布状况
# 1)创建画布
plt. figure(figsize=(20,10), dpi=100) # 2)绘制直方图
plt.hist(x2, 1000)# 3)显示图像
plt. show()


例如:我们可以模拟生成. 一组股票的涨跌幅的数据

案例:随机生成8只股票2周的交易日涨幅数据
8只股票,**两周(10天)**的涨跌幅数据,如何获取?
●两周的交易日数量为: 2X5=10
●随机生成涨跌幅在某个正态分布内,比如均值0,方差1

股票涨跌幅数据的创建

#创建符合正态分布的8只股票10天的涨跌幅数据
stock_change = np. random. normal(o, 1, (8,10))
stock_change

返回结果:

array([[-0. 03862668,-1.46128096, -0.75596237, 0. 89737022, -1. 86978433,
0.38845392,1.14856354,-1.10912275, 1.28900021, -0. 86801677],
[ 1.8701446 ,0.50407342, -0.74396489, -1.69641331, -0.89969227,
2.42459765,0.78987443, -0. 82935223,0. 82546455,0. 40524289],
[-1.7365776,-0.81501515,-1.08974743,-1.4138561,0.85495155,
0.30076624,-2.0813311 ,1.52886975, 0. 62945643, -1. 48714683],
[-1.12084983,-0.63070289,-0.20677245,-0.49096973,-0.40551104,
-0.46320893,-0.73190969, 0. 00392486,2.524498 ,0. 25843191],
[ 0.05001371, 0.52267878,1.31974783,0. 64840953,1. 56360431,
-0.79233575,1.47275167, 0. 61070343, -0.33247221, -0.57492172],
[ 0.7092757 ,0. 00928591, 0.27008373, 0. 79050681, -0. 95887888,
0.03661459, 0.81303927,-0.54139691, 0. 69623969,0. 06570421],
[-1.40481949,0. 49151272,1. 01992235,1. 89152928, -0.76415623,
0.3100241,1.27156806, -1.76199057, -0.77419965, -0.17574386],
[-0.21745814,-1.78433763, -0.7953073 ,0.4765644 ,-0.2589575 ,
0.97014013, 1.67321489,1.73370987,0.29886514, 1.27186522]])

2数组的索引、切片
●获取第一个股票的前3个交易日的涨跌幅数据

#二维的数组,两个维度
stock_ change[o, 0:3]

返回结果:

array([-0. 03862668,-1. 46128096,-0. 75596237])

一维、二维、三维的数组如何索引?

#三维,一维
al = np.array([ [[1,2,3],[4,5,6]], [[12,3,34],[5,6,7]]])
#返回结果
array([[[ 1,2,3],[ 4,5, 6]],[[12,3, 34],[ 5,6,7]]])
#索引、切片
>>>a1[0,0,1]   #输出:2

3形状修改

让刚才的股票行、日期列反过来,变成日期行,股票列

●ndarray.reshape(shape[, order]) Returns an array containing the same data with a new shape.

#在转换形状的时候,一定要注意数组的元素匹配
stock_ .change. reshape([10, 8])
stock change. reshape([-1,20]) # 数组的形状被修改为: (4, 20), -1: 表示通过待计算

●ndarray.resize(new_shape[, refcheck]) Change shape and size of array in-place.

stock change.resize([10, 8])

●ndarray.T 数组的转置
将数组的行、列进行互换

stock_change. shape
(8, 10)
stock_ change.T. shape
(10, 8)

4类型修改

●ndarray.astype(type)

stock_change. astype(np. int32)

●ndarray.tostring([order])或者ndarray.tobytes([order])
Construct Python bytes containing theraw data bytes in the array.

。转换成bytes

arr = np.array([[[l, 2, 3], [4, 5, 6]], [[12, 3, 34],[5, 6, 7]]])
arr. tostring()

拓展:如果遇到

IOPub data rate exceeded .The notebook server will temporarily stop sending outputto the client in order to avoid crashing it.To change this limit, set the config variable*--NotebookApp. iopub_data_ rate_ Limit' 。

这个问题是在jupyer当中对输出的字节数有限制,需要去修改配置文件
创建配置文件

jupyter notebook --generate-config
vi ~/.jupyter/jupyter_notebook_config.py

取消注释,多增加

## (bytes/sec) Maximum rate at which messages can be sent on iopub before they are limited.
c.NotebookApp.iopub_data_rate_limit = 10000000

但是不建议这样去修改,jupyter输出太大会崩溃

5 数组的去重
●ndarray.unique

temp = np.array([1, 2, 3, 4],[3, 4, 5, 6]])
>>> np. unique (temp )
array([1, 2, 3, 4, 5, 6])

6小结
●创建数组【掌握】

  • 均匀
    ■np.random.rand()
    ■np.random.uniform(0, 1, 100)
    ■np.random.randint(0, 10, 10)
  • 随机(正态分布)
    ■里面需要关注的参数:均值:u,标准差:σ
    ■ u - - - 决定了这个图形的左右位置
    ■σ - - -决定了这个图形是瘦高还是矮胖

4.4ndarray运算

学习目标
●目标

  • 应用数组的通用判断函数
  • 应用np.where实现数组的三元运算

●应用

  • 股票涨跌幅数据逻辑运算

问题
如果想要操作符合某一条件的数据,应该怎么做?

1逻辑运算

#重新生成8只股票10个交易日的涨跌幅数据
>>> stock_change = np. random. normal(0, 1, (8, 10))
>>> stock_change = stock_change[0:5, 0:5]#逻辑判断,如果涨跌幅大于0. 5就标记为True香则为False
>>> stock_ change > 0.5
array([[True, False, False, True, False], [ True, True, False, False, False],[ True, False, True, False, Truel,[False, True, False, False, Falsel,[False, False, False, True, True]])# B00L赋值,将满足条件的设置为指定的值一布尔索引
>>> stock_change[stock_change > 0.5] = 1
array([[1.,-0.72404879, -1. 33045773,1 .,0.3869043 ],[ 1.1.0. 20815446,-1. 67860823,0. 06612823],[ 1.,0.42753488, 1., -0.24375089, 1][-0.971945,1.,-0.5444661, -0.2602084 ,-0. 48736497],[-0.32183056,-0. 92544956,-0. 42126604,1.]])

2. 通用判断函数

●np.all()
满足所有要求返回Ture

#判断stock_ change[0:2, 0:5]是否金是上涨的
>>> np.all(stock .changel0:2, 0:5] > 0)
False

●np.any()
只要有一个满足要求,就返回Ture

#判断前5只股票这段期间是否有上涨的
>>> np. any(stock_ .change[0:5,:]➢0 )
True

3 np.where (三元运算符)

通过使用np.where能够进行更加复杂的运算

●np.where()

#判断前四个股票前四天的涨跌幅   大于0的置为1,否则为0
temp = stock. .changel:4, :4]
np.where(temp > 0, 1, 0)

●复合逻辑需要结合np.logical _and和np.logical_or使用
np.logical _and 逻辑与
np.logical _or 逻辑或

#判断前四个股票前四天的涨跌幅  大于0.5并且小于1的,换为1,否则为0
#判断前四个股票前四天的涨跌幅  大于0. 5或者小于-0.5的,换为1,否则为0
np. where(np. logical and(temp > 0.5,temp < 1),1, 0)
np. where(np. logical or(temp > 0.5,temp < -0.5), 1, 0)

4 统计运算
如果想要知道涨幅或者跌幅最大的数据,应该怎么做?

4.1统计指标

在数据挖掘/机器学习领域,统计指标的值也是我们分析问题的一种方式。常用的指标如下:

●min(a[, axis, out, keepdims])
。Return the minimum of an array or minimum along an axis.
●max(a[, axis, out, keepdims])
。Return the maximum of an array or maximum along an axis.
●median(a[, axis, out, overwrite_ input, keepdims]) 中位数
。Compute the median along the specified axis.
●mean(a[, axis, dtype, out, keepdims])
。Compute the arithmetic mean along the specified axis.
●std(a[, axis, dtype, out, ddof, keepdimsl) 标准差
。Compute the standard deviation along the specified axis.
●var(a[, axis, dtype, out, ddof, keepdims]) 方差
。Compute the variance along the specified axis.

4.2案例:股票涨跌幅统计运算

进行统计的时候,axis 轴的取值并不一定, Numpy中不同的API轴的值都不-一样,在这里,axis 0代表列,axis 1代表行去进行统计

#接下来对于这4只股票的4天数据,进行一些统计运算
#指定行  去统计
print("前四只股票前四天的最大涨幅{}" . format(np. max(temp, axis=1)))#使用min, std, mean
print("前四只股票前四天的最大跌幅{}" . format(np.min(temp, axis=1)))
print("前四只股票前四天的波动程度()*".format(np.std( temp, axis=1)))
print ("前四只股票前四天的平均涨跌幅{}”. format(np. mean(temp, axis=1)))

如果需要统计出哪一只股票在某个交易日的涨幅最大或者最小?
●np.argmax(temp, axis=)
●np.argmin(temp, axis=)
返回最大值所在下标

#获取股票指定哪一天的涨幅最大
print ("前四只股票前四天内涨幅最大{}”. format(np. argmax(temp, axis=1)))
print ("前四天一天内涨幅最大的股票{}" . format(np. argmax(temp, axis=0)))

5小结
●逻辑运算【知道】
。直接进行大于,小于的判断
。合适之后,可以直接进行赋值
●通用判断函数【知道】
。np.all()
。np.any()
●统计运算[掌握]
。np.max()
。np.min()
。np.median()
。np.mean()
。np.std()
。np.var()
。no.argma{axis=} 最大元素对应的下标

4.5数学:矩阵

学习目标
●目标

  • 知道什么是矩阵和向量
  • 知道矩阵的加法,乘法
  • 知道矩阵的逆和转置

1矩阵和向量

1.1 矩阵

矩阵,英文matrix, 和array的区别 矩阵必须是2维的,但是array可以是多维的。

如图:这个是3x2矩阵,即3行2列,如m为行,n为列,那么mxn即3x2

矩阵的维数即行数x列数
矩阵元素(矩阵项):

Aij 指第i行,第j列的元素。

1.2 向量
向量是一种特殊的矩阵,讲义中的向量一般都是列向量,下面展示的说就是3维列向量(3x1)。

2 加法和标量乘法

矩阵的加法:行列数相等的可以加。(对应元素相加)
例:

矩阵的乘法: 每个元素都要相乘。
例:

组合算法也类似。

3 矩阵向量乘法
矩阵和向量的乘法如图: mxn 的矩阵乘以nx1的向量,得到的是mx1的向量
例:

1*1+3*5 = 16
4*1+0*5 = 4
2*1+1*5 = 7

4 矩阵乘法
矩阵乘法:
mxn 矩阵乘以nxo 矩阵,变成mxo矩阵。
举例:比如说现在有两个矩阵A和B,那么它们的乘积就可以表示为图中所示的形式。

5 矩阵乘法的性质

矩阵的乘法不满足交换律: AxB 不等于 BxA
矩阵的乘法满足结合律。即: Ax (BxC) = (AxB) xC
单位矩阵:在矩阵的乘法中,有一种矩阵起着特殊的作用,如同数的乘法中的1,我们称这种矩阵为单位矩阵,它是个方阵,一般用1或者E表示,从左上角到右下角的对角线(称为主对角线)上的元素均为1以外全都为0。如:

6 逆、转置

矩阵的逆:如矩阵A是一个mxm矩阵(方阵),如果有逆矩阵,则:

低阶矩阵求逆的方法:

1.待定系数法

2.初等变换

矩阵的转置:设A为mxn阶矩阵(即m行n列),第i行i列的元素是a(i,j),即:
A=a(i,j)
定义A的转置为这样一个nxm阶矩阵B,满足B=a(j,i),即b(i,j)=a(j,i) (B 的第i行第j列元素是A的第j行第i列元素),记A转置 =B。
直观来看,将A的所有元素绕着一条从第1行第1列元素出发的右下方45度的射线作镜面反转,即得到A的转置。
注:A的转置就是A行列互换。
例:

4.6数组间的运

学习目标
●目标

  • 说明数组间运算的广播机制
  • 知道数组与数之间的运算
  • 知道数组与数组之间的运算
  • 理解矩阵的特点以及运算规则
  • 应用np.matmul实现矩阵运算

●应用

  • 学生综合成绩矩阵运算

1 场景

数据:

[[80,86],
[82,80],
[85,78],
[90,90],
[86,82],
[82,90],
[78,80],
[92,94]]

数组与数的运算

arr = np.array([[1, 2, 3, 2, 1, 4], [5, 6, 1, 2, 3, 1]])
arr+ 1
arr/ 2#可以对比python列表的运算,看出区别
a=[1,2,3,4,5]
a*3

3 数组与数组的运算

arr1 = np.array([[1, 2, 3, 2, 1, 4], [5, 6, 1, 2, 3, 1]])
arr2 = np.array([[1, 2, 3, 4],[3, 4, 5, 6]])

上面这个能进行运算吗,结果是不行的!

4 广播机制
执行broadcast的前提在于,两个ndarray执行的是element-wise的运算,Broadcast机制的功能是为了方便不同形状的ndarray (numpy库的核心数据结构)进行数学运算。
当操作两个数组时,numpy会逐个比较它们的shape (构成的元组tuple) ,只有在下述情况下,两个数组才能够进行数组与数组的运算。

●维度相等
●shape (其中相对应的一个地方为1)
例如:

Image (3d array): 256 x 256 x 3
Scale (1d array):                      3
Result (3d array): 256 x 256 x 3A   (4d array): 9 x 1 x 7 x 1
B   (3d array):     8 x 1 x 5
Result (4d array):  9 x 8 x 7 x 5 A (2d array): 5 x 4
B   (1d array):     1
Result (2d array): 5 x 4A   (2d array): 15 x 3 x 5
B   (1d array): 15 x 1 x 1
Result (2d array): 15 x 3 x 5

如果是下面这样,则不匹配:

A    (1d array): 10
B   (1d array): 12A  (2d array):    2 x 1
B   (3d array): 8 x 4 x 3

思考:下面两个ndarray是 否能够进行运算?

arr1 = np.array([[1, 2, 3, 2, 1, 4],[5, 6, 1, 2, 3, 1]])
arr2 = np.array([[1], [3]])

注:能运算的数组的特征,
1.对应位置维度相同或者一个维度为1

5矩阵运算
5.1矩阵乘法api:

●np.matmul
●np.dot
注:matmul和dot在矩阵运算方面没有区别;
dot可以让矩阵和数字相乘;
matmul不行。

>>> a = np.array([[80, 86],
[82,80],
[85,78],
[90,90],
[86,82],
[82,90],
[78,80],
[92,94]])
>>> b = np.array([[0.7], [0.3]])>>> np.matmul(a, b)
array([ [81.8], [81.4],[82.9],[90. ],[84.8],[84.4],[78.6],[92.6]])
>>> np.dot(a,b)array([[81.8],
[81.4],
[82.9],
[90. ],
[84.8],
[84.4],
[78.6],
[92.6]])

注:numpy主要是用来进行数学运算。

5.Pandas

学习目标
●目标

  • 了解Numpy与 Pandas的不同
  • 说明Pandas的Series 与Dataframe两种结构的区别
  • 了解Pandas的Multindex 与panel结构
  • 应用Pandas实现基本数据操作
  • 应用Pandas实现数据的统计分析
  • 应用Pandas实现数据的逻辑筛选
  • 应用Pandas实现数据的算数运算
  • 应用Pandas实现数据的缺失值处理
  • 应用Pandas实现数据的离散化处理
  • 应用Pandas实现数据的合并
  • 应用crosstab和pivot_table实现交叉表与透视表
  • 应用groupby和聚合函数实现数据的分组与聚合
  • 了解Pandas的plot画图功能
  • 应用Pandas实现数据的读取和存储
  • [ ]

5.1

学习目标
●目标

  • 了解Numpy与Pandas的不同
  • 了解Pandas的Mutindex与panel结构
  • 说明Pandas的Series 与Dataframe两种结构的区别

●应用

  • 股票涨跌幅数据的修改

1 Pandas介绍

● 2008年WesMcKinney开 发出的库
● 专门用于数据挖掘的开源python库
● 以Numpy为基础, 借力Numpy模块在计算方面性能高的优势
● 基于matplotlib, 能够简便的画图
● 独特的数据结构

2 为什么使用Pandas
Numpy已经能够帮助我们处理数据,能够结合matplotib解决部分 数据展示等问题,那么pandas学习的目的在什么地方呢?
● 便捷的数据处理能力

读取文件方便
封装了Matplotlib、Numpy的画图和计算

3 案例

#导入pandas
import pandas as pd

回忆我们在numpy当中创建的股票涨跌幅数据形式?

#创建一个符合正太分布的10个股票5天的涨跌幅数据
stock. .change = np. random.normal(0, 1, (10, 5))arrayl([[-0. 06544031, -1.30931491, -1.45451514, 0.57973008, 1. 48602405],[-1.73216741, -0.83413717, 0. 45861517, -0. 80391793,-0 .46878575],[ 0.21805567, 0.19901371, 0.7134683 ,0.5484263 ,0.38623412],[-0.42207879,-0.33702398, 0. 42328531,-1.23079202, 1.32843773],[-1.72530711,0.07591832, -1.91708358, -0. 16535818,1. 07645091],[-0. 81576845,-0.28675278, 1.20441981, 0.73365951, -0. 06214496],[-0.98820861, -1.01815231, -0. 95417342, -0. 81538991,0.50268175],[-0. 10034128,0.61196204,-0 .06850331,0.74738433, 0.143011 ][ 1.00026175,0.34241958,-2.2529711 ,0. 93921064,1. 14080312],[ 2.52064693, 1.55384756, 1.72252984, 0.61270132, 0. 60888092]]]

但是这样的数据形式很难看到存储的是什么的样的数据,并也很难获取相应的数据,比如需要获取某个指定股票的数据,就很难去获取! !

问题:如何让数据更有意义的显示?处理刚才的股票数据

#使用Pandas中的数据结构
stock_ day_ rise = pd.DataFrame(stock_change)

给股票涨跌幅数据增加行列索引,显示效果更加
效果:

●增加行索引

#构造行索引序列
stock_code = ['股票' + str(i) for 1 in range(stock_day_ rise. shape[0])]#添加行索引
data = pd. DataFrame(stock_change, index=stock_code)

●增加列索引
股票的日期是一个时间的序列,我们要实现从前往后的时间还要考虑每的总天数等,不方便。使用pd.date_range(): 用于生成一组连续的时间序列(暂时了解)

date_ range(start=None , end=None, periods=None, freq='B')start:开始时间end:结束时间periods:时间天数freq:递进单位,默认1天,'B'默认略过周末
#生成一个时间的序列,略过周末非交易日
date = pd.date_ range('2017-01-01', periods=stock_day_ rise. shape[1],freq='B')# index代表行索引,columns代表列索引
data = pd. DataFrame(stock_ change, index=stock_code, columns=date)

4 DataFrame
4.1 DataFrame结构
DataFrame对象既有行索引,又有列索引
●行索引,表明不同行横向索引,叫index,,0轴,axis=0
●列索引,表名不同列,纵向索引,叫columns, 1轴,axis=1

4.2 DatatFrame的属性
●shape

data. shape
#结果
(10,5)

●index
DataFrame的行索引列表

data. indexIndex(['股票0','股票1', '股票2', '股票3', ‘股票4', '股票5',‘股票6', ‘股票7', '股票8', ‘股票9']

●columns
DataFrame的列索引列表

data. columnsDatetimeIndex(['2017-01-02','2017-01-03', 2017-01-04', '2017-01-05','2017-01-06'],
dtype='datetime64[ns]', freq='B')

●values
直接获取其中的array的值

data. valuesarray([ [-0. 06544031, -1.30931491, -1.45451514, 0.57973008, 1. 48602405],[-1.73216741,-0.83413717,0.45861517, -0. 80391793,-0 .46878575],[ 0.21805567,0.19901371,0.7134683 ,0.5484263 ,0. 38623412],[-0. 42207879,-0.33702398, 0. 42328531, -1.23079202, 1.32843773],[-1.72530711,0. 07591832,-1.91708358, -0.16535818, 1. 07645091],[-0. 81576845, -0.28675278, 1.20441981, 0.73365951, -0. 06214496],[-0. 98820861, -1.01815231, -0.95417342, -0. 81538991,0. 50268175],[-0.10034128,0.61196204, -0. 06850331,0.74738433, 0.143011 ],[ 1.00026175, 0.34241958, -2.2529711 ,0.93921064, 1.14080312],[ 2.52064693, 1.55384756, 1.72252984, 0.61270132, 0. 60888092]])

●T
转置

data.T

结果:

●head(5): 显示前5行内容
如果不补充参数,默认5行。 填入参数N则显示前N行

data. head(5)2017-01-02 00:00:00 2017-01-03 00:00:00 2017-01-04 00:00:00     2017-01-05 00:00:00
股票0 -0. 065440  -1.309315   -1.454515   0.579730    1.486024
股票1 -1.732167   -0. 834137  0.458615    -0.803918   -0.468786
股票2 0.218056    0.199014    0.713468    0.548426    0.386234
股票3 -0.422079   -0.337024   0.423285    -1.230792   1.328438
股票4 -1. 725307  0.075918    -1.917084   -0.165358   1.076451

●tail(5): 显示后5行内容
如果不补充参数,默认5行。填入参数N则显示后N行

data. tail(5)2017-01-02 00:00:00 2017-01-03 00:00:00 2017-01-04 00:00:00 2017-01-05 00:00:00
股票5 -0.815768   -0.286753   1.204420    0.733660    -0.062145
股票6 -0.988209   -1.018152   -0.954173   -0.815390   0.502682
股票7 -0.100341   0.611962    -0.068503   0.747384    0.143011
股票8 1.000262    0.342420    -2.252971   0.939211    1.140803
股票9 2. 520647   1.553848    1.722530    0.612701    0.608881

4.3 DatatFrame索引的设置
4.3.1修改行列索引值

stock_code = [”股票_" + str(i) for i in range(stock_ day_ rise. shape[0])]#必须整体全部修改
data. index = stock_code
结果
2017-01-02 00:00:00 2017-01-03 00:00:00 2017-01-04 00:00:00 2017-01-05 00:00:00
股票_0    -0.065440   -1.309315   -1.454515   0.579730    1.486024
股票_1    -1.732167   -0.834137   0. 458615   -0.803918   -0.468786
股票_2    0.218056    0.199014    0.713468    0.548426    0.386234
股票_3    -0.422079   -0.337024   0.423285    -1.230792   1.328438
股票_4    -1.725307   0.075918    -1.917084   -0.165358   1.076451
股票_5    -0.815768   -0.286753   1.204420    0.733660    -0.062145
股票_6    -0. 988209  -1.018152   -0. 954173  -0.815390   0.502682
股票_ 7 -0.100341 0.611962    -0.068503   0.747384    0.143011
股票_8    1. 000262   0.342420    -2.252971   0.939211    1.140803
股票_9    2.520647    1.553848    1.722530    0.612701    0.608881

注意:以下修改方式是错误的
不能单独修改某一个,智能整体进行修改

#错误修改方式
data. index[3] = '股票3'

4.3.2重设索引
●reset_index(drop=False)
。设置新的下标索引
。drop:默认为False, 不删除原来索引,如果为True,删除原来的索引值

#重置索引,drop=False
data. reset_ index()index   2017-01-02 00:00:00 2017-01-03 00:00:00 2017-01-04 00:00:00 2017-01-05 00:00:00
0   股票_0    -0.065440   -1.309315   -1.454515   0.579730    1.486024
1   股票_1    -1.732167   -0.834137   0.458615    -0.803918   -0.468786
2   股票_2    0.218056    0.199014    0.713468    0.548426    0.386234
3   股票_3    -0.422079   -0.337024   0.423285    -1.230792   1.328438
4   股票_4    -1.725307   0.075918    -1.917084   -0.165358   1.076451
5   股票_ 5 -0.815768 -0.286753   1.204420    0.733660    -0.062145
6   股票_6    -0.988209   -1.018152   -0. 954173  -0. 815390  0.502682
7   股票_7    -0.100341   0.611962    -0.068503   0.747384    0.143011
8   股票_8    1.000262    0.342420    -2.252971   0.939211    1.140803
9   股票_9    2.520647    1.553848    1.722530    0.612701    0. 608881
#重置索引,drop=Ture
data. reset_index(drop=Ture)index  2017-01-02 00:00:00 2017-01-03 00:00:00 2017-01-04 00:00:00 2017-01-05 00:00:00
0   -0.065440   -1.309315   -1.454515   0.579730    1.486024
1   -1.732167   -0.834137   0.458615    -0.803918   -0.468786
2   0.218056    0.199014    0.713468    0.548426    0.386234
3   -0.422079   -0.337024   0.423285    -1.230792   1.328438
4   -1.725307   0.075918    -1.917084   -0.165358   1.076451
5   -0.815768   -0.286753   1.204420    0.733660    -0.062145
6   -0.988209   -1.018152   -0. 954173  -0. 815390  0.502682
7   -0.100341   0.611962    -0.068503   0.747384    0.143011
8   1.000262    0.342420    -2.252971   0.939211    1.140803
9   2.520647    1.553848    1.722530    0.612701    0. 608881

4.3.3以某列值设置为新的索引

●set_index(keys, drop= True)
。keys :列索引名成或者列索引名称的列表
。drop : boolean, default True. 当做新的索引,删除原来的列

●设置新索引案例
1.创建

df = pd.DataFrame({'month': [1, 4, 7, 10],'year': [2012, 2014, 2013, 2014],'sale':[55, 40, 81, 31]})month sale year
0       1   55  2012
1       4   40  2014
2       7   84  2013
3       10  31  2014

2、以月份设置新的索引

df.set_index( 'month')sale yearmonth 1 55  20124   40  20147   84  201310  31  2014

3.设置多个索引,以年和月份

df.set_index( 'year','month')sale
year    month
2012    1   55
2014    4   40
2013    7   84
2014    10  31

注:通过刚才的设置,这样DataFrame就变成 了一个具有MultiIndex的DataFrame。
如果设置索引是两个的时候就是multiIndex。

5.2 基本数据操作

学习目标
●目标

  • 记忆DataFrame的形状、行列索引名称获取等基本属性
  • 应用Series和DataFrame的索引进行切片 获取
  • 应用sort _index和sort_values实 现索引和值的排序

●应用

  • 股票每日数据的操作

为了更好的理解这些基本操作,我们将读取一个真实的股票数据。关于文件操作,后面在介绍,这里只先
用一下API

#读取文件
data = pd.read_csv("./data/stock_day.csv")#删除一些列,让数据更简单些,再去做后面的操作
data = data. drop( ["ma5" , "ma10", "ma20","v_ _ma5", "V_ ma10" ,"V_ ma20"],axis=1)

1 索引操作
Numpy当中我们已经讲过使用索引选取序列和切片选择,pandas也支 持类似的操作,也可以直接使用列
名、行名称,甚至组合使用。

1.1直接使用行列索引(先列后行)

获取’2018-02-27’这天的’close’的结果

#直接使用行列索引名字的方式(先列后行)
#获取某个值,先列后行
data['open']['2018-02-27']
23.53#不支的操作(不可以先行后列)
#错误
data['2018-02-27']['open']
#错误
data[:1,:2]

1.2 结合loc或者iloc使用索引
先行后列需要结合loc或者iloc使用

获取从’2018-02- 27’:‘2018-02-22’,'open’的结果

#使用loc:只能指定行列索引的名字
data. loc['2018-02-27': '2018-02-22','open']

5.3 DataFrame运算

5.4 Pandas画图

5.5 文件读取与存储

5.6 高级处理-缺失值处理

5.7 高级处理-数据离散化

5.8 高级处理-合并

5.9 高级处理-交叉表与透视表

5.10 高级处理-分组与聚合

5.10 案例

======================================
没有写完,以后再续吧!

b站唐老师人工智能基础知识笔记相关推荐

  1. python详细基础知识笔记

    详细基础知识笔记 注: ·第一章 学习准备 1.1高级语言.机器语言.汇编语言 1.2 汇编.解释 1.3 静态语言.脚本语言 1.4 Python的历史 1.5 Python语言的优点.缺点 1.6 ...

  2. HTML基础知识笔记(0基础入门)

    HTML&CSS基础知识笔记 HTML 一.HTML介绍 二.实体 三.meta标签 四.语义化标签(一) 五.语义化标签(二) 六.语义化标签(三) 七.列表 八.超链接 九.图片标签 十. ...

  3. access2013数据库实验笔记_医学科研实验基础知识笔记(十):甲基化

    往期回顾 医学科研实验基础知识笔记(一):细胞增殖 医学科研实验基础知识笔记(二):细胞凋亡检测 医学科研实验基础知识笔记(三):细胞周期检测 医学科研实验基础知识笔记(四):细胞自噬研究策略 医学科 ...

  4. 你不得不了解的人工智能基础知识

    你不得不了解的人工智能基础知识 1.什么是人工智能? 首先我们利用传统的软件和人工智能进行比较,就容易使大家更容易理解. (1) 传统软件 VS 人工智能 传统软件是[基于规则]的,需要人为的设定条件 ...

  5. Java基础知识笔记-11_2-Swing用户界面组件

    Java基础知识笔记-11_2-Swing用户界面组件 这章教程两个版本,一个语法是非lambda表达式版本,另一个是lambda表达式版本 非lambda表达式版本 1 Java Swing概述 J ...

  6. 6-DoF问题相关基础知识笔记

    6-DoF问题相关基础知识笔记 一.什么是6-DoF,即6个自由度是什么? 二.PnP算法 三.BOP挑战与官方数据集简介 BOP数据集 BOP toolkit BOP挑战的介绍页面 四.相关论文 C ...

  7. 二代测序之SNV基础知识笔记总结

    二代测序之SNV基础知识笔记总结 文章目录 二代测序之SNV基础知识笔记总结 SNV基础知识 SNVs Mutation vs. Variant[变异和突变] 不同层次的突变 DNA: 1.编码DNA ...

  8. Unity3D基础知识笔记

    Unity3D基础知识笔记 一.Unity简介 1)Unity3D概念 2)Unity3D的特点 二.Unity3D的发展历史 三.软件安装 一.Unity简介 1)Unity3D概念 Unity是由 ...

  9. Python基础知识笔记

    文章目录 Python基础知识 教程:https://www.liaoxuefeng.com/wiki/1016959663602400 内置函数:https://docs.python.org/3/ ...

最新文章

  1. 如何判断是否丢掉用户请求(转载)
  2. es6常用语法和特性
  3. 高性能Javascript:高效的数据访问
  4. tg2015 信息传递 (洛谷p2661)
  5. php smtp报文_PHP 使用 SMTP 发送邮件教程(PEAR Mail 包)
  6. 在AWS Elastic MapReduce上运行PageRank Hadoop作业
  7. 删除隐藏版本信息 版本回退_Visual Studio Code 2019 August版本发布,新功能尝鲜
  8. 计算机网络—物理层(思维导图)
  9. oracle ora 16014,ORA-16014 ORA-00312错误解决
  10. NodeJS http 模块
  11. 微信小程序云开发教程-一文学会Json
  12. SpringMVC的Restful风格
  13. ps图片放大后模糊怎么办?
  14. html字母分别代表什么,HTML 编码
  15. 高光谱遥感数据光谱特征的提取与应用---高光谱基础知识科普论文
  16. 【中学】求解一元二次方程
  17. 千梦网创108计第三十六计:当地人才招聘网,一个年入50W的战友实操案例
  18. Arcgis影像镶嵌数据集色彩平衡遇到的问题
  19. MarkDown快捷键学习
  20. python 文件夹拷贝

热门文章

  1. reactnative打包apk报错:failed parsing overlays.
  2. Web矢量图设计器的开发领域
  3. python实现解数独程序代码
  4. 一步一步完成Flutter应用开发-掘金App搜索,我的,发现,发布沸点
  5. c语言中英文翻译 毕业设计,c语言中英文翻译资料 毕业(设计)论文.doc
  6. Java程序员必备!java语言程序设计课后答案张思民
  7. 浅析电影票务系统必须适应互联网时代的发展
  8. Greenplum 扩容
  9. 通过注册表更改组策略(禁止安装软件)bat脚本
  10. python连接windows远程桌面,如何使用Paramiko、Python在windows机器之间建立远程桌面连接...