本实验中只用到了np.sin。这些数学函数是对np.ndarray逐元素操作的:
x = np.array([0, 3.1415, 3.1415 / 2]) # 0, pi, pi / 2
np.round(np.sin(x)) # 先求sin再四舍五入: 0, 0, 1
array([0., 0., 1.])
1
2
3
此外,还有np.log、np.exp等与python的math库相似的函数(只不过是对多维数组进行逐元素运算)。
np.dot
返回两个矩阵的乘积。与线性代数中的矩阵乘法一致。要求第一个矩阵的列等于第二个矩阵的行数。特殊地,当其中一个为一维数组时,形状会自动适配为n × 1 n\times1n×1或1 × n . 1\times n.1×n.
x = np.array([1,2,3]) # 一维数组
A = np.array([[1,1,1],[2,2,2],[3,3,3]]) # 3 * 3矩阵
np.dot(x,A)
array([14, 14, 14])
np.dot(A,x)
array([ 6, 12, 18])x_2D = np.array([[1,2,3]]) # 这是一个二维数组(1 * 3矩阵)
np.dot(x_2D, A) # 可以运算
array([[14, 14, 14]])
np.dot(A, x_2D) # 行列不匹配
Traceback (most recent call last):
File "", line 1, in
File "<__array_function__ internals>", line 5, in dot
ValueError: shapes (3,3) and (1,3) not aligned: 3 (dim 1) != 1 (dim 0)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
np.eye
np.eye(n)返回一个n阶单位阵。A = np.eye(3)
A
array([[1., 0., 0.],
[0., 1., 0.],
[0., 0., 1.]])
1
2
3
4
5
线性代数相关
np.linalg是与线性代数有关的库。
A
array([[1, 0, 0],
[0, 2, 0],
[0, 0, 3]])
np.linalg.inv(A) # 求逆(本实验不考虑逆不存在)
array([[1. , 0. , 0. ],
[0. , 0.5 , 0. ],
[0. , 0. , 0.33333333]])
x = np.array([1,2,3])
np.linalg.norm(x) # 返回向量x的模长(平方求和开根号)
3.7416573867739413
np.linalg.eigvals(A) # A的特征值
array([1., 2., 3.])
1
2
3
4
5
6
7
8
9
10
11
12
13
生成数据
生成数据要求加入噪声(误差)。上课讲的时候举的例子就是正弦函数,我们这里也采用标准的正弦函数y = sin x . y=\sin x.y=sinx.(加入噪声后即为y = sin x + ϵ , y=\sin x+\epsilon,y=sinx+ϵ,其中ϵ ∼ N ( 0 , σ 2 ) \epsilon\sim N(0, \sigma^2)ϵ∼N(0,σ
2
),由于sin x \sin xsinx的最大值为1 11,我们把误差的方差设小一点,这里设成1 25 \frac{1}{25}
25
1
)。
————————————————