Python处理矩阵,python求矩阵特征值

  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的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: