数据分析---SVD,特征值和特征向量

来源:互联网 发布:一级计算机考试软件 编辑:程序博客网 时间:2024/05/20 02:28

特征值和特征向量其实是线性代数里面的东西,好久之前学习的,差不多都忘光了,这里还是再复习下,慢慢拣回来。网上其实也有很多各种介绍,从基本的原理到几何解释,理解起来还是要一定的数学功底,不过慢慢理解了就没有那么难了。


这里举个例子来实作一番:

数据文件(input_data.txt)

1    1    1    1    1    1
1    1    1    1    1    1
1    0    0    0    0    1
1    0    1    1    0    1
1    0    1    1    0    1
1    0    1    1    0    1
1    0    1    1    0    1
1    0    1    1    0    1
1    0    1    1    0    1
1    0    1    1    0    1
1    0    1    1    0    1
1    0    1    1    0    1
1    0    1    1    0    1
1    0    1    1    0    1
1    0    1    1    0    1
1    0    0    0    0    1
1    1    1    1    1    1
1    1    1    1    1    1
1    1    1    1    1    1

看得出来,这是一个19*6的矩阵,那些为0的位置一起来看,是不是很像一个0,对了,没错,图片处理里面就是标准的0。

下面通过Java Jama来读取数据,并获得SVD:

import Jama.Matrix;
import Jama.SingularValueDecomposition;

public static List<String> readFromFile(String name) {
        List<String> list = new ArrayList<String>();
        BufferedReader bufferedreader;
        try {
            bufferedreader = new BufferedReader(new FileReader(name));
            for (String sLine = bufferedreader.readLine(); sLine != null; sLine = bufferedreader.readLine()) {
                if (sLine != null && sLine.trim().length() > 0)
                    list.add(sLine);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return list;
    }

public static void test() {
        List<String> list = readFromFile("data/input_data.txt");
        double d[][] = new double[19][6];
        for (int i = 0; i < list.size(); i++) {
            String str[] = list.get(i).split("    ");
            for (int j = 0; j < str.length; j++) {
                d[i][j] = Double.parseDouble(str[j]);
            }
        }

        Matrix A = new Matrix(d);
        System.out.print("A = ");
        A.print(9, 6);
        SingularValueDecomposition s = A.svd();
        System.out.print("U = ");
        Matrix U = s.getU();
        U.print(9, 6);
        System.out.print("Sigma = ");
        Matrix S = s.getS();
        S.print(9, 6);
        System.out.print("V = ");
        Matrix V = s.getV();
        V.print(9, 6);
        System.out.println("rank = " + s.rank());
        System.out.println("condition number = " + s.cond());
        System.out.println("2-norm = " + s.norm2());
    }

输出的结果:

A =
   1.000000   1.000000   1.000000   1.000000   1.000000   1.000000
   1.000000   1.000000   1.000000   1.000000   1.000000   1.000000
   1.000000   0.000000   0.000000   0.000000   0.000000   1.000000
   1.000000   0.000000   1.000000   1.000000   0.000000   1.000000
   1.000000   0.000000   1.000000   1.000000   0.000000   1.000000
   1.000000   0.000000   1.000000   1.000000   0.000000   1.000000
   1.000000   0.000000   1.000000   1.000000   0.000000   1.000000
   1.000000   0.000000   1.000000   1.000000   0.000000   1.000000
   1.000000   0.000000   1.000000   1.000000   0.000000   1.000000
   1.000000   0.000000   1.000000   1.000000   0.000000   1.000000
   1.000000   0.000000   1.000000   1.000000   0.000000   1.000000
   1.000000   0.000000   1.000000   1.000000   0.000000   1.000000
   1.000000   0.000000   1.000000   1.000000   0.000000   1.000000
   1.000000   0.000000   1.000000   1.000000   0.000000   1.000000
   1.000000   0.000000   1.000000   1.000000   0.000000   1.000000
   1.000000   0.000000   0.000000   0.000000   0.000000   1.000000
   1.000000   1.000000   1.000000   1.000000   1.000000   1.000000
   1.000000   1.000000   1.000000   1.000000   1.000000   1.000000
   1.000000   1.000000   1.000000   1.000000   1.000000   1.000000

U =
   0.264074   0.360582   0.015672  -0.842474   0.297628   0.040678
   0.264074   0.360582   0.015672   0.493462   0.738874  -0.102763
   0.117205  -0.115724   0.687656   0.055357   0.060708   0.702318
   0.228008  -0.164093  -0.066477  -0.000000   0.000000  -0.000000
   0.228008  -0.164093  -0.066477  -0.000000  -0.000000   0.000000
   0.228008  -0.164093  -0.066477  -0.000000   0.000000   0.000000
   0.228008  -0.164093  -0.066477  -0.000000   0.000000   0.000000
   0.228008  -0.164093  -0.066477  -0.000000   0.000000   0.000000
   0.228008  -0.164093  -0.066477  -0.000000   0.000000   0.000000
   0.228008  -0.164093  -0.066477  -0.000000   0.000000   0.000000
   0.228008  -0.164093  -0.066477  -0.000000   0.000000   0.000000
   0.228008  -0.164093  -0.066477  -0.000000   0.000000   0.000000
   0.228008  -0.164093  -0.066477  -0.000000   0.000000   0.000000
   0.228008  -0.164093  -0.066477  -0.000000   0.000000   0.000000
   0.228008  -0.164093  -0.066477  -0.000000   0.000000   0.000000
   0.117205  -0.115724   0.687656  -0.055357  -0.060708  -0.702318
   0.264074   0.360582   0.015672   0.116337  -0.345501   0.020695
   0.264074   0.360582   0.015672   0.116337  -0.345501   0.020695
   0.264074   0.360582   0.015672   0.116337  -0.345501   0.020695

Sigma =
   8.556853   0.000000   0.000000   0.000000   0.000000   0.000000
   0.000000   2.621542   0.000000   0.000000   0.000000   0.000000
   0.000000   0.000000   1.381226   0.000000   0.000000   0.000000
   0.000000   0.000000   0.000000   0.000000   0.000000   0.000000
   0.000000   0.000000   0.000000   0.000000   0.000000   0.000000
   0.000000   0.000000   0.000000   0.000000   0.000000   0.000000

V =
   0.501455  -0.151688   0.474904  -0.585392   0.326890  -0.224632
   0.154305   0.687729   0.056733   0.394036   0.525037  -0.262814
   0.474060  -0.063401  -0.520814  -0.045296   0.342752   0.616822
   0.474060  -0.063401  -0.520814   0.045296  -0.342752  -0.616822
   0.154305   0.687729   0.056733  -0.394036  -0.525037   0.262814
   0.501455  -0.151688   0.474904   0.585392  -0.326890   0.224632

rank = 3
condition number = 3.1414638785269248E17
2-norm = 8.556853007230833

用R来实作一番呢?哈哈,也是很简单的事情:

输入数据,通过R的数据编辑,输入数据


通过svd函数直接计算,结果也是一样的。


通过这个例子,对SVD有了更多的理解,至于SVD的应用场景,也是很容易想到的。



0 0
原创粉丝点击