(1)给定任意方矩阵 A , A+A⊤ 总是对称的吗?为什么?
由线性代数的基础知识可知, (A + AT)T = AT + (AT)T = A + AT
(2) 在2.3.4节中定义了形状(2,3,4)的张量X.len(X)的输出结果是什么?
X = torch.arange(24).reshape(2, 3, 4)
len(X)
(3) 对于任意形状的张量X,len(X)是否总是对应于X特定轴的长度?这个轴是什么?
len(X) 总对应第 0 轴的长度(可以利用代码自己实现)
(4) 在2.3.6节基础上运行A/A.sum(axis=1),看看会发生什么。你能分析原因吗?
A = torch.arange(12).reshape(3,4)
A / A.sum(axis=1)
通过照抄2.3.6节的代码可以发现运行后出现如下错误
RuntimeError: The size of tensor a (4) must match the size of tensor b (3) at non-singleton dimension 1
这是因为维度不对 A 是一个3 * 4 的矩阵,而 A.sum(axis=1) 是一个大小为 3 的向量,两者不能相除。(注:广播只能发生在两者维数相同的情况下,比如都是二维)
2. 编程绘制函数 和其在x = 1处切线的图像
#导入包
import matplotlib.pyplot as plt
import torch
import numpy as np
#开始设置相关参数,按照求切线的过程运算
x = torch.tensor([1.]) #设置x的值为tensor形式的,方便后面求导
x.requires_grad_(True) #开启递归运算,为后面求导做准备
y = x**3 - 1/x
y.backward() #求导 value存在x.grad中
k = (x.grad).numpy()[0] #提取需要的值(斜率) x.grad 输出是 tensor([4.])
x = 1 #此时x为一个int型的数据主要为了方便后面计算b的值
y = x**3 - 1/x #再次设置一遍是为了计算切线的
b = y - k*x #求b的值
#开始话函数
x = np.arange(-5,5,0.01) #产生x的数据范围(-10,10)步长为0.0.1
y1 = x**3 - 1 / x #原函数
y2 = k*x + b #切线函数
plt.plot(x,y1,label = "y1",c = "b") # y1
plt.plot(x,y2,label = "y2",c = "g",linestyle = "-.") # y2
plt.xlabel('x')
plt.ylabel('y')
plt.ylim(-20,20) #规定一下y轴的范围
plt.show()
3. 为什么计算二阶导数比一阶导数的开销要更大?
因为二阶导数是在一阶导数的基础上再求导,所以开销肯定比计算一阶导数大
4. 给定两个概率为 P(A) 和 P(B) 的事件,计算 P(A∪B) 和 P(A∩B) 的上限和下限。(提示:使用友元图来展示这些情况。)
对于 P ( A ∪ B ) ,上限是 P(A) + P(B),下限是 max{P(A), P(B)}。
对于P ( A ∩ B),上限是 min{P(A), P(B)},下限是 0。
(画图)