CV学习-数学基础-特征值和奇异值分解
机器学习数学
编辑于2021/12/24 12:10
特征分解:
就是在求得特征值的基础上求逆只保留原矩阵
对矩阵分解的理解:
(1)什么是矩阵
简单来说,就是一堆数值
复杂来说,在运动学上,如果乘与一个向量,则是代表了一个旋转拉伸的过程(cv上代表一个图像的各点像素值)
(2)什么是特征值?
简单来说,对于一个矩阵,只有拉伸的时候的情况的时候对应的拉伸倍数(具体情况如下)

(3)为啥要求,求得这个有啥用?
什么叫特征,特征就是区别于其他的东西
一个矩阵,我们很难直接看出它要怎么变化
那么,用特征值我们就能区分出来,谁在某个方面(特征)最猛
(4)特征分解:
右边的三个矩阵便是我们分解的结果了

奇异值分解:
矩阵的特征分解是基于方阵的,而奇异值分解则是基于此的推广,使得非方阵也可以进行分解(因为在实际应用中有很多的非方阵)
没有方阵怎么办?
构造呗,怎么构造,乘转置(效果其实和特征分解几乎相同)

在机器学习上的应用:
(1)图像压缩
(2)特征减少
(3)数据集以及模型的选择(初始化)
numpy实现:
import numpy as np
"""
参数:矩阵A
"""
def svd(A):#求A成A的转置的特征值以及特征向量eigen_values, eigen_vectors = np.linalg.eig(A.dot(A.T))#特征向量构∑singular_values = np.sqrt(eigen_values)val_vec = [] #奇异值-特征向量对for i in range(len(eigen_values)):val_vec.append((singular_values[i], eigen_vectors[:, i])) #这个语法的意思是取所有特征向量的第i个值val_vec.sort(key = lambda x:-x[0])singular_values = [ pair[0] for pair in val_vec]eigen_vectors = [ pair[1] for pair in val_vec]U = np.zeros((A.shape[0], A.shape[1]))for i in range(A.shape[1]):#特征向量 = 矩阵*特征向量/特征值u = A.dot(eigen_vectors[i])/singular_values[i]U[:, i] = ufor i in range(A.shape[1], A.shape[0]):basis = np.zeros((A.shape[0], 1))basis[i] = 1U = np.concatenate([U, basis], axis=1)eigen_vectors = [vec.reshape(-1, 1) for vec in eigen_vectors]eigen_vectors = np.concatenate(eigen_vectors, axis=1)return U, singular_values, eigen_vectorsA = np.array([[1,2],[0,0],[0,0]])svd(A)
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
