知其然知其所以然
- 【写在前面】
- 主成分分析(PCA)
- 原理部分
- 代码部分
- 可视化部分
- 线性判别分析(LDA)
- 原理部分
- 代码部分
- 可视化部分
- 独立成分分析(ICA)
- 原理部分
- 代码部分
- 可视化部分
- t-SNE降维算法
- 原理部分
- 代码部分
- 可视化部分
【写在前面】
【以下使用的数据量很少很少,因此在散点图中展示不出具体算法特点,请读者自行实验。】
常用的降维算法有主成分分析(PCA)、线性判别分析(LDA)、独立成分分析(ICA)、t-SNE等。以下是这些算法的Python代码示例,分享一下我对降维的理解:
对一个样本矩阵,一是换特征,找一组新的特征来重新表示;二是减少特征,新特征的数目要远小于原特征的数目。这样一来就可以得到数量少且比较好的几个变量一构建模型。但是,降维也可能会导致信息的损失和模型的过拟合,因此需要谨慎使用。
- 创建数据
- 创建模型对象
- 拟合数据
- 转换数据
- 输出数据
主成分分析(PCA)
原理部分
- 通常把转化生成的综合指标称之为主成分
- 每个主成分都是原始变量的线性组合,且每个主成分之间互不相干
- 主成分分析(PCA)是一种常用的数据降维技术,它通过线性变换将高维数据转换为低维数据,同时保留原始数据的主要特征。PCA的基本思想是将原始数据映射到一个新的坐标系中,使得新坐标系下数据的方差最大化。这个新坐标系的轴称为主成分,每个主成分都是原始数据中的线性组合。PCA的应用广泛,例如在图像处理、信号处理、模式识别、数据挖掘等领域中都有广泛应用。在数据分析中,PCA可以用于降低数据的维度,减少数据冗余,提高数据处理效率,同时也可以帮助我们发现数据的内在结构和规律,从而更好地理解数据。
- 在实际应用中,PCA的步骤主要包括数据标准化、计算协方差矩阵、求解特征值和特征向量、选取主成分和投影数据等。通过PCA,我们可以得到一些重要的结果,例如主成分的贡献率、主成分的方差解释比例、主成分的系数等。这些结果可以帮助我们更好地理解数据的结构和特征,从而为后续的数据分析和建模提供更好的基础。
代码部分
from sklearn.decomposition import PCA
import numpy as np# 创建数据
X = np.array([[1, 2, 3, 6, 10, 22, 3, 2, 3], [4, 5, 6, 8, 9, 23, 5, 2, 6], [7, 8, 9, 10, 2, 24, 9, 9, 5]])# 创建PCA对象
pca = PCA(n_components=2)# 拟合数据
pca.fit(X)# 转换数据
X_new = pca.transform(X)print(X_new)
可视化部分
线性判别分析(LDA)
原理部分
线性判别分析(Linear Discriminant Analysis,简称LDA)是一种经典的监督学习算法,它既可以作为分类器,也可以作为降维技术。LDA的主要思想是将数据投影到一个低维空间中,使得不同类别之间的距离最大化,同一类别内部的距离最小化。这样可以在保留尽量多的信息的同时,将数据进行有效的分类。LDA的主要步骤包括:
- 计算每个类别的均值向量和整个数据集的均值向量。
- 计算类内散度矩阵(within-class scatter matrix)和类间散度矩阵(between-class scatter matrix)。
- 计算投影矩阵,将数据投影到低维空间中。
- 使用投影矩阵将数据进行降维或分类。
LDA的优点包括:
- 在保留尽量多信息的同时,可以将数据进行有效分类。
- 可以用于降维,减少数据维度,便于可视化和处理。
- 适用于高维数据集。
LDA的缺点包括:
- 对于非线性可分的数据集,LDA的效果会受到影响。
- 对于不平衡的数据集,可能会导致分类结果出现偏差。
- 在计算类内散度矩阵时,需要计算每个类别的协方差矩阵,如果数据维度很高,计算量会很大。
代码部分
from sklearn.discriminant_analysis import LinearDiscriminantAnalysis
import numpy as np# 创建数据
X = np.array([[1, 2, 3, 6, 10, 22, 3, 2, 3], [4, 5, 6, 8, 9, 23, 5, 2, 6], [7, 8, 9, 10, 2, 24, 9, 9, 5]])
y = np.array([0, 1, 0])# 创建LDA对象
lda = LinearDiscriminantAnalysis(n_components=1)# 拟合数据
lda.fit(X, y)# 转换数据
X_new = lda.transform(X)print(X_new)
可视化部分
独立成分分析(ICA)
原理部分
- 在机器学习中,ICA被广泛应用于信号处理、图像处理、语音识别等领域。
- ICA的基本思想是:假设存在一组独立的成分,它们通过线性组合形成了观测信号。通过对观测信号进行分解,可以得到独立的成分。
- ICA的目标是找到一组线性变换,使得变换后的信号成分之间相互独立。
- ICA的应用场景包括:语音信号分离、图像分离、生物信号分析等。例如,ICA可以用于将多个人说话的混合语音信号分离成单独的语音信号,或者将一张复杂的图像分解为不同的成分。
代码部分
from sklearn.decomposition import FastICA
import numpy as np# 创建数据
X = np.array([[1, 2, 3, 6, 10, 22, 3, 2, 3], [4, 5, 6, 8, 9, 23, 5, 2, 6], [7, 8, 9, 10, 2, 24, 9, 9, 5]])# 创建ICA对象
ica = FastICA(n_components=2)# 拟合数据
ica.fit(X)# 转换数据
X_new = ica.transform(X)print(X_new)
可视化部分
t-SNE降维算法
原理部分
- TSNE(t-Distributed Stochastic Neighbor
Embedding)是一种非线性降维算法,用于将高维数据降至二维或三维,以便于可视化。 - 该算法的基本思想是,将高维数据映射到低维空间中,使得在原始空间中相似的数据点在低维空间中也保持相似,而不相似的数据点在低维空间中则距离较远。
- TSNE算法主要分为两个步骤:首先,通过高斯核函数计算每个数据点与其它数据点之间的相似度,然后将这些相似度转化为概率分布。接着,在低维空间中,通过KL散度最小化的方法,将这些概率分布转化为新的低维空间中的概率分布。最终,通过梯度下降算法,将低维空间中的数据点的位置不断调整,使得其与高维空间中的数据点的相似度尽可能地保持一致。
- TSNE算法的优点是能够在保持数据点之间的相对距离的同时,有效地将高维数据映射到低维空间中,从而便于可视化和分析。但是,该算法的计算复杂度较高,需要较长的计算时间和计算资源。
代码部分
from sklearn.manifold import TSNE
import numpy as np# 创建数据
X = np.array([[1, 2, 3, 6, 10, 22, 3, 2, 3], [4, 5, 6, 8, 9, 23, 5, 2, 6], [7, 8, 9, 10, 2, 24, 9, 9, 5]])# 创建t-SNE对象
tsne = TSNE(n_components=2)# 转换数据
X_new = tsne.fit_transform(X)print(X_new)