MLlib学习——降维
降维(Dimensionality Reduction) 是机器学习中的一种重要的特征处理手段,它可以减少计算过程中考虑到的随机变量(即特征)的个数,其被广泛应用于各种机器学习问题中,用于消除噪声、对抗数据稀疏问题。它在尽可能维持原始数据的内在结构的前提下,从原始和噪声特征中提取潜在特征或在保持结构的同时压缩数据得到一组描述原数据的,低维度的隐式特征(或称主要特征)。
Spark MLlib为org.apache.spark.mllib.linalg.distributed.RowMatrix
类上的降维提供支持。
MLlib机器学习库提供了两个常用的降维方法:
- 奇异值分解(Singular Value Decomposition,SVD)
- 主成分分析(Principal Component Analysis,PCA)
一、奇异值分解(SVD)
MLlib内置的奇异值分解功能位于org.apache.spark.mllib.linalg
包下的RowMatrix
和IndexedRowMatrix
类中,所以,我们必须先通过已有数据创建出相应矩阵类型的对象,然后调用该类的成员方法来进行SVD分解:
%spark
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.mllib.linalg.distributed.RowMatrix
// 创建样本矩阵,由一个稀疏向量两个稠密向量组成
val data = Array(
Vectors.sparse(5, Seq((1, 1.0), (3, 7.0))),
Vectors.dense(2.0, 0.0, 3.0, 4.0, 5.0),
Vectors.dense(4.0, 0.0, 0.0, 6.0, 7.0))
// 将样本矩阵生成RDD
val rows = sc.parallelize(data)
// 创建行矩阵
val mat: RowMatrix = new RowMatrix(rows) // 计算前5个奇异值和相应的奇异向量。
val svd: SingularValueDecomposition[RowMatrix, Matrix] = mat.computeSVD(5, computeU = true)
//
val U: RowMatrix = svd.U // U因子是一个行矩阵。
val s: Vector = svd.s // s奇异值存储在局部稠密向量中。
val V: Matrix = svd.V // V因子是一个局部稠密矩阵。
其中,V是右奇异向量,U是左奇异向量,s是奇异值。在实际运用中,只需要V
和S
两个成员,即可通过矩阵计算达到降维的效果。
如果需要获得U
成员,可以在进行SVD分解时,指定computeU
参数,令其等于True
,即可在分解后的svd
对象中拿到U
成员。
二、主成分分析(PCA)
主成分分析(PCA) 是一种对数据进行旋转变换的统计学方法,其本质是在线性空间中进行一个基变换,使得变换后的数据投影在一组新的“坐标轴”上的方差最大化,随后,裁剪掉变换后方差很小的“坐标轴”,剩下的新“坐标轴”即被称为 主成分(Principal Component) ,它们可以在一个较低维度的子空间中尽可能地表示原有数据的性质。主成分分析被广泛应用在各种统计学、机器学习问题中,是最常见的降维方法之一。PCA有许多具体的实现方法,可以通过计算协方差矩阵,甚至是通过上文提到的SVD分解来进行PCA变换。
MLlib提供了两种进行PCA变换的方法,第一种与上文提到的SVD分解类似,位于org.apache.spark.mllib.linalg
包下的RowMatrix
中,PCA变换示例:
%spark
import org.apache.spark.mllib.linalg.Matrix
import org.apache.spark.mllib.linalg.Vectors
import org.apache.spark.mllib.linalg.distributed.RowMatrix val data = Array(
Vectors.sparse(5, Seq((1, 1.0), (3, 7.0))),
Vectors.dense(2.0, 0.0, 3.0, 4.0, 5.0),
Vectors.dense(4.0, 0.0, 0.0, 6.0, 7.0))
// 生成RDD
val rows = sc.parallelize(data)
// 生成行矩阵
val mat: RowMatrix = new RowMatrix(rows) // 计算前4个主成分
// 将主成分存储到本地矩阵pc中
val pc: Matrix = mat.computePrincipalComponents(4) // 将行矩阵投影到由前4个主成分构成的线性空间。
val projected: RowMatrix = mat.multiply(pc)
输出:
pc: org.apache.spark.mllib.linalg.Matrix = -0.44859172075072673 -0.28423808214073987 0.08344545257592471 0.8364102009456849
0.13301985745398526 -0.05621155904253121 0.044239792581370035 0.17224337841622106
-0.1252315635978212 0.7636264774662965 -0.578071228563837 0.2554154886635869
0.21650756651919933 -0.5652958773533949 -0.7955405062786798 4.858121429822393E-5
-0.8476512931126826 -0.11560340501314653 -0.1550117891430013 -0.4533355491646027
注意:其中每一列代表一个主成分(新坐标轴),每一行代表原有的一个特征。
除了矩阵类内置的PCA变换外,MLlib还提供了一种“模型式”的PCA变换实现,它位于org.apache.spark.mllib.feature
包下的PCA
类,它可以接受RDD[Vectors]
作为参数,进行PCA变换。
该方法特别适用于原始数据是LabeledPoint
类型的情况,只需取出LabeledPoint
的feature
成员(它是RDD[Vector]
类型),对其做PCA操作后再放回,即可在不影响原有标签情况下进行PCA变换。
%spark
import org.apache.spark.mllib.feature.PCA
import org.apache.spark.mllib.linalg.Vectors
import org.apache.spark.mllib.regression.LabeledPoint
import org.apache.spark.rdd.RDD val data: RDD[LabeledPoint] = sc.parallelize(Seq(
new LabeledPoint(0, Vectors.dense(1, 0, 0, 0, 1)),
new LabeledPoint(1, Vectors.dense(1, 1, 0, 1, 0)),
new LabeledPoint(1, Vectors.dense(1, 1, 0, 0, 0)),
new LabeledPoint(0, Vectors.dense(1, 0, 0, 0, 0)),
new LabeledPoint(1, Vectors.dense(1, 1, 0, 0, 0)))) // 计算前5个主成分。创建一个PCA
类的对象,在构造器中给定主成分个数为3,并调用其fit
方法来生成一个PCAModel
类的对象pca
,该对象保存了对应的主成分矩阵.
val pca = new PCA(3).fit(data.map(_.features)) // 将向量投影到由前3个主成分构成的线性空间,保留标签.对于LabeledPoint
型的数据来说,可使用map
算子对每一条数据进行处理,将features
成员替换成PCA变换后的特征即可
val projected = data.map(p => p.copy(features = pca.transform(p.features)))
MLlib学习——降维的更多相关文章
- 关于spark的mllib学习总结(Java版)
本篇博客主要讲述如何利用spark的mliib构建机器学习模型并预测新的数据,具体的流程如下图所示: 加载数据 对于数据的加载或保存,mllib提供了MLUtils包,其作用是Helper metho ...
- MLlib学习——基本统计
给定一个数据集,数据分析师一般会先观察一下数据集的基本情况,称之为汇总统计或者概要性统计.一般的概要性统计用于概括一系列观测值,包括位置或集中趋势(比如算术平均值.中位数.众数和四分位均值),展型(比 ...
- MLlib学习——基本数据类型
数据类型--基于RDD的API 本地矢量 标记点 本地矩阵 分布式矩阵 RowMatrix(行矩阵) IndexedRowMatrix(索引行矩阵) CoordinateMatrix(坐标矩阵) Bl ...
- 机器学习之路:python 特征降维 主成分分析 PCA
主成分分析: 降低特征维度的方法. 不会抛弃某一列特征, 而是利用线性代数的计算,将某一维度特征投影到其他维度上去, 尽量小的损失被投影的维度特征 api使用: estimator = PCA(n_c ...
- "Blessing of Dimisionality: High Dimensional Feature and Its Efficient Compression for Face Verification"学习笔记
这\(^{[1]}\)是一篇关于如何使用高维度特征在人脸验证中的文章,作者以主要LBP为例子,论述了高维特征和验证性能存在着正相关的关系,即人脸维度越高,验证的准确度就越高.由于那时候没有用DeepL ...
- python大战机器学习——数据降维
注:因为公式敲起来太麻烦,因此本文中的公式没有呈现出来,想要知道具体的计算公式,请参考原书中内容 降维就是指采用某种映射方法,将原高维空间中的数据点映射到低维度的空间中 1.主成分分析(PCA) 将n ...
- sklearn_线性回归
1. 普通线性回归 Linear Regression (1)目标: class sklearn.linear_model.LinearRegression (fit_intercept=True, n ...
- 《OD学spark》20160924scala基础
拓展: Hadoop 3.0 NameNode HA NameNode是Active NameNode是Standby可以有多个 HBase Cluster 单节点故障? HBaster -> ...
- Spark学习之基于MLlib的机器学习
Spark学习之基于MLlib的机器学习 1. 机器学习算法尝试根据训练数据(training data)使得表示算法行为的数学目标最大化,并以此来进行预测或作出决定. 2. MLlib完成文本分类任 ...
随机推荐
- nginx 配置 ^~ 的用法妙处,403阻断
看看这个 location /css/ { alias D:/我的项目/2-代码/express/src/main/resources/static/css/ ; } 咋一看貌似没有毛病,访问 htt ...
- jsp文件中文乱码解决
文件顶加上 <%@ page contentType="text/html;charset=UTF-8" language="java" %>即可
- spring cloud --- Zuul --- 心得
spring boot 1.5.9.RELEASE spring cloud Dalston.SR1 1.前言 什么是 Zuul? Zuul是微服务网关,与Gateway类似 ,根据请 ...
- uniapp页面跳转传递参数过长
传参 url:'./photo_detail?item='+encodeURIComponent(JSON.stringify(obj)) 取参 const item = JSON.parse(dec ...
- docker 环境安装 jenkins
下载镜像运行 jenkins 默认服务器已经安装好了 docker 环境: 拉取 jenkins 镜像 docker pull jenkins/jenkins:lts 镜像的详细信息可以查看:http ...
- POJ 3617 Best Cow Line (字典序最小问题 & 贪心)
原题链接:http://poj.org/problem?id=3617 问题梗概:给定长度为 的字符串 , 要构造一个长度为 的字符串 .起初, 是一个空串,随后反复进行下列任意操作. 从 的头部删除 ...
- 【Java常用类】System
System System类代表系统,系统级的很多属性和控制方法都放置在该类的内部. 该类位于java.lang包.由于该类的构造器是private的,所以无法创建该类的对象,其内部的成员变量和成员方 ...
- golang中的标准库http
Go语言内置的net/http包十分的优秀,提供了HTTP客户端和服务端的实现. http客户端 基本的HTTP/HTTPS请求 Get.Head.Post和PostForm函数发出HTTP/HTTP ...
- linux正则转换csv文件
- maven 项目搭建,本地环境配置。
一,下载地址 http://maven.apache.org/download.cgi 英文不好的,可以在浏览器下载个翻译的插件,就好了,我用的是谷歌. 二, 解压文件,安装在自己制定的目录,注意安装 ...