d2l-1-基础知识和数据处理

# python
# d2l

基础知识——符号说明

实际上,学习 深度学习,对于初学者来说,需要的基础知识面很广,比如说微积分,概率论,线性代数等,但是实际上涉及的并不深…

上面的东西刚好 大一 就会学,所以说,对于大一的同学来说,学习这个东西基本上没有障碍……简单回顾一下下面的这些数学符号基本上就差不多了:

本书中使用的符号概述如下。 ### 数字

  • \(x\):标量
  • \(\mathbf{x}\):向量
  • \(\mathbf{X}\):矩阵
  • \(\mathsf{X}\):张量
  • \(\mathbf{I}\):单位矩阵
  • \(x_i\), \([\mathbf{x}]_i\):向量\(\mathbf{x}\)\(i\)个元素
  • \(x_{ij}\), \([\mathbf{X}]_{ij}\):矩阵\(\mathbf{X}\)\(i\)行第\(j\)列的元素

集合论

  • \(\mathcal{X}\): 集合
  • \(\mathbb{Z}\): 整数集合
  • \(\mathbb{R}\): 实数集合
  • \(\mathbb{R}^n\): \(n\)维实数向量集合
  • \(\mathbb{R}^{a\times b}\): 包含\(a\)行和\(b\)列的实数矩阵集合
  • \(\mathcal{A}\cup\mathcal{B}\): 集合\(\mathcal{A}\)\(\mathcal{B}\)的并集
  • \(\mathcal{A}\cap\mathcal{B}\):集合\(\mathcal{A}\)\(\mathcal{B}\)的交集
  • \(\mathcal{A}\setminus\mathcal{B}\):集合\(\mathcal{A}\)与集合\(\mathcal{B}\)相减,\(\mathcal{B}\)关于\(\mathcal{A}\)的相对补集

函数和运算符

  • \(f(\cdot)\):函数
  • \(\log(\cdot)\):自然对数
  • \(\exp(\cdot)\): 指数函数
  • \(\mathbf{1}_\mathcal{X}\): 指示函数
  • \(\mathbf{(\cdot)}^\top\): 向量或矩阵的转置
  • \(\mathbf{X}^{-1}\): 矩阵的逆
  • \(\odot\): 按元素相乘
  • \([\cdot, \cdot]\):连结
  • \(\lvert \mathcal{X} \rvert\):集合的基数
  • \(\|\cdot\|_p\): :\(L_p\) 正则
  • \(\|\cdot\|\): \(L_2\) 正则
  • \(\langle \mathbf{x}, \mathbf{y} \rangle\):向量\(\mathbf{x}\)\(\mathbf{y}\)的点积
  • \(\sum\): 连加
  • \(\prod\): 连乘
  • \(\stackrel{\mathrm{def}}{=}\):定义

微积分

  • \(\frac{dy}{dx}\)\(y\)关于\(x\)的导数
  • \(\frac{\partial y}{\partial x}\)\(y\)关于\(x\)的偏导数
  • \(\nabla_{\mathbf{x}} y\)\(y\)关于\(\mathbf{x}\)的梯度
  • \(\int_a^b f(x) \;dx\): \(f\)\(a\)\(b\)区间上关于\(x\)的定积分
  • \(\int f(x) \;dx\): \(f\)关于\(x\)的不定积分

概率与信息论

  • \(P(\cdot)\):概率分布
  • \(z \sim P\): 随机变量\(z\)具有概率分布\(P\)
  • \(P(X \mid Y)\)\(X\mid Y\)的条件概率
  • \(p(x)\): 概率密度函数
  • \({E}_{x} [f(x)]\): 函数\(f\)\(x\)的数学期望
  • \(X \perp Y\): 随机变量\(X\)\(Y\)是独立的
  • \(X \perp Y \mid Z\): 随机变量\(X\)\(Y\)在给定随机变量\(Z\)的条件下是独立的
  • \(\mathrm{Var}(X)\): 随机变量\(X\)的方差
  • \(\sigma_X\): 随机变量\(X\)的标准差
  • \(\mathrm{Cov}(X, Y)\): 随机变量\(X\)\(Y\)的协方差
  • \(\rho(X, Y)\): 随机变量\(X\)\(Y\)的相关性
  • \(H(X)\): 随机变量\(X\)的熵
  • \(D_{\mathrm{KL}}(P\|Q)\): \(P\)\(Q\)的KL-散度

复杂度

  • \(\mathcal{O}\):大O标记

数据处理

数据处理主要涉及到两个核心的问题,一个是如何读取数据,另外一个则是如何处理为空的数据。

将数据处理之后我们还需要将其转换为

读取数据

在Python中,我们可以使用pandas库来读取数据,pandas库提供了read_csv函数,可以读取csv文件,返回一个DataFrame对象。

作为实例,我们创建一个人工数据集,然后将其保存为csv文件,然后使用pandas库读取数据。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
import os

os.makedirs(os.path.join('..', 'data'), exist_ok=True)
data_file = os.path.join('..', 'data', 'house_tiny.csv')
with open(data_file, 'w') as f:
f.write('NumRooms,Alley,Price\n') # 列名
f.write('NA,Pave,127500\n') # 每行表示一个数据样本
f.write('2,NA,106000\n')
f.write('4,NA,178100\n')
f.write('NA,NA,140000\n')

import pandas as pd
data = pd.read_csv(data_file)
print(data)

处理空数据

在panda中,数据集中的空数据被标记为NA,在进行机器训练的时候,不能让机器直接处理空数据,所以说我们需要对空数据进行处理,一般有下述几种办法: 1. 删除法 2. 插值法

删除法将带有空数据的行视为无效数据,直接删除,插值法则是用已知数据的平均值或者中位数等来填充空数据。

在这里,我们用插值法来处理空数据。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 读取输入和输出数据
inputs = data.iloc[:, [0,1]]
outputs = data.iloc[:, 2]

# 用平均值填充空数据
tempRaw = data.iloc[:,0]
print(tempRaw,tempRaw.mean())
tempRaw = tempRaw.fillna(tempRaw.mean())
print(tempRaw,type(tempRaw))

print(inputs,type(inputs))
inputs.iloc[:, 0] = tempRaw
print(inputs)
print(outputs)

下面逐行解释一下上述代码:

[[data.iloc]] 用于选取数据集中的行和列,data.iloc[:, [0,1]]表示选取所有行和第0、1列的数据,data.iloc[:, 2]表示选取所有行和第2列的数据。

[[data.fillna]] 用于填充空数据,tempRaw.fillna(tempRaw.mean())表示用 该列的平均值 填充 空数据。

[[data.iloc]] 返回的是一个DataFrame对象,我们可以直接对其进行操作,inputs.iloc[:, 0] = tempRaw表示将tempRaw的数据赋值给inputs的第0列。

转换为张量

使用 pandas 读取数据之后,我们得到的数据类型是 pandasDataFrame 对象,我们需要将其转换为张量,才能用于训练。

1
2
3
4
5
import torch

X = torch.tensor(inputs.to_numpy(dtype=float))
y = torch.tensor(outputs.to_numpy(dtype=float))
X, y

torch.tensor() 使用 numpy 数组 初始化创建一个 张量,inputs.to_numpy()DataFrame 对象转换为 numpy 数组,dtype=float 表示将数据转换为浮点数类型。

数据从 DataFrame -> numpy 数组 -> 张量,完成了数据的转换。