如何使用Python Scikit-learn进行降维?

如何使用Python Scikit-learn进行降维?

降维是一种无监督机器学习方法,用于减少每个数据样本的特征变量数量并选择一组主要特征。主成分分析(PCA)是Sklearn中可用的流行降维算法之一。

在本教程中,我们将使用Python Scikit-learn(Sklearn)进行主成分分析和增量主成分分析的降维。

使用主成分分析(PCA)

PCA是一种统计方法,通过分析原始数据集的特征将数据线性投影到新的特征空间中。PCA的主要概念是选择数据的“主要”特征并基于这些特征构建特征。它将为我们提供新的数据集,该数据集尺寸较小,但具有与原始数据集相同的信息。

示例

在下面的示例中,我们将使用两个组件初始化PCA,并使用Scikit-learn软件包默认提供的Iris植物数据集进行数据拟合。

# 导入所需的包
from sklearn import datasets
from sklearn import decomposition

# 加载鸢尾花数据集
iris = datasets.load_iris()

# 打印数据集详细信息
print('特征名称 : '+str(iris.feature_names))
print('\n')
print('特征大小 : '+str(iris.data.shape))
print('\n')
print('目标名称 : '+str(iris.target_names))
print('\n')
print('目标大小 : '+str(iris.target.shape))
X_iris, Y_iris = iris.data, iris.target

# 初始化PCA并拟合数据
pca_2 = decomposition.PCA(n_components=2)
pca_2.fit(X_iris)

# 将鸢尾花数据转换为新维度(具有 2 个特征)
X_iris_pca2 = pca_2.transform(X_iris)

# 打印新数据集
print('变换后的新数据集大小 : ', X_iris_pca2.shape)
print('\n')

# 获取数据的最大方差方向
print("成分 : ", pca_2.components_)
print('\n')

# 获取每个成分解释的方差量
print("解释的方差量 : ",pca_2.explained_variance_)
print('\n')

# 获取每个成分解释的方差百分比
print("解释的方差百分比 : ",pca_2.explained_variance_ratio_)
print('\n')

# 获取每个成分的奇异值
print("奇异值 : ",pca_2.singular_values_)
print('\n')

# 获取估计的噪声协方差
print("噪声方差 : ",pca_2.noise_variance_)
Bash

输出

它将产生以下输出−

特征名称 : ['sepal length (cm)', 'sepal width (cm)', 'petal length (cm)', 'petal width (cm)']

特征大小 : (150, 4)

目标名称 : ['setosa' 'versicolor' 'virginica']

目标大小 : (150,)
变换后的新数据集大小 : (150, 2)

成分 : [[ 0.36138659 -0.08452251 0.85667061 0.3582892 ]
   [ 0.65658877 0.73016143 -0.17337266 -0.07548102]]

解释的方差量 : [4.22824171 0.24267075]

解释的方差百分比 : [0.92461872 0.05306648]

奇异值 : [25.09996044 6.01314738]

噪声方差 : 0.051022296508184406
Bash

使用增量主成分分析(IPCA)

增量主成分分析(IPCA)用于解决主成分分析(PCA)最大的限制,即PCA仅支持批处理,这意味着所有要处理的输入数据都应适合内存。

Scikit-learn ML库提供了sklearn.decomposition.IPCA模块,可以通过在连续获取的数据块上使用其partial_fit方法或启用np.memmap,一个映射到内存的文件,而不将整个文件加载到内存中,从而实现Out-of-Core PCA。

与PCA相同,使用IPCA进行分解时,输入数据被居中但未对每个要素进行缩放,然后应用SVD。

示例

在下面的示例中,我们将使用Scikit-learn包默认提供的Iris植物数据集,使用IPCA(初始化为2个组件和批量大小为20)进行拟合。

# 导入必要的包
from sklearn import datasets
from sklearn import decomposition

# 加载鸢尾植物数据集
iris = datasets.load_iris()

# 输出数据集的详细信息
print('特征名称:'+str(iris.feature_names))
print('\n')
print('特征大小:'+str(iris.data.shape))
print('\n')
print('目标名称:'+str(iris.target_names))
print('\n')
print('目标大小:'+str(iris.target.shape))
X_iris, Y_iris = iris.data, iris.target

# 初始化PCA并拟合数据
ipca_2 = decomposition.IncrementalPCA(n_components=2, batch_size=20)
ipca_2.fit(X_iris)

# 将鸢尾花数据转换到新的维度(包括2个特征)
X_iris_ipca2 = ipca_2.transform(X_iris)

# 输出新的数据集
print('转换后的数据集大小:', X_iris_ipca2.shape)
print('\n')

# 获取数据中最大方差的方向
print("组成部分:" , ipca_2.components_)
print('\n')

# 获取每个组件解释的方差量
print("解释的方差:" ,ipca_2.explained_variance_)
print('\n')

# 获取每个组件解释的方差百分比
print("解释的方差比率:" ,ipca_2.explained_variance_ratio_)
print('\n')

# 获取每个组件的奇异值
print("奇异值:" ,ipca_2.singular_values_)
print('\n')# 获取估计的噪声协方差
print("噪声方差:" ,ipca_2.noise_variance_)
Bash

输出

将会产生以下输出 −

特征名称:['sepal length (cm)', 'sepal width (cm)', 'petal length (cm)', 'petal width (cm)']

特征大小:(150, 4)

目标名称:['setosa' 'versicolor' 'virginica']

目标大小:(150,)
转换后的数据集大小:(150, 2)

组成部分: [[ 0.3622612  -0.0850586   0.85634557  0.35805603]
[ 0.64678214  0.73999163 -0.17069766 -0.07033882]]

解释的方差: [4.22535552 0.24227125]

解释的方差比率: [0.92398758 0.05297912]

奇异值: [25.09139241  6.0081958 ]

噪声方差: 0.00713274779746683
Bash

Python教程

Java教程

Web教程

数据库教程

图形图像教程

大数据教程

开发工具教程

计算机教程

登录

注册