当你知道工具的用处,理论与工具如何结合的时候,通常会加速咱们对两者的学习效率。

零 numpy

那么,Numpy是什么?

NumPy(Numerical Python) 是 Python 语言的一个扩展程序库,支持大量维度的数组与矩阵运算,此外也针对数组运算提供大量的数学函数库。

NumPy 的前身 Numeric 最早是由 Jim Hugunin 与其它协作者共同开发,2005 年,Travis Oliphant 在 Numeric 中结合了另一个同性质的程序库 Numarray 的特色,并加入了其它扩展而开发了 NumPy。NumPy 为开放源代码并且由许多协作者共同维护开发。 ---- 摘自 · 菜鸟教程

一 要点

假定AX=b,求解未知矩阵X 【线性代数中常遇到的运算问题】

矩阵转置A^(T)

矩阵的逆A^(-1)

矩阵行列式的值|A|

矩阵的秩 rank(A)

矩阵的迹 trace(A)

其它

单位矩阵

0向量/矩阵

...

二 示例应用

2.1 求解AX=b中的未知参数矩阵X

import numpy as np

# Hypothsis : A*X = b

A = [[2,1,2],

[3,1,0],

[1,1,-1]];

b = np.transpose([-3,5,-2])# 转置

#[or] b = np.transpose(np.array([-3,5,-2]))# 转置

# 求解未知参数矩阵X

X = np.linalg.solve(A,b) # 方式一:直接使用numpy的solve函数一键求解

#A_inv=np.linalg.inv(A) # 方式二:先求逆运算,再点积求值

#X=np.dot(A_inv,b) # a.dot(b) 与 np.dot(a,b) 效果相同;but np.dot(a,b)与np.dot(b,a)效果肯定是不同的(线性代数/矩阵常识)

print("方程组的解:\n",X);

# [output]

方程组的解:

[ 4.4 -8.2 -1.8]

2.2 利用最小二乘法拟合函数模型

给出一组数据【5对(Xi,Yi)参数】,用最小二乘法,求形如:f(x)=a+b*x^3的经验公式。

原方程(模型)

\[f(x) = a + bx^3

\]

其法方程

\[A^T A \begin{pmatrix} a \\ b \\ \end{pmatrix} = A^T y

\]即

\[\begin{pmatrix} a \\ b \\ \end{pmatrix} = \left( A^T A \right)^{-1} A^T y

\]import numpy as np

import matplotlib.pyplot as plt # Python 绘图工具(业界推荐)

# 数据初始化

A = [

[1,pow(-3,3)],

[1,pow(-2,3)],

[1,pow(-1,3)],

[1,pow(2,3)],

[1,pow(4,3)]

];

At = np.transpose(A); # A的转置矩阵

y = np.transpose([14.3,8.3,4.7,8.3,22.7]);

# step1:求解

## 令 (a ,b)^T 为 未知参数X

X = np.dot(np.dot(np.linalg.inv(np.dot(At,A)),At),y)

print(X)

print("a:",X[0])

print("b:",X[1])

# step2:查看拟合效果

x = [-3,-2,-1,2,4];

## 1. 计算拟合数值 fitValue

def fitValue(arg_x):

a = X[0];

b = X[1];

return a + b*pow(arg_x,3);

fitValues = np.zeros([5]); # 创建长为5的【一维】数组;[1,5]:创建第1行为5个元素的【二维】数组

for i in range(0,len(fitValues)):

fitValues[i] = fitValue(x[i]);

print(i,":","x(i):",x[i],"fit Y:",fitValues[i]); # just for test

pass;

## 2. 绘图可视化

yt = np.transpose(y); # y的转置

plt.rcParams['figure.dpi'] = 100 #分辨率

plt.scatter(x, yt, marker = '*',color = 'red', s = 10 ,label = 'Actual Dataset') # 真实数据集

plt.scatter(x, fitValues, marker = 'x',color = 'green', s = 10 ,label = 'Fitting Dataset') #[拟合数据集]

plt.legend(loc = 'best') # 设置 图例所在的位置 使用推荐位置

plt.show()

# [output]

[ 10.67505325 0.13679816]

a: 10.6750532504

b: 0.136798159666

0 : x(i): -3 fit Y: 6.98150293942

1 : x(i): -2 fit Y: 9.58066797308

2 : x(i): -1 fit Y: 10.5382550907

3 : x(i): 2 fit Y: 11.7694385277

4 : x(i): 4 fit Y: 19.430135469

2.3 数组创建/初始化

numpy.linspace(start, stop[, num=50[, endpoint=True[, retstep=False[, dtype=None]]]]])

一维等差数列

return 在指定范围内的均匀间隔的数字(组成的数组),也即返回一个等差数列

参数

start - 起始点

stop - 结束点

num - 元素个数,默认为50,

endpoint - 是否包含stop数值,默认为True,包含stop值;若为False,则不包含stop值

retstep - 返回值形式,默认为False,返回等差数列组,若为True,则返回结果(array([samples, step])),

dtype - 返回结果的数据类型,默认无,若无,则参考输入数据类型。

import numpy as np

a = np.linspace(1,10,5,endpoint= True)

print(a) # [ 1. 3.25 5.5 7.75 10. ]

b = np.linspace(1,10,5,endpoint= False)

print(b) #[1. 2.8 4.6 6.4 8.2]

c = np.linspace(1,10,5,retstep = False)

print(c) # [ 1. 3.25 5.5 7.75 10. ]

d = np.linspace(1,10,5,retstep = True)

print(d) # (array([ 1. , 3.25, 5.5 , 7.75, 10. ]), 2.25)

2.4 线性代数常用运算

print("原矩阵A:\n",A);

print("原矩阵b:\n",b);

print("转置矩阵A^T:\n",np.transpose(A)); # 转置

print("矩阵的行列式值|A|:\n",np.linalg.det(A)); # 方阵的行列式值:|A|

print("矩阵的迹trace(A):\n",np.trace(A));

print("矩阵的秩rank(A):\n",np.linalg.matrix_rank(A));

print("逆矩阵A^(-1):\n",np.linalg.inv(A)); #矩阵的逆运算(条件:矩阵A可逆(行列式值不为0)| 矩阵A为方阵)

print("*"*30); # 分隔线

print("N阶单位矩阵:\n",np.eye(4));

print(np.zeros([5])); # 创建长为5的【一维】数组;[1,5]:创建第1行为5个元素的【二维】数组

# 创建指定的初始化数组

print(np.array([1])) # 生成 第1行含值为1的元素的【一维】数组

print(np.array([[56]])) # 生成 第1行含值为56的元素的【二维】数组

np.full((3,5),3.14) # 创建一个3x5的浮点型数组,数组的值都是3.14

# [output]

原矩阵A:

[[2, 1, 2], [3, 1, 0], [1, 1, -1]]

原矩阵b:

[-3 5 -2]

转置矩阵A^T:

[[ 2 3 1]

[ 1 1 1]

[ 2 0 -1]]

矩阵的行列式值|A|:

5.0

矩阵的迹trace(A):

2

矩阵的秩rank(A):

3

逆矩阵A^(-1):

[[-0.2 0.6 -0.4]

[ 0.6 -0.8 1.2]

[ 0.4 -0.2 -0.2]]

**********************

N阶单位矩阵:

[[ 1. 0. 0. 0.]

[ 0. 1. 0. 0.]

[ 0. 0. 1. 0.]

[ 0. 0. 0. 1.]]

[ 0. 0. 0. 0. 0.]

[1]

[[56]]

三 推荐文献

Numpy - 菜鸟教程

Numpy学习笔记二——初始化数组的10种方法

参考链接

评论可见,请评论后查看内容,谢谢!!!评论后请刷新页面。