前⾔
为什么要进⾏数据降维?直观地好处是维度降低了,便于计算和可视化,其深层次的意义在于有效信息的提取综合及⽆⽤信息的摈弃,并且数据降维保留了原始数据的信息,我们就可以⽤降维的数据进⾏机器学习模型的训练和预测,但将有效提⾼训练和预测的时间与效率。
降维⽅法分为线性和⾮线性降维,⾮线性降维⼜分为基于核函数和基于特征值的⽅法(流形学习),代表算法有
线性降维⽅法:PCA ICA LDA LFA基于核的⾮线性降维⽅法KPCA KFDA流形学习:ISOMAP LLE LE LPP
本⽂主要对线性降维⽅法中的PCA、ICA、LDA的Python实现进⾏讲解。
请注意本⽂将不对各种数据降维⽅法的原理与理论推导过程做过多的讲解,旨在⽤尽可能少的语⾔说清楚以及如何⽤Python实现,先实现再理解,并在读完代码之后⾃⾏查阅相关⽂献理解其不同的思想。但读者应具有⼀定的统计学、代数学、机器学习的基础。
主成分分析PCA
主成分分析(Principal Component Analysis),是⼀种常⽤的数据降维⽅法。通过正交变换将⼀组可能存在相关性的变量转换为⼀组线性不相关的变量,转换后的这组变量就叫主成分。关于主成分分析的思想与理论推导过程在互联⽹上很容易找到完美的证明,⽤⼈话说来就是找到⼀个轴,将你的数据映射到这个轴上之后所计算的⽅差最⼤,再换句⼈话说就是从原始数据的⼀堆变量中提取出⼀部分变量,⽽这部分变量能完美解释原始数据中包含的信息(或保留原始的数据特性)
注意:
进⾏主成分分析前需对数据进⾏归⼀化处理
PCA流程:
对数据⾏归⼀化处理
计算归⼀化后的数据集的协⽅差矩阵与其特征值、特征向量对特征值从⼤到⼩排序并保留最⼤的个特征向量将数据转换到个特征向量构建的新空间中
优点:
⽆参数限制
提取了主要信息并且结果容易理解
缺点:
⽅差⼩的主成分可能含有对样本差异的重要信息
在某些情况下,PCA⽅法得出的主元可能并不是最优的
相关Python代码
sklearn.decomposition.PCAPython实现⽰例(已注释)#来看个官⽹最简单的例⼦>>> 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)#⽤X训练>>> pca.fit(X)
PCA(n_components=2)#查看每个主成分解释程度
>>> print(pca.explained_variance_ratio_)[0.9924... 0.0075...]
>>> print(pca.singular_values_)[6.30061... 0.54980...]#降维
>>> pca = PCA(n_components=1, svd_solver='arpack')>>> pca.fit(X)
PCA(n_components=1, svd_solver='arpack')>>> print(pca.explained_variance_ratio_)[0.99244...]
>>> print(pca.singular_values_)[6.30061...]
线性判别分析LDA
线性判别分析(Linear Discriminant Analysis)是⼀种有监督的(supervised)线性降维算法。与PCA保持数据信息不同,LDA的核⼼思想:往线性判别超平⾯的法向量上投影,使得区分度最⼤(⾼内聚,低耦合)。LDA是为了使得降维后的数据点尽可能地容易被区分!
与PCA⽐较
PCA为⽆监督降维,LDA为有监督降维
LDA降维最多降到类别数K-1的维数,PCA没有这个限制。
PCA希望投影后的数据⽅差尽可能的⼤(最⼤可分性),⽽LDA则希望投影后相同类别的组内⽅差⼩,⽽组间⽅差⼤。
相关Python代码
sklearn.discriminant_analysis.LinearDiscriminantAnalysisPython实现⽰例(已注释)import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D%matplotlib inline
from sklearn.datasets.samples_generator import make_classification#⽣成数据
X, y = make_classification(n_samples=1000, n_features=3, n_redundant=0, n_classes=3, n_informative=2, n_clusters_per_class=1,class_sep =0.5, random_state =10)#LDA降维
from sklearn.discriminant_analysis import LinearDiscriminantAnalysislda = LinearDiscriminantAnalysis(n_components=2)lda.fit(X,y)
X_new = lda.transform(X)
plt.scatter(X_new[:, 0], X_new[:, 1],marker='o',c=y)plt.show()
独⽴成分分析ICA
独⽴成分分析(Independent component analysis)是⼀种利⽤统计原理进⾏计算的⽅法,它是⼀个线性变换,这个变换把数据或信号分离成统计独⽴的⾮⾼斯的信号源的线性组合。之
前介绍的PCA、LDA都是以观测数据点呈⾼斯分布模型为基本假设前提的,⽽ICA将适⽤于⾮⾼斯分析数据集,是PCA的⼀种有效扩展。
与PCA⽐较
ICA寻找的是最能使数据的相互独⽴的⽅向,⽽PCA仅要求⽅向是不相关的PCA认为主元之间彼此正交,样本呈⾼斯分布;ICA则不要求样本呈⾼斯分布
相关Python代码
sklearn.decomposition.FastICAPython实现⽰例(已注释)import numpy as np
import matplotlib.pyplot as pltfrom scipy import signal
from sklearn.decomposition import FastICA, PCA# ⽣成观测模拟数据np.random.seed(0)n_samples = 2000
time = np.linspace(0, 8, n_samples)
s1 = np.sin(2 * time) # 信号源 1 : 正弦信号
s2 = np.sign(np.sin(3 * time)) # 信号源 2 : ⽅形信号
s3 = signal.sawtooth(2 * np.pi * time) # 信号源 3: 锯齿波信号S = np.c_[s1, s2, s3]
S += 0.2 * np.random.normal(size=S.shape) # 增加噪⾳数据S /= S.std(axis=0) # 标准化# 混合数据
A = np.array([[1, 1, 1], [0.5, 2, 1.0], [1.5, 1.0, 2.0]]) # 混合矩阵X = np.dot(S, A.T) # ⽣成观测信号源# ICA模型
ica = FastICA(n_components=3)S_ = ica.fit_transform(X) # 重构信号
A_ = ica.mixing_ # 获得估计混合后的矩阵# PCA模型
pca = PCA(n_components=3)
H = pca.fit_transform(X) # 基于PCA的成分正交重构信号源# 图形展⽰plt.figure()
models = [X, S, S_, H]
names = ['Observations (mixed signal)', 'True Sources',
'ICA recovered signals', 'PCA recovered signals']colors = ['red', 'steelblue', 'orange']
for ii, (model, name) in enumerate(zip(models, names), 1): plt.subplot(4, 1, ii) plt.title(name)
for sig, color in zip(model.T, colors): plt.plot(sig, color=color)
plt.subplots_adjust(0.09, 0.04, 0.94, 0.94, 0.26, 0.46)plt.show()
以上就是早起的统计⼯具箱第⼆期的内容,当然想要完全学会还需要⾃⾏查阅更多⽂献,⽽更多的数据降维⽅法、还有上⼀期未介绍完的python统计检验我们之后再聊。
因篇幅问题不能全部显示,请点此查看更多更全内容