用sklearn进行降维的七种方法

作者:童蒙
编辑:amethyst

引言

在实际的应用中,有时候我们会遇到数据的维度太少,我们需要新生成新的维度,可以用我们之前的分享(如何自动化进行特征工程);有时候维度太多,这时候我们就需要降维了。降维的方法有许多,我们这里介绍了sklearn中介绍的7种,供大家学习和收藏。

1 PCA

1.1 普通PCA

主成分分析(PCA)用于将多维的数据集分解为一组具有最大方差的连续正交分量。在sklearn这个包中,PCA是一个transformer对象,使用fit方法可以选择前n个主成分,并且用于投射到新的数据中。

PCA有两种实现方式,一种是特征值分解去实现,一种是奇异值分解去实现。特征值分解是一个提取矩阵特征很不错的方法,但是它只是对方阵而言的,如果不使用SVD,PCA只会寻找每个特征的中心,但并不会对数据进行缩放(scaled)。使用参数whiten=True ,可以将数据投射到奇异空间中,并且将每个组分缩放到方差为1,这个对于后续分析中,假设每个特征是isotropy 是很有帮助的,例如SVM和Kmeans聚类。

PCA不仅仅是对高维数据进行降维,更重要的是经过降维去除了噪声,发现了数据中的模式。PCA把原先的n个特征用数目更少的m个特征取代,新特征是旧特征的线性组合,这些线性组合最大化样本方差,尽量使新的m个特征互不相关。

SVD是一种矩阵分解法,把一个大矩阵分解成易于处理的形式,这种形式可能是两个或多个矩阵的乘积。

参数

  • n_components:可以是int,float,或者“mle”。如果是int,那么是选择对应的主成分数,如果是float,那么会自动合适的组成份数,使得方差大于float;如果是“mle”,会自动地选择合适的主成分。
  • whiten :白化,使得每个特征具有相同的方差。
    属性
  • components_ :返回具有最大方差的成分。
  • explained_variance_: 各个主成分的解释的方差。
  • explained_variance_ratio_ :返回所保留的n个成分各自的方差百分比。
  • n_components_:返回所保留的成分个数n。
    方法
  • fit() : 对PCA进行训练。
  • fit_transform(): 训练后,进行降维。
  • inverse_transform():将降维后的数据转化成原始数据。
  • transform() : 对训练好的模型,进行转换。
    实例
    例子1 :基本的使用
import numpy as np
from sklearn.decomposition import PCA
X = np.array([[-1, -1], [-2, -1], [-3, -2], [1, 1], [2, 1], [3, 2]])
pca = PCA(n_components=2)
pca.fit(X)
print(pca.explained_variance_ratio_)  ### 获得每个主成分解释的比例
print(pca.singular_values_)

例子2:获取每个主成分与特征的关系

from sklearn.datasets import load_iris 
iris = load_iris()
from sklearn.decomposition import PCA
pca = PCA(3)
X, y = iris.data, iris.target 
X_proj = pca.fit_transform(X)
for component in pca.components_:
    print(" + ".join("%.2f x %s" % (value, name) for value, name in zip(component, iris.feature_names)))
## 查看累积曲线
print(pca.explained_variance_ratio_.cumsum())

1.2 增量PCA(IPCA)

PCA虽然很有用,但是需要将数据全部都存入内存,因此当当要分解的数据集太大,会导致内存很大。这时候,增量主成分分析(IPCA)通常用作主成分分析(PCA)的替代,可以通过部分计算的方式,获得跟PCA一样的结果。

  • 使用partial_fit方法,可以分块的读取数据。
  • 如果是稀疏矩阵或者是内存文件,使用的是numpy.memmap。

IPCA使用与输入数据样本数无关的内存量为输入数据建立低秩近似。它仍然依赖于输入数据功能,但更改批量大小可以控制内存使用量。

该函数,增加了一个batch_size的参数,用来控制批次,其余都一样,至此不再赘述。

实例

from sklearn.datasets import load_digits
from sklearn.decomposition import IncrementalPCA
from scipy import sparse
X, _ = load_digits(return_X_y=True)
transformer = IncrementalPCA(n_components=7, batch_size=200)
# either partially fit on smaller batches of data
transformer.partial_fit(X[:100, :])
# or let the fit function itself divide the data into batches
X_sparse = sparse.csr_matrix(X)
X_transformed = transformer.fit_transform(X_sparse)
X_transformed.shape

1.3 使用随机化的SVD的PCA

对于大型矩阵的分解,我们往往会想到用SVD算法。然而当矩阵的维数与奇异值个数k上升到一定程度时,SVD分解法往往因为内存溢出而失败。因此,Randomized SVD算法,相比于SVD,它更能适应大型矩阵分解的要求,且速度更快。

此外,在某些场景下,我们期望丢掉某些lower sigular values,来达到减少噪音,保留尽可能多的方差,从而达到更好的预测效果。比如人脸的识别,如果是64X64的像素,那么整个维度有4096个。我们利用这个方法,可以保留重要的维度,从而利于后续的分析。

使用svd_solver='randomized'可以实现随机化的SVD,来去掉部分的奇异矩阵。

1.4 Kernel PCA

主成分分析(Principal Components Analysis, PCA)适用于数据的线性降维。而核主成分分析(Kernel PCA,KPCA)可实现数据的非线性降维,用于处理线性不可分的数据集。kernel的选择有 {'linear', 'poly', 'rbf', 'sigmoid', 'cosine', 'precomputed'},默认是'linear'。

详细说明见官方说明,与普通的PCA差不多。


1.5 稀疏化PCA 和minibatchsparsePCA

SparsePCA 期望找到一组可以最优地重构数据的稀疏主成分。稀疏性的大小由参数alpha给出的L1惩罚系数来控制。Mini-batch sparse PCA是sparsePCA的变种,提高了速度,但是降低了精度。

主成分分析(PCA)的缺点是,该方法提取的成分是一种密集表达式,即用原始变量的线性组合表示时,它们的系数是非零的。这可能会使解释模型变得困难。在许多情况下,真实的基础分量可以更自然地想象为稀疏向量;例如,在人脸识别中,主成分会只包含部分的图像,映射到人脸的某些部分。稀疏主成分产生了一种更简洁的、可解释的表示,清楚地强调是哪些原始特征导致了样本之间的差异。

通过调节alpha来调整惩罚度,alpha越大,越导致许多系数为0。

2 截断SVD

TruncatedSVD是普通SVD的一个变种,只计算用户指定的前K个奇异值。TSVD通常用于语义分析中,是LSA的其中的一部分,可以解决一词多义和一义多词的问题。

LSA潜在语义分析的目的,就是要找出词(terms)在文档和查询中真正的含义,也就是潜在语义,从而解决上节所描述的问题。具体说来就是对一个大型的文档集合使用一个合理的维度建模,并将词和文档都表示到该空间,比如有2000个文档,包含7000个索引词,LSA使用一个维度为100的向量空间将文档和词表示到该空间,进而在该空间进行信息检索。而将文档表示到此空间的过程就是SVD奇异值分解和降维的过程。降维是LSA分析中最重要的一步,通过降维,去除了文档中的“噪音”,也就是无关信息(比如词的误用或不相关的词偶尔出现在一起),语义结构逐渐呈现。相比传统向量空间,潜在语义空间的维度更小,语义关系更明确。

使用例子如下:

svd = TruncatedSVD(opts.n_components)
svd.fit(X)
svd.transform(X)

3 字典学习

3.1 使用预定义的字典来稀疏化编码

用事先预定义好的字典来对矩阵进行稀疏化编码,达到降维和简化的目的。就像人类的所有语言都是由单词组成一样,因此使用已知的词典可以减少维度;其次,稀疏化可以减少计算的成本,让后续的计算更快。

这个对象没有fit的方法,transformation方法会将数据表示为尽可能少的字典原子的线性组合。可以用transform_method来控制初始化参数,有以下几种:

  • Orthogonal matching pursuit (Orthogonal Matching Pursuit (OMP)):常用于图像处理中。
  • Least-angle regression (Least Angle Regression)
  • Lasso computed by least-angle regression
  • Lasso using coordinate descent (Lasso)
  • Thresholding :速度很快,但是会产生出不准确的重构结构,一般用于文本中。
coder = SparseCoder(dictionary=D, transform_n_nonzero_coefs=n_nonzero,
                            transform_alpha=alpha, transform_algorithm=algo)
x = coder.transform(y.reshape(1, -1))

3.2 通用字典学习

使用的函数为sklearn.decomposition.DictionaryLearning,会找到一个可以将fitted data足够好稀疏化的字典。

将数据表示为一个overcomplete的字典这个过程,同大脑处理数据的过程类似。这个方法在图像补丁的字典学习已被证明在诸如图像完成、修复和去噪以及监督识别任务的图像处理任务中给出良好的结果。

dict_learner = DictionaryLearning(
    n_components=15, transform_algorithm='lasso_lars', random_state=42,
)
X_transformed = dict_learner.fit_transform(X)

3.3 小批次字典学习

使用函数为sklearn.decomposition.MiniBatchDictionaryLearning,是一种快速的,但是精确度降低的版本,适应于大数据集合。

默认情况下,MiniBatchDictionaryLearning将数据分成小批量,并通过在指定次数的迭代中循环使用小批量,以在线方式进行优化。但是,目前它没有退出迭代的停止条件。也可以用partial_fit来实现小批次的fit。

4 因子分析

从变量中提取共性因子。

因子分析要求原有变量间具有较强的相关性,否则,因子分析无法提取变量间的共性特征,如果相关系数小于0.3,则变量间的共线性较小,不适合因子分析;因子分析得到因子和原变量的关系,因此能够对因子进行解释。

因子分析可以产生与 PCA 相似的特征(载荷矩阵的列)。不过,不能对这些特征做出任何一般性的说明(例如他们是否正交)。

使用的函数为sklearn.decomposition.FactorAnalysis。

5 独立成分分析-ICA

使用的函数为sklearn.decomposition.FastICA,ICA可以提取出一系列的主成分,彼此最大的独立。因此,ICA一般不用于降维,而用于区分叠加信号。ICA不考虑noise,为了使模型正确,必须使用whitening,可以使用whiten这个参数。

ICA 通常用于分离混合信号(称为盲源分离的问题),也可以作为一种非线性降维方法,可以找到具有一些稀疏性的特征。

主成分分析假设源信号间彼此非相关,独立成分分析假设源信号间彼此独立。

主成分分析认为主元之间彼此正交,样本呈高斯分布;独立成分分析则不要求样本呈高斯分布。

6 非负矩阵分解

非负矩阵分解,顾名思义就是,将非负的大矩阵分解成两个非负的小矩阵。在数据矩阵不包含负值的情况下,应用NMF而不是PCA或其变体。

NMF可以产生可以代表数据的主成分,从而可以来解释整个模型。

参数init,可以用来选择初始化的方法,不同的方法对结果会有不同的表现。

import numpy as np
X = np.array([[1, 1], [2, 1], [3, 1.2], [4, 1], [5, 0.8], [6, 1]])
from sklearn.decomposition import NMF
model = NMF(n_components=2, init='random', random_state=0)
W = model.fit_transform(X)
H = model.components_
X_new = np.array([[1, 0], [1, 6.1], [1, 0], [1, 4], [3.2, 1], [0, 4]])
W_new = model.transform(X_new)

在PCA处理中,假使将特征降维为600个,那么降维后的每个人脸都包含了600个特征(所以我们看到降维后的人脸有种“伏地魔”的感觉 ,这是因为降维处理相当于删去了部分细节特征,导致一部分信息丢失,在图片中最直观的体现就是变模糊)。而在NMF的处理中,这1000个特征相当于是被分离了。相当于,一张人脸是由鼻子、耳朵等这些独立的特征叠加出来的。


7 Latent Dirichlet Allocation (LDA)

LDA是文档主题生成模型,对离散数据集(如文本语料库)的集合的生成概率模型。它也是一个主题模型,用于从文档集合中发现抽象主题。LDA是一种非监督机器学习技术,可以用来识别大规模文档集(document collection)或语料库(corpus)中潜藏的主题信息。

sklearn.decomposition.LatentDirichletAllocation是用于进行LDA的函数。

lda = LatentDirichletAllocation(n_components=5,
    random_state=0)
lda.fit(X)

本文主体来源于sklearn的降维这一章,里面有许多数学的知识,还是需要大家自己好好的学习。
本文对PCA介绍比较详细,但是对于其他的介绍的比较简单,其实各自都有很多的用途,等小编学习后跟大家分享。
文章中许多内容是借鉴网上的内容,如果有侵权,请跟我们联系,我们会尽快修改。

参考资料

1、https://www.jianshu.com/p/1adef2d6dd88
2、https://www.jianshu.com/p/e574e91070ad
3、https://scikit-learn.org/stable/modules/decomposition.html#decompositions
4、https://shankarmsy.github.io/posts/pca-sklearn.html
5、https://mp.weixin.qq.com/s/Tl9ssjmGdeyNrNuIReo1aw
6、https://www.cnblogs.com/eczhou/p/5433856.html
7、https://scikit-learn.org/stable/auto_examples/applications/plot_face_recognition.html#sphx-glr-auto-examples-applications-plot-face-recognition-py
8、https://blog.csdn.net/fkyyly/article/details/84665361 LSA(Latent semantic analysis)
9、https://blog.csdn.net/fjssharpsword/article/details/74964127
10、https://www.jianshu.com/p/e90900a3d03a

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,558评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,002评论 3 387
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,036评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,024评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,144评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,255评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,295评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,068评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,478评论 1 305
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,789评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,965评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,649评论 4 336
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,267评论 3 318
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,982评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,223评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,800评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,847评论 2 351

推荐阅读更多精彩内容