Python处理矩阵,python求矩阵特征值
特征值分解
特征值分解是将一个方阵A分解成如下形式:
其中q是由方阵A的特征向量组成的矩阵,
是对角矩阵,对角元素是特征值。
通过特征值分解获得的前n个特征向量代表矩阵A的最重要的n个变化方向.利用这前n个变化方向,我们可以近似这个矩阵(变换)。
奇异值分解
奇异值分解(SVD)是一种广泛应用于机器学习领域的算法。它不仅可以用于降维算法中的特征分解,还可以用于推荐系统、自然语言处理等领域。它可以应用于任何矩阵分解。
SVD是将m*n的矩阵A分解成以下形式:
其中U和V是正交矩阵,即
,u是左奇异矩阵,
,s是
对角矩阵(对角元素为奇异值,非对角元素均为0),
右奇异向量。
特征值用来描述一个方阵,可以看作是一个空间到自身的映射。奇异值可以描述长方阵或奇异矩阵,可以看作是从一个空间到另一个空间的映射。
奇异值与特征值有关,奇异值是矩阵。
的特征值的平方根。
步骤
输入:样本数据
输出:左奇异矩阵,奇异值矩阵,右奇异矩阵计算特征值:特征值分解
,其中
是原始样本数据。
得到左奇异矩阵。
和奇异值矩阵。
间接寻找部分右奇异矩阵:寻找
使用
可用性
返回
,分别是左奇异矩阵、奇异值矩阵和右奇异矩阵。
Python实现
调用eig和svd方法
将numpy作为np导入
Data=np.array ([[1,0,4],[2,2,0],[0,0,5]]) # array
#调用np.linalg.eig()分解数据A * data 的特征值
eig_value,EIG _ vector=NP . linalg . EIG(data . dot(data。t))
#按降序排列特征值
EIG _ value=NP . sort(EIG _ value)[:-1]
Print(特征值:,eig_value) #特征值
Print(特征值平方根:,np.sqrt(eig_value)) #特征值平方根
#调用np.linalg.svd()对数据进行奇异值分解
u,S,V=np.linalg.svd(数据)
#下降到二维,计算U*S*V的结果应该和数据差不多
recon_data=np.round(U[:2])。dot(np.diag(S[:2]))。dot(V[:2,),0)。astype(int)
Print(奇异值:,S) #奇异值
打印(数据:\n ,数据)
打印(结果为“u * s * v: \n”,recon_data)
结果证明奇异值是矩阵。
的特征值的平方根。结果如下:本征值:[10000]10601 . 686686866616
特征值的平方根:[6]200000000065
奇异值:[6]。58660 . 68666866666
数据:[[1 0 4] [2 2 0] [0 0 5]]
U*S*V的结果:[[1 0 4] [2 2 0] [0 0 5]]
根据奇异值分解原理。
将numpy作为np导入
# 1.调用np.linalg.eig()计算特征值和特征向量
eig_val,u _ vec=NP . linalg . EIG(data . dot(data。t))
S_val=np.sqrt(eig_val) #奇异值:是特征值的平方根。
#把向量u_vec按顺序排好。
s _ val _ sort _ idx=NP . arg sort(s _ val)[:-1]
u_vec=u_vec[:s_val_sort_idx]
#奇异值降序排列
s_val=np.sort(s_val)[:-1]
# 2.计算奇异值矩阵的逆矩阵
s _ val _ inv=NP . linalg . inv(NP . diag(s _ val))
# 3.计算右奇异矩阵
v_vec=s_val_inv.dot((u_vec。t)。点(数据))
#下降到二维,计算U*S*V的结果应该和数据差不多
recon_data=np.round(u_vec[:2]。dot(np.diag(s_val[:2]))。dot(v_vec[:2,]),0)。astype(int)
Print(左奇异矩阵U:\n ,u_vec)
打印(奇异值适马:\n ,s_val)
Print(右奇异矩阵V:\n ,v_vec)
打印(数据:\n ,数据)
打印(结果为“u * s * v: \n”,recon_data)
运行结果
左奇异矩阵u:
[[ 0.63464303 -0.12919086 0.76193041]
[ 0.03795231 -0.97952798 -0.19769816]
[ 0.77187295 0.15438478 -0.61674751]]
奇异值适马:
[6.43771974 2.87467944 0.54035417]
右奇异矩阵v:
[[ 0.11037257 0.01179061 0.99382034]
[-0.72642772 -0.68148675 0.08876135]
[ 0.67832195 -0.73173546 -0.06665242]]
数据:
[[1 0 4]
[2 2 0]
[0 0 5]]
U*S*V的结果:
[[1 0 4]
[2 2 0]
[0 0 5]]
基于奇异值分解的图像压缩
基于奇异值分解的图像压缩:图像实际上是一个数字矩阵。通过奇异值分解降低矩阵的维数,只使用重要特征来表示图像,从而达到压缩的目的。
path=Andrew Ng.jpg
data=io.imread(path,as_grey=True)
打印(数据.形状)
Data=np.mat(data) # mat处理后才能用矩阵乘法降维。
u,sigma,VT=np.linalg.svd(数据)
Count=30 #选择前30个奇异值
#重建矩阵
Dig=np.diag(sigma[:count]) #获取对角矩阵
# dim=数据。T * U[:count] * dig。I #用于降维的额外变量。挖吧。I:这里不用dig的逆矩阵。
Re=u [:count] * dig * vt [:count,] #重建的数据
Plt.imshow(data,cmap=gray) #取灰
Plt.title(原始图片)
plt.show()
Plt.imshow (Redata,cmap= gray) #取灰
Plt.title(基于SVD压缩重建的图片)
plt.show()
原图为720x1080,存储的像素值为720x1080=777600。使用SVD算法,前30个奇异值变成(720 1 1080)*30=54030,实现了差不多15倍的压缩比,大大降低了存储容量。
结果如下
附录
矩阵
方阵:它是一种特殊的矩阵。是方阵n * n的矩阵。
特征值和特征向量
设A为n阶方阵,若有n维非零向量
,制作
那么它就叫做常数
是a的特征值,
一个对应于。
的特征向量。
np.diag()
Np.diag(数组)参数描述:
当array是一维数组时,结果是一个以一维数组为对角元素的矩阵;
当array是二维矩阵时,结果输出矩阵的对角元素。
将numpy作为np导入
#当输入是一维数组时,结果形成一个以一维数组为对角元素的矩阵。
data_1=np.array([1,2,3])
Print(输入为一维数组时的结果:\n ,np.diag(data_1))
#当输入是二维矩阵时,结果输出矩阵的对角元素
data_2=np.array([[1,0,4],[2,2,0],[0,0,5]])
Print(输入为二维数组时的结果:\n ,np.diag(data_2))
当输入是一维数组时运行结果:[[1 0 0] [0 2 0] [0 0 3]]
输入二维数组时的结果:[1 2 5]
相关链接
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。