pytorch基础操作及线性代数基础

本文介绍了PyTorch中的数据操作,包括切片、生成、原地操作和转换为numpy,以及CSV文件操作。接着,深入探讨了线性代数的基础,如矩阵范数、特殊矩阵、正定矩阵、正交矩阵和特征向量。讨论了在PyTorch中如何进行矩阵操作,并讲解了微积分中的求导和链式法则,同时提到了自动求导的概念。

数据操作数据预处理

切片操作

[1, 2], [1, :], [::2, ::3]

生成数据

x = torch.arange(12, dtype=torch.float)  # tensor([0:12)) in float
x.shape  # torch.Size([12])
x.numel()  # number of elements 标量

x.sum()
x.sum(axis=0)  # 对第0个维度求和,则第0个轴不变
x.sum(axis=[0,1])  # 对0,1两个维度求和
x.mean()  # average also
x.cumsum(axis=0)  # 累加求和

x = x.reshape(3, 4)  # 3raws, 4 cols
torch.zeros((2, 3, 4))
torch.ones((2, 3, 4))
# we also can use the list--"builtinPython" to set every elements of tensor a value
torch.tensor([[...], [...], ..., [...]])
torch.exp(x)  # have the exp operation to each one in the tensor named x
torch.cat((x,y), dim=0)  # 按第0维度合并就是按行合并x的所有行在上y的所有行在下
torch.cat((x,y), dim=1)  # 按第1维度合并就是按列合并答案中的每行就是x的行在前y的行在后
x == y  # 构建一个二元张量,也就是对比xy每个点的值是否相同,相同给True不同给False构成一个矩阵
torch.dot(x, y)  #同位置的按元素乘积的和 只能用于向量,但是x*y可以用于n维矩阵
x * y  # 矩阵的点乘
# 那么矩阵乘向量?
torch.mv(x, y[0, :])  # matrix * vector
# 那么矩阵乘矩阵?
torch.mm(x, y.Y)

# 求范数
torch.norm(u) # L2
torch.abs(u)  # L1


# 张量形状不同时相加 eg
a, b = torch.arange(3).reshape((3,1)), torch.arange(2).reshape((1,2))
# 如果像上面这样各有一个维度相同的话,相加时会将小维度复制填充至大维度
# 多元素赋值
x[0:2, :] = 12 # x[0:2] = 12 0:2左闭右开
# 复制
B = A.clone()  # 分配新内存

原地操作

id(x) # 类似C中的指针
before = id(Y)
Y = Y + X
id(y) == before
# return False
# 为了执行原地操作
z = torch.zeros_like(Y)
z[:] = X + Y
# 或者通过+=实现原地操作
before = id(X)
X += Y
id(X) == before
# return True

转化为numpy*****

A = X.numpy() # numpy.ndarray
B = torch.tensor(A) # torch.Tensor
a = torch.tensor([3.5])
a, a.item(), float(a), int(a)

文件操作 for csv

data = pandas.read_csv(file)
# cope with the NA data
inputs, outputs = data.iloc[:, 0:2], data.iloc[:, 2]
inputs = inputs.fillna(inputs.mean()) # 用均值填充NaN,只有数值可以
# 将inputs中的类别值或者离散值中的NaN视作一个类别
inputs = pandas.get_dummies(inputs, dummy_na = True)
# 这样的话数据就会将出现了无法使用均值填充NaN的列拆解成多列,一列以(1,0)表示是否NaN,其他的列分别对应该无法使用均值填充NaN使用(1,0)来表示是否拥有该类别。
# 即独热编码
# 此时所有的条目都是数值,我们就可以将data转化为张量格式。
x, y = torch.tensor(inputs.values), torch.tensor(outputs.values)

reshape

a = torch.arange(12)
b = a.reshape((3, 4))
b[:] = 2
# a就会被更改,因为b其实只是一个对a的映射(view)

线性代数基础

矩阵的范数

c=A⋅bhence∣∣c∣∣≤∣∣A∣∣⋅∣∣b∣∣c=A{\cdot}b{\quad}hence ||c||{\leq}||A||{\cdot}||b||c=AbhencecAb

常见范数

  • 矩阵范数:最小的满足的上述公式的值
  • Frobenius范数:∣∣A∣∣Frob=[∑ijAij2]12||A||_{\rm{Frob}}=\left[\sum\limits _{ij}A^2_{ij}\right]^{\frac{1}{2}}AFrob=[ijAij2]21 用的和L2同一个方法,将矩阵拉成向量
  • L2 范数:∣∣x∣∣=∑i=1nxi2||\rm x||=\sqrt {\sum \limits _{i=1} ^{n} x^2_i}x=i=1nxi2 。即向量元素平方和的平方根 torch.norm(u)
  • L1范数:∣∣x∣∣1=∑i=1n∣xi∣||\rm x||_1=\sum \limits _{i=1} ^n |x_i|x1=i=1nxi

特殊矩阵

  1. 对称反对称

    Aij=AjiAij=−AjiA_{ij}=A_{ji}\quad A_{ij}=-A_{ji}Aij=AjiAij=Aji

  2. 正定 positive definite

    ∣∣x∣∣2=xTx≥0||x||^2 = x^T x \ge 0x2=xTx0 generalizes to xTAx≥0x^T Ax \geq 0xTAx0

  3. 正交矩阵

    UUT=1UU^T=1UUT=1、所有行都相互正交、所有行都有单位长度

  4. 置换矩阵

    PPP where Pij=1P_{ij}=1Pij=1 if and only if j=π(i)j=\pi(i)j=π(i),置换矩阵是正交的,就是III矩阵

  5. 特征向量特征值

    特征向量即不被矩阵改变方向的向量,对称矩阵总能找到特征向量

在torch中矩阵的操作

  1. 转置 A.T

  2. 两个形状相同的张量进行的任何按元素二元运算的结果都有同样的形状

  3. 点2中的按元素乘法称为Hadamard product

    A⨀BA\bigodot BAB 在计算机中即A*B

  4. 利用广播机制 A的维度是2 3 4

    sum_A = A.sum(axis=1, keepdims=True) 2 1 4

    A / sum_A

calculus

  1. 作图

    %matplotlib inline  # 这一句是IPython的魔法函数,可以在IPython编译器里直接使用,作用是内嵌画图,省略掉plt.show()这一步,直接显示图像。
    
  2. 求导

    def f(x):
        return 3 * x **2 - 4 * x
    def numerical_limit(f, x, h):
        return (f(x + h) - f(x)) 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值