SVD(奇异值分解) ——多少人曾羡慕你年轻时的容颜。。

一、特征值分解

who is 特征值和特征向量?

说道特征值和特征向量就不得不翻开大学学的线性代数来看一遍定义了。

  • 定义:设 为 阶方阵,若存在数L和非零向量x,使得,则称l是 的一个特征值, 为 的对应于特征值 的特征向量。
    手边还没把线性代数扔掉的同学,可以去翻翻书。

How to 求特征值和特征向量?

来吧,咱们直接上到线性代数例题。请听题:




  • 得基础解系:p_1= \begin{pmatrix} -2\\ 1\\ 0 \\ \end{pmatrix} , p_2= \begin{pmatrix} -2\\ 0\\ 1 \\ \end{pmatrix} 正交化: \beta_1= \begin{pmatrix} -\frac{2}{\sqrt{5}}\\ \frac{1}{\sqrt{5}}\\ 0 \\ \end{pmatrix} \beta_2= \begin{pmatrix} -\frac{2}{3\sqrt{5}}\\ \frac{4}{3\sqrt{5}}\\ \frac{5}{3\sqrt{5}} \\ \end{pmatrix}


    Q=(\beta_1,\beta_2,\beta_3) = \begin{pmatrix} -\frac{2}{\sqrt{5}} & -\frac{2}{3\sqrt{5}} & \frac{1}{3}\\ \frac{1}{\sqrt{5}}& \frac{4}{3\sqrt{5}} &\frac{2}{3}\\ 2& \frac{5}{3\sqrt{5}} & \frac{2}{3} \\ \end{pmatrix} , \Lambda= \begin{pmatrix} -3& 0 & 0\\ 0& -3 &0\\ 0& 0 & 6 \\ \end{pmatrix}
    到这有没有回忆起被线性代数支配的恐惧啊。咱们言归正传。如果现实世界中的所有矩阵都是实对称矩阵,我们直接用特征值分解就行,但是,现实是我们会碰到一些稀奇古怪的矩阵。比如一个的矩阵。可以向上面一样分解吗?当然能!

二、奇异值分解(SVD)

Who is 奇异值分解

  • 定义:设给定为阶矩阵,可分解为如下形式。其中和均为单位正交矩阵。U称为左奇异矩阵,称为右奇异矩阵为对角矩阵。对角线元素称为奇异值。一般

How to 奇异值分解?

我们可以把给定的进行如下的变换:


得到的,如下所示。注意两个矩阵的阶次不同。为阶矩阵,为阶矩阵。


这样我们就可以利用,做特征值分解。分别得到,然后对或中的特征值开平方,就得到了所有的奇异值。

奇异值分解有啥用?

  • 图像压缩

//@cpp
#include 
#include 
#include "opencv2/imgproc.hpp"
#include "opencv2/highgui.hpp"
using namespace std;
using namespace cv;
int main()
{
    Mat image = imread("g.png", 0);//以灰度图打开一张336x362的image.png
    Mat temp(image.size(), CV_32FC1, Scalar(0));
    image.convertTo(image, CV_32FC1);//类型转换
    Mat U, W, V;
    SVD::compute(image, W, U, V);//opencv得到的V与MATLAB相比已经经过转置了,要想再转置一遍可以用V=V.t();
    image.convertTo(image, CV_8UC1);
    imshow("0", image);
    Mat w(336, 336, CV_32FC1, Scalar(0));//opencv进行SVD分解后得到的奇异值不是放入对角矩阵,而是一个列向量中,所以需要自己将其变换为对角矩阵
    for (int i = 0; i < 20; i++)//取前20个奇异值
    {
        w.ptr(i)[i] = W.ptr(i)[0];
    }
    temp = U * w * V;
    temp.convertTo(temp, CV_8UC1);
    imshow("1", temp);
    waitKey(0);
}
美女卸妆
  • 主成分分析

你可能感兴趣的:(SVD(奇异值分解) ——多少人曾羡慕你年轻时的容颜。。)