计算机系统应用教程网站

网站首页 > 技术文章 正文

一文带您了解数据降维:常见降维方法及Python示例

btikc 2025-01-05 15:54:04 技术文章 44 ℃ 0 评论

??据降维(Dimensionality reduction)在机器学习和数据分析领域中被广泛使用。它的目标是通过减少数据集中的特征数量来简化数据,同时保留关键的信息。当面对高维数据时,降维可以帮助我们减少计算复杂性,并提高模型的性能和效率。

??降维是一种简化复杂数据集以便更容易处理的方法。随着数据的增长和复杂性,提取有意义的洞见变得越来越困难,甚至可视化也变得更加困难。降维技术通过给出较小数量的维度(列)来解决这个问题,同时仍保留最重要的信息。可以将其类比为复杂对象的阴影投射,你会失去一些细节,但获得一个更简单的表示形式,更易于处理和进行比较。

??接下来我们使用SmartNoteBook来示例python的数据降维方法,数据集是kaggle上红酒(red wine) 的数据集:https://www.kaggle.com/datasets/piyushgoyal443/red-wine-dataset 。数据集字段说明如下:

  • fixed.acidity: fixed acidity (tartaric acid - g / dm^3) 固定酸度/酒石酸
  • volatile.acidity: volatile acidity (acetic acid - g / dm^3) 挥发性酸度/乙酸
  • citric.acid: citric acid (g / dm^3) 柠檬酸
  • residual.sugar: residual sugar (g / dm^3) 残留糖
  • chlorides: chlorides (sodium chloride - g / dm^3 氯化钠
  • free.sulfur.dioxide: free sulfur dioxide (mg / dm^3) 游离二氧化硫
  • total.sulfur.dioxide: total sulfur dioxide (mg / dm^3) 总二氧化硫
  • density: density (g / cm^3) 密度
  • pH: pH pH值
  • sulphates: sulphates (potassium sulphate - g / dm3) 硫酸钾
  • alcohol: alcohol (% by volume) Output variable (based on sensory data) 酒精
  • quality: quality (score between 0 and 10) 质量

??加载数据:

import pandas as pd
red_wine_df=pd.read_csv('/home/data/wineQualityReds.csv',index_col=0)
red_wine_df
#red_wine_df.columns 

??检查数据集中是否有空值,没有空值:

red_wine_df.isnull().sum()  

??快速对数据进行标准化处理,将每列映射到相似的范围和尺度上。这在直接比较不同列之间的数据时非常重要。

from sklearn.preprocessing import StandardScaler
from sklearn.cluster import KMeans
scaler = StandardScaler()
red_wine_df = pd.DataFrame(data = scaler.fit_transform(red_wine_df),
 columns = red_wine_df.columns)
kmeans = KMeans(n_clusters = 3)
cluster = kmeans.fit_predict(red_wine_df)
__SNB_DisplayTable(red_wine_df)

线性方法

??线性方法进行数据降维,同时保留最重要的信息。它们通过寻找一种在较低维空间中表示数据的方式来捕捉数据中的原始模式和线性关系。主要线性方法如下:

  • Principal component analysis (PCA) 主成分分析
  • Independent Component Analysis (ICA) 独立成分分析
  • Truncated Singular Value Decomposition (TruncatedSVD) 截断奇异值分解

PCA 主成分分析

??主成分分析(Principal Component Analysis,简称PCA)通过减少数据集的维度,同时最大化每个主成分解释的方差。那么如何理解PCA ?在每个数据集中,每一列都描述了某个特征,这个特征在案例中可能是酒精含量、ph值、质量、密度。方差是衡量一列数值波动程度的一种方式;因此具有更高方差的特征包含更多信息;方差为0的特征不提供任何信息,因此方差是关键因素。

??PCA的工作原理是在较低维度上找到原始数据的压缩表示,最大化原始数据的整体方差(或波动)。这意味着整体模式仍然被保留,同时使数据尽可能简单化。

??PCA 降维代码如下:

from sklearn.decomposition import PCA
import seaborn as sns
import matplotlib.pyplot as plt
pca2D = PCA(n_components=2)
# 将数据降维到2维(dimensions)
pca_2D = pca2D.fit_transform(red_wine_df)
pca2D_df = pd.DataFrame(data =  pca_2D, columns = ['x', 'y'])
pca2D_df['cluster'] = cluster
sns.scatterplot(x='x', y='y', hue='cluster', data=pca2D_df)
plt.title("PCA")
plt.show()

ICA 独立成分分析

??独立成分分析(Independent Component Analysis,简称ICA)的目标是将混合信号分离为其原始源。在ICA中,我们假设这些源彼此独立,即它们互不影响。让我们通过一个简单的例子来理解这个概念。

??在我们的数据集中,存在着3种不同类型的葡萄酒口味,我们希望将它们分离成原始的葡萄酒类型。尽管葡萄酒目前被混合在一起,我们相信它们在统计上是相互独立的。这基本上意味着如果我们喝一种口味的葡萄酒,我们对其他口味的葡萄酒不会获得任何额外信息。假设每种口味都是独立的,ICA将解开混合的葡萄酒,并恢复其原始的口味,即使你事先对混合的口味或混合方式一无所知。

??在选择所需的独立成分(葡萄酒口味)数量后,你可以将它们用作数据的降维表示。这些在统计上独立的成分捕捉了原始数据的不同方面,从而实现了降维表示。

??ICA降维Python代码如下:

from sklearn.decomposition import FastICA
ica2D = FastICA(n_components=2)
ica_data2D = ica2D.fit_transform(red_wine_df)
ica2D_df = pd.DataFrame(data =  ica_data2D,columns = ['x', 'y'])
ica2D_df['cluster'] = cluster
sns.scatterplot(x='x', y='y', hue='cluster', data=ica2D_df)
plt.title("ICA")
plt.show()

TruncatedSVD 截断奇异值分解

??截断奇异值分解(Truncated Singular Value Decomposition:简称TruncatedSVD),简称截断奇异值分解,是一种在处理大型数据集时特别有效的降维技术。它与主成分分析(PCA)密切相关,甚至可以被视为PCA的一种变体,尽管这种技术在从稀疏矩阵(即有很多零元素的矩阵)中创建稠密表示方面更加出色。

??TruncatedSVD 截断奇异值分解 降维的python 代码如下:

from sklearn.decomposition import TruncatedSVD
tsvd2D = TruncatedSVD(n_components=2)
tsvd_data2D = tsvd2D.fit_transform(red_wine_df)
tsvd2D_df = pd.DataFrame(data =  tsvd_data2D, columns = ['x', 'y'])
tsvd2D_df['cluster']  = cluster
sns.scatterplot(x='x', y='y', hue='cluster', data=tsvd2D_df)
plt.title("TruncatedSVD")
plt.show()

非线性(Non-linear)方法

??非线性降维技术尝试捕捉数据中更复杂的非线性关系,并将其表示为较低维度的空间。三种最常用的三种非线性的降维方案:

  • MDS(Multidimensional Scaling)
  • T-SNE
  • UMAP

MDS(Multidimensional Scaling)

??MDS(Multidimensional Scaling)是一种用于可视化数据集中观测之间相似性或不相似性的技术。在这种表示中,相似的观测被放置在彼此更近的位置,而不相似的观测则被分开得更远。多维缩放具有线性和非线性降维的优势,具体取决于所使用的设置和算法。在所有情况下,多维缩放旨在保持数据点之间的距离,确保降维表示保留了这些距离。

??MDS降维的python 代码如下:

from sklearn.manifold import MDS
mds2D = MDS(n_components=2)
mds_data2D = mds2D.fit_transform(red_wine_df)
mds2D_df = pd.DataFrame(data =  mds_data2D, columns = ['x', 'y'])
mds2D_df['cluster'] = cluster
sns.scatterplot(x='x', y='y', hue='cluster', data=mds2D_df)
plt.title("MDS")
plt.show()

T-SNE

??t-分布随机邻域嵌入(t-Distributed Stochastic Neighbor Embedding,简称t-SNE)是一种用于简化和可视化复杂数据的算法。它通过比较原始高维空间和低维空间中数据点之间的相似性来实现这一目标。然后,它创建概率分布来表示这些相似性,旨在使它们尽可能相似。该算法迭代地调整低维空间中数据点的位置,直到分布尽可能接近。

??关于t-SNE需要注意的一点是,它更注重保留局部关系而不是全局关系。这意味着在原始高维空间中彼此靠近的数据点在降维后的表示中很可能仍然靠近。然而,点之间的整体距离可能无法得到保留。这种权衡使得t-SNE能够突出显示局部模式和簇群,使其在可视化复杂数据时非常有用。

??T-SNE 降维的python 代码如下:

from sklearn.manifold import TSNE
tsne2D = TSNE(n_components=2)
tsne_data2D = tsne2D.fit_transform(red_wine_df)
tsne2D_df = pd.DataFrame(data =  tsne_data2D, columns = ['x', 'y'])
tsne2D_df['cluster'] = cluster
sns.scatterplot(x='x', y='y', hue='cluster', data=tsne2D_df)
plt.title("T-SNE")
plt.show()

UMAP

??均匀流形近似和投影(Uniform Manifold Approximation and Projection,简称UMAP)UMAP可以看作是t-SNE的更强大的亲戚。它同样学习非线性映射以保持簇的完整性,而且它的速度更快。此外,与t-SNE相比,UMAP在保持数据的全局结构方面往往表现更好。在这个上下文中,全局结构指的是相似葡萄酒类型之间的“接近程度”,而局部结构则指的是同一类型的葡萄酒在降维后的空间中的聚类程度。

??UMAP 降维的python 代码如下:

#pip install umap-learn
from umap.umap_ import UMAP
umap2D = UMAP(n_components=2)
umap_data2D = umap2D.fit_transform(red_wine_df)
umap2D_df = pd.DataFrame(data =  umap_data2D,columns = ['x', 'y'])
umap2D_df['cluster'] = cluster
sns.scatterplot(x='x', y='y', hue='cluster', data=umap2D_df)
plt.title("UMAP")
plt.show()

??整个示例的模型视图:

??这些示例只是降维技术的一小部分,但它们在处理复杂数据集时非常有用。需要注意的是,降维并非适用于所有情况的解决方案;最困难的部分在于根据数据的性质和具体问题确定使用哪种方法,或者是否需要使用降维技术。

Tags:

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表