六、降维

降维[Dimensionality Reduction]:

降维 是减少变量数量的过程。它可以用来从含有噪声的未加工特征中提取潜在特征,或者在维持原来结构的情况下压缩数据。MLlib提供了类RowMatrix 上的降维支持。

奇异值分解 (SVD):

奇异值分解(SVD)将一个矩阵分解为三个矩阵:U, Σ, 和V ,三个矩阵满足条件:

A=UΣVT,A=UΣVT,

U是正交矩阵,该矩阵的列称为左奇异向量。

Σ 是对角矩阵,对角线上的元素降序排列,对角线上的每个值称为奇异值。

V是正交矩阵,该矩阵的列称为右奇异向量。

对于大型举证,我们通常不需要完全分解,而是求解最大的几个奇异值以及对应的奇异向量即可。这样做可以节省存储空间、降噪以及恢复矩阵的低秩结构。

如果我们保留top k 个奇异值,那么结果中的低秩矩阵的维度如下:

UU: m×km×k,
ΣΣ: k×kk×k,
VV: n×kn×k.

性能:

假设n小于m。奇异值和右奇异向量来自Gramian矩阵(ATA)的特征值和特征向量。存储左奇异矩阵的向量是U,通过矩阵乘法U = A(VS-1)得到(指定ComputeU参数)。实际使用的方法基于计算开销自动选择。

如果n比较小(n < 100)或者k相对于n比较大(k > n/2),我们先计算Grimian矩阵,然后在本地驱动程序中计算最大的特征值和特征向量。这需要一趟遍历,在执行器和驱动程序上的空间复杂度O(n2),在驱动程序上的时间复杂度O(n2k)。

否则,我们分布式计算 (ATA)v 并交给ARPACK(大规模特征值计算程序包)去计算最大的特征值以及特征向量。这需要O(k)次遍历,执行器上O(n)的存储空间以及驱动程序上O(nk)存储空间。

import java.util.LinkedList;

import org.apache.spark.api.java.*;
import org.apache.spark.mllib.linalg.distributed.RowMatrix;
import org.apache.spark.mllib.linalg.Matrix;
import org.apache.spark.mllib.linalg.SingularValueDecomposition;
import org.apache.spark.mllib.linalg.Vector;
import org.apache.spark.mllib.linalg.Vectors;
import org.apache.spark.rdd.RDD;
import org.apache.spark.SparkConf;
import org.apache.spark.SparkContext;

public class SVD {
  public static void main(String[] args) {
    SparkConf conf = new SparkConf().setAppName("SVD Example");
    SparkContext sc = new SparkContext(conf);

    double[][] array = ...
    LinkedList<Vector> rowsList = new LinkedList<Vector>();
    for (int i = 0; i < array.length; i++) {
      Vector currentRow = Vectors.dense(array[i]);
      rowsList.add(currentRow);
    }
    JavaRDD<Vector> rows = JavaSparkContext.fromSparkContext(sc).parallelize(rowsList);

    // Create a RowMatrix from JavaRDD<Vector>.
    RowMatrix mat = new RowMatrix(rows.rdd());

    // Compute the top 4 singular values and corresponding singular vectors.
    SingularValueDecomposition<RowMatrix, Matrix> svd = mat.computeSVD(4, true, 1.0E-9d);
    RowMatrix U = svd.U();
    Vector s = svd.s();
    Matrix V = svd.V();
  }
}

主成分分析(PCA):

主成分分析 (PCA)是寻找坐标旋转的一种统计方法,该方法可以使得:样本点在第一个坐标上拥有最大的方差,后续坐标依次拥有次大的方差。其中用到的旋转矩阵的列称为主成分。PCA在降维中有广泛应用。

补充:

主成分分析的一般计算步骤:

1.  数据标准化:设样本数为m,每个样本特征维度为n, 在每个维度上计算均值u和方差δ2(。然后令归一化特征值:  x’ = (x – u)/δ

2. 求协方差矩阵(也有的地方计算相关系数矩阵)。

3. 求协方差矩阵的特征值和特征向量。

4. 将特征值从大到小排序,取最大的k个特征值,然后将对应的k个特征向量的作为列向量组成矩阵。k 值的确定参考当前累计特征值的和占特征值总和的比例,一般要求在85%以上。

5. 投影:将归一化之后的样本点投影到选取的特征向量上。ResultDataMatrix(m, k)  = NormalizedDataMatrix(m, n) * EigenVectorsMatix(n * k)

import java.util.LinkedList;

import org.apache.spark.api.java.*;
import org.apache.spark.mllib.linalg.distributed.RowMatrix;
import org.apache.spark.mllib.linalg.Matrix;
import org.apache.spark.mllib.linalg.Vector;
import org.apache.spark.mllib.linalg.Vectors;
import org.apache.spark.rdd.RDD;
import org.apache.spark.SparkConf;
import org.apache.spark.SparkContext;

public class PCA {
  public static void main(String[] args) {
    SparkConf conf = new SparkConf().setAppName("PCA Example");
    SparkContext sc = new SparkContext(conf);

    double[][] array = ...
    LinkedList<Vector> rowsList = new LinkedList<Vector>();
    for (int i = 0; i < array.length; i++) {
      Vector currentRow = Vectors.dense(array[i]);
      rowsList.add(currentRow);
    }
    JavaRDD<Vector> rows = JavaSparkContext.fromSparkContext(sc).parallelize(rowsList);

    // Create a RowMatrix from JavaRDD<Vector>.
    RowMatrix mat = new RowMatrix(rows.rdd());

    // Compute the top 3 principal components.
    Matrix pc = mat.computePrincipalComponents(3);
    RowMatrix projected = mat.multiply(pc);
  }
}
时间: 2024-10-09 23:44:46

六、降维的相关文章

【Python数据挖掘课程】六.Numpy、Pandas和Matplotlib包基础知识

前面几篇文章采用的案例的方法进行介绍的,这篇文章主要介绍Python常用的扩展包,同时结合数据挖掘相关知识介绍该包具体的用法,主要介绍Numpy.Pandas和Matplotlib三个包.目录:        一.Python常用扩展包        二.Numpy科学计算包        三.Pandas数据分析包        四.Matplotlib绘图包 前文推荐:       [Python数据挖掘课程]一.安装Python及爬虫入门介绍       [Python数据挖掘课程]二.K

Stanford机器学习---第十讲. 数据降维

本文原始地址见http://blog.csdn.net/abcjennifer/article/details/8002329,在此添加了一些自己的注释方便理解 本栏目(Machine learning)包括单参数的线性回归.多参数的线性回归.Octave Tutorial.Logistic Regression.Regularization.神经网络.机器学习系统设计.SVM(Support Vector Machines 支持向量机).聚类.降维.异常检测.大规模机器学习等章节.内容大多来自

机器学习笔记----四大降维方法之PCA(内带python及matlab实现)

大家看了之后,可以点一波关注或者推荐一下,以后我也会尽心尽力地写出好的文章和大家分享. 本文先导:在我们平时看NBA的时候,可能我们只关心球员是否能把球打进,而不太关心这个球的颜色,品牌,只要有3D效果,看到球员扣篮的动作就可以了,比如下图: 如果我们直接对篮球照片进行几百万像素的处理,会有几千维甚至几万维的数据要计算,计算量很大.而往往我们只需要大概勾勒出篮球的大概形状就可以描述问题,所以必须对此类数据降维,这样会使处理数据更加轻松.这个在人脸识别中必须要降维,因为我们在做特征提取的时候几万维

Stanford机器学习---第六讲. 怎样选择机器学习方法、系统

原文见http://blog.csdn.net/abcjennifer/article/details/7797502  添加了一些自己的注释和笔记 本栏目(Machine learning)包括单参数的线性回归.多参数的线性回归.Octave Tutorial.Logistic Regression.Regularization.神经网络.机器学习系统设计.SVM(Support Vector Machines 支持向量机).聚类.降维.异常检测.大规模机器学习等章节.所有内容均来自Stand

PCA降维

1.1算法流程 假设有m个samples,每个数据有n维. 1. 计算各个feature的平均值,计μj ;(Xj(i)表示第i个样本的第j维特征的value) μj = Σm Xj(i)/m meanVals = mean(dataMat, axis=0) 2. 将每一个feature scaling:将在不同scale上的feature进行归一化: 3. 将特征进行mean normalization Xj(i)= (Xj(i)-μj)/sj meanRemoved = dataMat -

机器学习基础与实践(三)----数据降维之PCA

写在前面:本来这篇应该是上周四更新,但是上周四写了一篇深度学习的反向传播法的过程,就推迟更新了.本来想参考PRML来写,但是发现里面涉及到比较多的数学知识,写出来可能不好理解,我决定还是用最通俗的方法解释PCA,并举一个实例一步步计算,然后再进行数学推导,最后再介绍一些变种以及相应的程序.(数学推导及变种下次再写好了) 正文: 在数据处理中,经常会遇到特征维度比样本数量多得多的情况,如果拿到实际工程中去跑,效果不一定好.一是因为冗余的特征会带来一些噪音,影响计算的结果:二是因为无关的特征会加大计

机器学习中使用的神经网络第六讲笔记

Geoffery Hinton教授的Neuron Networks for Machine Learning的第六讲介绍了随机梯度下降法(SGD),并且介绍了加快学习速度的动量方法(the momentum method).针对网络中每一个连接的自适应学习步长(adaptive learning rates for each connection)和RMSProp算法. 这几个算法的难度很大,需要反复推理思考,并在实践中摸索以加深理解. Overview of mini-batch gradie

ng机器学习视频笔记(十二) ——PCA实现样本特征降维

ng机器学习视频笔记(十二) --PCA实现样本特征降维 (转载请附上本文链接--linhxx) 一.概述 所谓降维(dimensionality reduction),即降低样本的特征的数量,例如样本有10个特征值,要降维成5个特征值,即通过一些方法,把样本的10个特征值映射换算成5个特征值. 因此,降维是对输入的样本数据进行处理的,并没有对预测.分类的结果进行处理. 降维的最常用的方法叫做主成分分析(PCA,principal component analysis).最常用的业务场景是数据压

白话“主成分分析” 1 :主成分分析用于降维的思想

目录 白话"主成分分析" 1 :主成分分析用于降维的思想 1. 什么是主成分分析 2. PCA 应用于降维的思想 3. 旋转以后的坐标轴应该具有什么性质 3.1 机器学习中的数据使用二维矩阵表示,矩阵中的元素就是坐标 3.2 谈论坐标不能离开基底 3.3 使用"线性代数"的语言描述 PCA 找坐标系的过程 3.3.1 新坐标的各个维度方差依次减少 3.3.2 新坐标的各个维度不能线性相关 3.3.3 协方差矩阵 4.PCA 应用于降维的步骤 白话"主成分分