机器学习学习笔记(二)

3.3 常见图形绘制

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

  1. 折线图
    特点:能够显示数据的变化趋势,反映事物的变化情况。(变化)
    api:plt.plot(x, y)
  2. 散点图
    特点:分布规律
    api:plt.scatter(x, y)
  3. 柱状图
    特点:统计/对比
    api:plt.bar(x, width, align=‘center’, **kwargs)
    Parameters: x : 需要传递的数据;width : 柱状图的宽度;align : 每个柱状图的位置对齐方式;**kwargs :color:选择柱状图的颜色
  4. 直方图
    特点:绘制连续性的数据展示一组或者多组数据的分布状况(统计)
    api:matplotlib.pyplot.hist(x, bins=None)
    Parameters: x : 需要传递的数据;bins : 组距
  5. 饼图
    特点:分类数据的占比情况(占比)
    api:plt.pie(x, labels=,autopct=,colors)
    Parameters: x:数量,自动算百分比;labels:每部分名称;autopct:占比显示指定%1.2f%%;colors:每部分颜色
举例——散点图绘制
# 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()

在这里插入图片描述

举例——柱状图绘制
# 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.1b修改x轴的刻度显示
plt.xticks(x, movie_name)

# 2.2 添加网格显示
plt.grid(linestyle="--", alpha=0.5)

# 2.3 添加标题
plt.title("电影票房收入对比")

# 3.显示图像
plt.show()

在这里插入图片描述

注:参考链接

​ https://matplotlib.org/index.html

4 Numpy

4.1 Numpy优势

4.1.1 定义

Numpy(Numerical Python)是一个开源的Python科学计算库,用于快速处理任意维度的数组。Numpy使用ndarray对象来处理多维数组,该对象是一个快速而灵活的大数据容器。

4.1.2 创建
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

在这里插入图片描述

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

通过一段代码运行来体会到ndarray的好处

import random
import time
import numpy as np
a = []
for i in range(1000):
    a.append(random.random())

# 通过%time魔法方法, 查看当前行的代码运行一次所花费的时间
%time sum1=sum(a)

b=np.array(a)

%time sum2=np.sum(b)

在这里插入图片描述
ndarray的计算速度要快很多,节约了时间。

4.1.4 ndarray的优势
  1. Numpy Array —— 一体式存储;Python List —— 分离式存储
    在这里插入图片描述
    ndarray中的所有元素的类型都是相同的,而Python列表中的元素类型是任意的,所以ndarray在存储元素时内存可以连续,而python原生list就只能通过寻址方式找到下一个元素,这虽然也导致了在通用性能方面Numpy的ndarray不及Python原生list,但在科学计算中,Numpy的ndarray就可以省掉很多循环语句,代码使用方面比Python原生list简单的多。
  2. ndarray支持并行化运算
  3. 效率远高于纯Python代码:Numpy底层使用C语言编写,内部解除了GIL(全局解释器锁)(可以理解为千军万马过独木桥,只是看起来多任务一起执行,实则是每一个任务执行固定ms),其对数组的操作速度不受Python解释器的限制,所以,其效率远高于纯Python代码。(实现了真正的多任务)

4.2 N维数组-ndarray

4.2.1 ndarray的属性

属性名字 属性解释
ndarray.shape 数组维度的元组
ndarray.ndim 数组维数
ndarray.size 数组中的元素数量
ndarray.itemsize 一个数组元素的长度(字节)
ndarray.dtype 数组元素的类型

4.2.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]]]) # 三维数组

如何理解数组的形状?
二维数组:
在这里插入图片描述
三维数组:
在这里插入图片描述

4.2.3 ndarray的类型

在这里插入图片描述
在这里插入图片描述

4.3 基本操作

4.3.1 生成数组的方法
1. 生成0和1的数组
ones = np.ones([4,8])
ones

在这里插入图片描述

np.zeros_like(ones)

在这里插入图片描述

2. 从现有数组生成

在这里插入图片描述

注:关于array和asarray的不同

np.array —— 深拷贝(类似于复制新的文件)
np.asarray —— 浅拷贝(类似于文件快捷方式)
在这里插入图片描述

3. 生成固定范围的数组

(1)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.])

(2)np.arange(start,stop, step, dtype)
每间隔多少生成数据
参数:
step:步长,默认值为1

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])

(3)np.logspace(start,stop, num)
创建等比数列,生成固定范围数组
参数:
num:要生成的等比数列数量,默认为50

# 生成10^x
np.logspace(0, 2, 3)
# 返回结果 array([  1.,  10., 100.])
4.生成随机数组

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

np.random.uniform(low=1, high=10, size=10)
# 返回结果:array([6.24945096, 2.70499988, 2.03631474, 4.11871055, 9.27023471,
       #8.64839606, 5.83937203, 1.36183427, 5.73816505, 2.99454253])

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

import matplotlib.pyplot as plt

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

# 画图看分布状况
# 1)创建画布
plt.figure(figsize=(5, 5), dpi=100)

# 2)绘制直方图
plt.hist(x=x2, bins=1000)  # x代表要使用的数据,bins表示要划分区间数

# 3)显示图像
plt.show()

在这里插入图片描述
(2)正态分布

  1. 正态分布是一种概率分布。正态分布是具有两个参数μ和σ的连续型随机变量的分布,第一参数μ是服从正态分布的随机变量的均值,第二个参数σ是此随机变量的方差,所以正态分布记作N(μ,σ )。
    均值:图像的左右位置
    方差:图像是瘦,还是胖;值越小,图形越瘦高,数据越集中;值越大,图形越矮胖,数据越分散。

    在这里插入图片描述
  2. 正态分布的应用:生活、生产与科学实验中很多随机变量的概率分布都可以近似地用正态分布来描述。
  3. 正态分布特点:μ决定了其位置,其标准差σ决定了分布的幅度。当μ = 0,σ = 1时的正态分布是标准正态分布。
  4. 标准差如何来?
    在这里插入图片描述
  5. 正态分布创建方式
    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,只输出一个值
# 举例1:生成均值为1.75,标准差为1的正态分布数据,100000000个
x1 = np.random.normal(1.75, 1, 100000000)
#返回结果:array([2.90646763, 1.46737886, 2.21799024, ..., 1.56047411, 1.87969135,0.9028096 ])
# 生成均匀分布的随机数
x1 = np.random.normal(1.75, 1, 100000000)

# 画图看分布状况
# 1)创建画布
plt.figure(figsize=(20, 10), dpi=100)

# 2)绘制直方图
plt.hist(x1, 1000)

# 3)显示图像
plt.show()

在这里插入图片描述

# 举例2:随机生成4支股票1周的交易日涨幅数据
# 随机生成涨跌幅在某个正态分布内,比如均值0,方差1
# 创建符合正态分布的4只股票5天的涨跌幅数据
stock_change = np.random.normal(0, 1, (4, 5))
stock_change

在这里插入图片描述

4.3.2 数组的索引、切片
  1. 一维、二维、三维的数组如何索引?
    直接进行索引,切片
    对象[:, :] – 先行后列
  2. 二维数组索引方式举例:获取第一个股票的前3个交易日的涨跌幅数据
# 二维的数组,两个维度 
stock_change[0, 0:3]
# 返回结果:array([-0.66091868, -0.50276631, -1.30747434])
  1. 三维数组索引方式
# 三维
a1 = np.array([ [[1,2,3],[4,5,6]], [[12,3,34],[5,6,7]]])
a1
# 返回结果:
array([[[ 1,  2,  3],
        [ 4,  5,  6]],

       [[12,  3, 34],
        [ 5,  6,  7]]])
# 索引、切片
a1[0, 0, 1]   
# 返回结果: 2
4.3.3 形状修改
  1. ndarray.reshape(shape, order)
    返回一个具有相同数据域,但shape不一样的视图
    行、列不进行互换
    产生新变量
# 在转换形状的时候,一定要注意数组的元素匹配
stock_change.reshape([5, 4])
stock_change.reshape([-1,10])  # 数组的形状被修改为: (2, 10), -1: 表示通过待计算

在这里插入图片描述
2. ndarray.resize(new_shape)
修改数组本身的形状(需要保持元素个数前后相同)
行、列不进行互换
对原值进行修改

stock_change.resize([5, 4])

# 查看修改后结果
stock_change.shape
# 返回结果:(5, 4) —————— 一开始是(4,5)
  1. ndarray.T
    数组的转置
    将数组的行、列进行互换
4.3.4 类型修改
  1. ndarray.astype(type)
    返回修改了类型之后的数组
stock_change.astype(np.int32)
# 下面是输出结果
array([[ 0,  0,  0,  1, -1],
       [ 0, -1,  0,  0,  0],
       [ 0,  0,  0,  0,  0],
       [-2,  0,  0,  0,  1]], dtype=int32)
  1. ndarray.tobytes([order])
    构造包含数组中原始数据字节的Python字节
arr = np.array([[[1, 2, 3], [4, 5, 6]], [[12, 3, 34], [5, 6, 7]]])
arr.tobytes()

在这里插入图片描述
注:jupyter输出太大可能导致崩溃问题
如果遇到

IOPub data rate exceeded.
    The notebook server will temporarily stop sending output
    to 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输出太大会崩溃

4.4 ndarray运算

4.4.1 逻辑运算

在这里插入图片描述

4.4.2 通用判断函数
# 判断前两名同学的成绩[0:2, :]是否全及格
>>> np.all(score[0:2, :] > 60)
False
# 判断前两名同学的成绩[0:2, :]是否有大于90分的
>>> np.any(score[0:2, :] > 80)
True
4.4.3 np.where(三元运算符)
# 判断前四名学生,前四门课程中,成绩中大于60的置为1,否则为0
temp = score[:4, :4]
np.where(temp > 60, 1, 0)
# 判断前四名学生,前四门课程中,成绩中大于60且小于90的换为1,否则为0
np.where(np.logical_and(temp > 60, temp < 90), 1, 0)

# 判断前四名学生,前四门课程中,成绩中大于90或小于60的换为1,否则为0
np.where(np.logical_or(temp > 90, temp < 60), 1, 0)
4.4.4 统计运算
min(a, axis)
Return the minimum of an array or minimum along an axis.
max(a, axis])
Return the maximum of an array or maximum along an axis.
median(a, axis)
Compute the median along the specified axis.
mean(a, axis, dtype)
Compute the arithmetic mean along the specified axis.
std(a, axis, dtype)
Compute the standard deviation along the specified axis.
var(a, axis, dtype)
Compute the variance along the specified axis.

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

# 接下来对于前四名学生,进行一些统计运算
# 指定列 去统计
temp = score[:4, 0:5]
print("前四名学生,各科成绩的最大分:{}".format(np.max(temp, axis=0)))
print("前四名学生,各科成绩的最小分:{}".format(np.min(temp, axis=0)))
print("前四名学生,各科成绩波动情况:{}".format(np.std(temp, axis=0)))
print("前四名学生,各科成绩的平均分:{}".format(np.mean(temp, axis=0)))
# 下面是输入结果
# 前四名学生,各科成绩的最大分:[96 97 72 98 89]
# 前四名学生,各科成绩的最小分:[55 57 45 76 77]
# 前四名学生,各科成绩波动情况:[16.25576821 14.92271758 10.40432602  #8.0311892   4.32290412]
# 前四名学生,各科成绩的平均分:[78.5  75.75 62.5  85.   82.25]
np.argmax(temp, axis=)
np.argmin(temp, axis=)
print("前四名学生,各科成绩最高分对应的学生下标:{}".format(np.argmax(temp, axis=0)))
# 输出结果:前四名学生,各科成绩最高分对应的学生下标:[0 2 0 0 1]

4.5 矩阵

4.5.1 矩阵和向量
  1. 矩阵,英文matrix,和array的区别矩阵必须是2维的,但是array可以是多维的。
  2. 矩阵的维数即行数×列数。
  3. 向量是一种特殊的矩阵,下面展示的就是三维列向量(3×1)
    在这里插入图片描述
4.5.2 加法和标量乘法

矩阵的加法:行列数相等的可以加。
在这里插入图片描述
矩阵的乘法:每个元素都要乘。
在这里插入图片描述

4.5.3 矩阵向量乘法

m×n 的矩阵乘以 n×1 的向量,得到的是 m×1 的向量
在这里插入图片描述
矩阵乘法遵循准则:
(M行, N列)*(N行, L列) = (M行, L列)

4.5.4 矩阵乘法

m×n 矩阵乘以 n×o 矩阵,变成 m×o 矩阵。
举例:比如说现在有两个矩阵 A 和 B,那 么它们的乘积就可以表示为图中所示的形式。
在这里插入图片描述
在这里插入图片描述

4.5.5 矩阵乘法的性质
  1. 矩阵的乘法不满足交换律:A×B≠B×A
  2. 矩阵的乘法满足结合律。即:A×(B×C)=(A×B)×C
  3. 单位矩阵:在矩阵的乘法中,有一种矩阵起着特殊的作用,如同数的乘法中的 1,我们称 这种矩阵为单位矩阵.它是个方阵,一般用 I 或者 E 表示,从 左上角到右下角的对角线(称为主对角线)上的元素均为 1 以外全都为 0。如:
    在这里插入图片描述
4.5.6 逆、转置

1.矩阵的逆:如矩阵 A 是一个 m×m 矩阵(方阵),如果有逆矩阵,则:
AA-1 = A-1A = I
2. **低阶矩阵求逆的方法:**待定系数法;初等变换。
3. 矩阵的转置:设 A 为 m×n 阶矩阵(即 m 行 n 列),第 i 行 j 列的元素是 a(i,j),即:A=a(i,j);定义 A 的转置为这样一个 n×m 阶矩阵 B,满足 B=a(j,i),即 b (i,j)=a (j,i)(B 的第 i 行第 j 列元素是 A 的第 j 行第 i 列元素),记 AT =B。
直观来看,将 A 的所有元素绕着一条从第 1 行第 1 列元素出发的右下方 45 度的射线作 镜面反转,即得到 A 的转置。
在这里插入图片描述

4.6 数组间运算

4.6.1 数组与数的运算

在这里插入图片描述

4.6.2 数组与数组的运算

广播机制:数组在进行矢量化运算时,要求数组的形状是相等的。当形状不相等的数组执行算术运算的时候,就会出现广播机制,该机制会对数组进行扩展,使数组的shape属性值一样,这样,就可以进行矢量化运算了。

arr1 = np.array([[0],[1],[2],[3]])
arr1.shape
# (4, 1)

arr2 = np.array([1,2,3])
arr2.shape
# (3,)

arr1+arr2
# 结果是:
array([[1, 2, 3],
       [2, 3, 4],
       [3, 4, 5],
       [4, 5, 6]])

上述代码中,数组arr1是4行1列,arr2是1行3列。这两个数组要进行相加,按照广播机制会对数组arr1和arr2都进行扩展,使得数组arr1和arr2都变成4行3列。
下面通过一张图来描述广播机制扩展数组的过程:
在这里插入图片描述
广播机制实现了两个或两个以上数组的运算,即使这些数组的shape不是完全相同的,只需要满足如下任意一个条件即可。
1.数组的某一维度等长。
2.其中一个数组的某一维度为1 。

4.6.3 矩阵乘法api

np.matmul:矩阵相乘
np.dot:点乘
在这里插入图片描述
np.matmul和np.dot的区别:二者都是矩阵乘法。 np.matmul中禁止矩阵与标量的乘法。 在矢量乘矢量的內积运算中,np.matmul与np.dot没有区别。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值