深度学习——数据预处理,张量降维
目录
- 一、数据预处理
- 1.1 读取数据集
- 1.2 处理缺失值
- 1.3 转换为张量类型
- 二、张量
- 2.1 张量算法的基本性质
- 2.1.1 两个形状相同的张量相加
- 2.1.2 哈达玛积
- 2.1.3 与标量相加或相乘
- 2.2 降维
- 2.2.1 对所有行的元素求和来降维(轴0)
- 2.2.2 对所有列的元素求和来降维(轴1)
- 2.2.3 对所有元素求和
- 2.2.4 平均值
- 2.3 非降维求和:保持轴数不变
- 2.4 点积
- 三、范数
一、数据预处理
1.1 读取数据集
将数据集按行写入csv文件中。要从创建的csv文件中加载原始数据集,导入pandas包并调用read_csv函数。
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('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')
1.2 处理缺失值
NaN项代表缺失值。处理缺失值的数据的典型方法包括插值法和删除法,其中插值法用一个替代值弥补缺失值,而删除法则直接忽略缺失值。
通过位置索引iloc将data分成inputs和outputs,其中前者为data的前两列,而后者为data的最后一列。对于inputs中的缺失值,可以用同一列的均值替换NaN项。
inputs, outputs = data.iloc[:, 0:2], data.iloc[:, 2]
inputs = inputs.fillna(inputs.mean())
print(inputs)
出现如下报错的原因:原因是第2列识别为str,无法进行数值平均运算,需要在括号加入限制条件,仅在数据类型为数值的列进行平均值插值。
inputs, outputs = data.iloc[:, 0:2], data.iloc[:, 2]
inputs = inputs.fillna(inputs.mean(numeric_only = True))
print(inputs)
data.iloc[ ]是python中pandas库的一个非常有用的功能函数,它允许通过行和列的整数位置索引来选择数据。
data.iloc[:, 0:2] 代表选择第1,2列的所有行
data.iloc[:, 2] 代表选择第3列的所有行
对于inputs中的类别值或离散值,我们将NaN视为一个类别。由于Alley列只接受两种类型的类别值Pave和NaN,pandas可以自动将此列转换为两列Alley_pave和Alley_nan。Alley列为pave的行为将Alley_pave的值设置为1,Alley_nan的值设置为0;缺失Alley列的会将Alley_pave和Alley_nan分别设置为0和1.
inputs = pd.get_dummies(inputs, dummy_na=True, dtype = int)
print(inputs)
pd.get_dummies( )是pandas库中用于独热编码(One-Hot Encoding)的函数。它的作用是将分类(离散)变量的每个不同取值都拓展为一个新的二进制编码(0或1),从而方便机器学习模型处理。
dtype可以指定输出的类型,默认情况下,输出的是布尔值(True或False),改为int类型,输出的是0或1
1.3 转换为张量类型
输入的inputs和outputs中的所有元素都是数值类型,它们可以转换为张量格式。
import torch
X = torch.tensor(inputs.to_numpy(dtype=float))
y = torch.tensor(outputs.to_numpy(dtype=float))
X, y
二、张量
2.1 张量算法的基本性质
2.1.1 两个形状相同的张量相加
A = torch.arange(20, dtype=torch.float32).reshape(5,4)
B = A.clone() #通过分配新内存,将A的一个副本分配给B
A , A+B
2.1.2 哈达玛积
两个矩阵的按元素乘法称为哈达玛积,数学符号为 ⨀ \bigodot ⨀
A*B
2.1.3 与标量相加或相乘
将张量加上或乘以一个标量不会改变张量的形状,其中张量的每个元素都将与标量相加或相乘。
a = 2
x=torch.arange(24).reshape(2,3,4)
a+x, (a*x).shape
2.2 降维
A = torch.arange(20).reshape(5,4)
A
默认情况下,调用求和函数会沿所有的轴降低张量的维度,使它变为一个标量。可以指定张量沿哪一个轴来通过求和降低维度。
2.2.1 对所有行的元素求和来降维(轴0)
可以在调用函数时,指定axis=0,由于输入矩阵沿轴0降维以生产输出向量,此输入轴0的维度在输出形状中消失。
A_sum_axis0 = A.sum(axis=0)
A_sum_axis0 , A_sum_axis0 .shape
2.2.2 对所有列的元素求和来降维(轴1)
A_sum_axis1 = A.sum(axis=1)
A_sum_axis1 , A_sum_axis1 .shape
2.2.3 对所有元素求和
沿着行和列对矩阵求和,等价于对矩阵的所有元素求和。
A.sum(axis=[0,1])
2.2.4 平均值
两种方法 = { 1 、总和除以元素总数来计算平均值 2 、通过调用函数来计算任意形状张量的平均值 两种方法=\begin{cases} 1、总和除以元素总数来计算平均值\\2、通过调用函数来计算任意形状张量的平均值\end{cases} 两种方法={1、总和除以元素总数来计算平均值2、通过调用函数来计算任意形状张量的平均值
A = torch.arange(20, dtype=torch.float32).reshape(5,4)
A
A.mean(), A.sum()/A.numel()
2.3 非降维求和:保持轴数不变
A = torch.arange(20, dtype=torch.float32).reshape(5,4)
print(A)
sum_A = A.sum(axis=1, keepdims = True)
sum_A
keepdims为True,表示求和前后shape不变,一般情况下,keepdims为False
由于sum_A在对每行进行求和后,仍保持两个轴,可以通过广播将A除以sum_A
A / sum_A
如果想要沿某个轴计算A的元素的累积总和,可以调用cumsum函数,此函数不会沿任何轴降低输入张量的维度。
A.cumsum(axis=0)
2.4 点积
相同位置的按元素乘积的和
x = torch.arange(4, dtype = torch.float32)
y = torch.ones(4, dtype = torch.float32)
x, y ,torch.dot(x, y)
三、范数
L2范数是向量元素平方和的平方根
∥
x
∥
2
=
∑
i
=
1
n
x
i
2
\Vert \bm x \Vert_2=\sqrt{\sum_{i=1}^n x_i^2}
∥x∥2=i=1∑nxi2
u = torch.tensor([3.0, -4.0])
torch.norm(u)
L1范数表示为向量元素的绝对值之和
∥
x
∥
1
=
∑
i
=
1
n
∣
x
i
∣
\Vert \bm x \Vert_1=\sum_{i=1}^n \vert x_i \vert
∥x∥1=i=1∑n∣xi∣
与L2范数相比,L1范数受到异常值的影响较小,为了计算L1范数,将绝对值函数和按元素求和函数组合起来。
torch.abs(u).sum()