小灰灰深度学习day6——线性代数

发布时间 2023-06-03 17:26:11作者: 啥都不会的灰太狼
import torch
#标量由只有一个元素的张量表示
'''
x = torch.tensor(3.0)
y = torch.tensor(2.0)
print(x + y)
print(x * y)
print(x / y)
print(x ** y)
'''

'''
向量可以被视为标量值组成的列表,这些标量值被称为向量的元素
在数学上,具有一个轴的张量表示向量,一般张量具有任意长度,取决于机器的内存
'''

'''
x = torch.arange(4)
print(x)

#认为列向量是向量的默认方向,可以用下标访问一个向量中的任意元素(标量的)
print(x[3])

#一个向量的长度通常称为向量的维度
print(len(x))

#当张量(只有一个轴)表示向量时,我们可以通过.shape属性访问向量的长度.
#形状是一个元素组,列出了张量沿每个轴的长度(维数),对于只有一个轴的张量
#形状只有一个元素
print(x.shape)
'''

'''
注意
向量或轴的维度被用来表示向量或轴的长度,即向量或轴的元素数量,
而张量的维度用于
表示张量具有的轴的数量.
所以可以这样说: 张量的某个轴的维数(标量的维数)就是这个轴的长度.
'''

'''
#我们可以这样创建矩阵(具有两个轴的张量)
A = torch.arange(20).reshape(5, 4)
print(A)

#矩阵的转置
B = A.T
print(B)
'''

'''
这里说一下:尽管单个向量的默认方向为列向量,但是在表示表格数据集的矩阵中,
将每个数据样本作为矩阵的行向量更为常见。
'''

#向量是标量的推广,矩阵是向量的推广。也可以说向量是一阶张量,矩阵是二阶张量
#所以张量是描述具有任意数量轴的n维数组的通用方法

#一个张量例子
'''
x = torch.arange(24).reshape(2, 3, 4)
print(x)
y = x.clone()
print(x * y) #并非矩阵相乘,而是两个矩阵对应元素分别相乘
'''

'''
#张量加上或乘以一个标量都不会改变张量的形状,其中张量的每个元素都将与标量相加或相乘
a = 2;
x = torch.arange(20).reshape(2, 10)
print((x + a).shape)
'''

'''
print(id(x))  #.clone开辟一块新内存,复制张量x的内容
print(id(y))
'''

#求和(.sum函数可以求任意形状张量的元素和)
'''
x = torch.arange(4, dtype = torch.float32)
print(x)
print(x.sum())
'''

'''
#求和时可以指定延哪个轴求和,这样可以通过求和降低维度
A = torch.arange(20, dtype = torch.float32).reshape(5, 4)
A_sum_axis0 = A.sum(axis = 0)
print(A_sum_axis0)
print(A_sum_axis0.shape)

A_sum_axis1 = A.sum(axis = 1)
print(A_sum_axis1)
print(A_sum_axis1.shape)

#沿着行和列对矩阵求和,等同于对矩阵所有元素求和
A_sum = A.sum(axis=[0, 1])
print(A_sum)


#与求和类似,求平均值也是如此
print(A.mean())
print(A.sum() / A.numel())

print(A.mean(axis = 0))
print(A.sum(axis = 0) / A.shape[0])  #等价与上面

#非降维求和
sum_A = A.sum(axis = 1, keepdims = True)
print(sum_A)
#我们求和后不降低维度可以再进行除法等操作
print(A / sum_A)
#计算沿某个轴的累加和,且不会改变输入张量的维度
print(A.cumsum(axis = 0))
print(A)
'''

#点积
y = torch.ones(4, dtype = torch.float32)
x = torch.arange(4, dtype = torch.float32)
print(torch.dot(x, y))

#矩阵————向量积
A = torch.arange(20, dtype = torch.float32).reshape(5, 4)
x = torch.arange(4, dtype = torch.float32)
print(A)
print(x)
#A为[5][4],x为[4].将A中每个行向量与x向量点乘
print(torch.mv(A, x))

#矩阵————矩阵乘法
B = torch.ones(4, 3)
print(torch.mm(A, B))
print(A)
print(B)
#不要将矩阵乘法与哈达玛积(对应元素相乘)混淆

#范数
#非正式的说,向量的范数表示一个向量有多大.这里的大小不涉及维度,而是分量的大小
u = torch.tensor([3.0, -4.0])
print(torch.norm(u)) #L2范数:平方和开根号

print(torch.abs(u).sum())  #L1范数:向量元素绝对值之和

#弗罗贝尼乌斯范数(具有向量范数的所有性质,就像矩阵型向量的L2范数):
#为矩阵元素平方和的平方根
print(torch.norm(torch.ones((4, 9))))