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

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


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

数据文件(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的应用场景,也是很容易想到的。



  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值