线性代数实验 np.linalg
import numpy as np
import scipy as sp
生成一个包含整数0~11的向量 a=np.arange(12)
查看数组的大小 a.shape
改变数组的为二维矩阵,其中矩阵的第一个维度为1 a=a.reshape(1,12)
改变数组的形状为3行4列的矩阵 a=a.reshape(3,4)
生成3行四列的矩阵 s=np.arange(12).reshape(3,4)
将矩阵s转职 s.T
或者 s.transpose()
矩阵乘法:
生成两个矩阵,两个矩阵能够相乘的条件为第一个矩阵的列数等于第二个矩阵的行数。
即S x N矩阵 乘 N x M 矩阵可以相乘。其中S和M可以相等,也可不相等。
d=np.arange(6).reshape(3,2)
f=np.arange(6).reshape(2,3)
g=np.matmul(d,f) #也可使用此方法 g=np.dot(d,f)
矩阵元素对应运算:
h=np.arange(6).reshape(3,2)
print(h*h) #矩阵相乘 元素相乘。
print(h+h) #矩阵相加
矩阵求逆
j=np.linalg.inv(h)
特征值与特征向量:
求矩阵的特征值和特征向量并实现可视化
from scipy.linalg import eig
import numpy as np
import matplotlib.pyplot as plt
A=[[1,2],[2,1]]#生成一个2*2的矩阵
evals,evecs=eig(A) #求A的特征值(evals)和特征向量(evecs)
evecs=evecs[:,0],evecs[:,1]
#plt.subplots()返回一个Figure实例fig和一个AxesSubplot实例ax。fig代表整个图像,ax代表坐标轴和画的图
fig,ax=plt.subplots()
#让坐标轴经过远点:
for spine in ['left','botton']: #让在左下角的坐标轴经过原点
ax.spines[spine].set_position('zero')
ax.grid(alpha=0.4)#画出网格
#设置坐标轴的范围
xmin,xmax=-3.3
ymin,ymax=-3.3
ax.set(xlim=(xmin,xmax),ylim=(ymin,ymax))
#画出特征向量,用一个箭头指向要注释的地方,再写上一段话的行为,叫做annotate,s是输入内容,
#xy箭头指向,xytext文字所处的位置,arrowprops通过arrowstyle表明箭头的风格或种类
for v in evecs:
ax.annotate(s="",xy=v,xytext=(0,0),
arrowprops=dict(facecolor='blue',
shrink=0,
alpha=0.6,
width=0.5))
#画出特征空间:
x=np.linspace(xmin,xmax,3)#指定的间隔内返回均匀间隔的数字,即生成等差数列
for v in evecs:
a=v[1]/v[0]#沿特征向量方向的单位向量
ax.plot(x,a*x,'r-',lw=0.4)#参数lw表示图线的粗细
plt.show()
求一个矩阵的行列式
e=[[1,2,3],
[4,5,6],
[7,8,9]]
print(np.linalg.det(e))
奇异值分解实现
利用奇异值分解,通过文章标题出现的关键词,对文展进行聚类
import numpy as np
import matplotlib.pyplot as plt
#输入关键字
words=['books','dad','stock','value','singular','estate','decomposition']
#设已知有8个标题,7个关键字。记录每个标题中每个关键字出现的次数,得矩阵X。x中每一行表示一个标题,、
#每一列表示一个关键字,矩阵中的每个元素表示一个关键字中一个标题中出现的次数。
X=np.array([0,2,1,0,0,0,0],[2,0,0,0,0,0,0],[1,0,0,0,0,0,1],[0,0,1,0,0,0,0],[0,1,0,0,0,0,0],
[0,0,0,1,1,0,1],[0,1,0,0,1,0,0],[0,0,0,0,1,1,1])
#进行奇异值分解:
U,s,Vh=np.linalg.svd(x)
#输出左奇异矩阵U:
print('U=',U)
#输出奇异值矩阵:
print("s=",s)
#按每个奇异值一一对应一个左奇异向量和一个右奇异向量从大到小排列输出结果:
#s=[2.75726275 2.678248 1.89221277 1.61803399 1.19154564 0.9483983 0.61803399 0.56999221]
#输出右奇异矩阵Vh
print("Vh=",Vh)
#规定坐标轴的范围
plt.axis([-0.8,0.2,-0.8,0.8])
#原每个关键字由1*8的向量表示,现将维成1*2的向量以便进行可视化
for i in range(len(words)):
plt.text(U[i,0],U[i,1],words[i])
plt.show()
线性方程组求解:
用到函数 scipy.linalg.solve
#比如我们对胶片中矩阵章节中的部门月度跑步案列进行线性方程组求解。
#10x_1+8x_2+12x_3=20
#4x_1+4x_2+2x_3=8
#2x_1-4x_2-2x_3=-5
from scipy.linalg import solve
a=np.array([[10,8,12],[4,4,2],[2,-4,-2]])
b=np.array([20,8,-5])
x=solve(a,b)
print(x)