目录
实验前准备
本实验是在Anaconda下的jupyter notebook上进行的,使用的代码语言为python。在开始实验前,我们首先需要导入所需要的库与包或者模块。本实验是一个将数据集进行降维的实验,需要处理大量的实验数据,需要处理多维数组对象,以及需要画图进行可视化处理,还有一些数学公式的运用,所以我们需要导入的包为numpy、pandas、math以及matplotlib.pyplot。同时我们还需要使用random函数来随机选取样本,所以我们还需要导入random。最后我们还需要导入warnings模块将一些可能出现的警告信息忽略。
代码实现:
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import math
import matplotlib as mpl
import warnings
warnings.filterwarnings('ignore')
from pandas.core.frame import DataFrame
降维
导入数据集
实验要求:
代码实现:
#your code here
# 首先将train_data.cvs数据集进行导入
df=pd.read_csv("train_data.csv")
# 将panda形式的数据修改为矩阵形式
df_array=np.array(df)
# 将行和列进行调换(转置)
X=np.transpose(df_array)
实验结果分析:如图所示,我们首先需要将训练集“train_data.csv”进行导入,使用了pandas库的read_csv函数。随后由于导入的数据集形式为framedata数据,所以我们还需要将其转换为矩阵。最后我们在实验要求中提到,训练集本来是167行9列,然后希望转换为9行167列,所以我们还需要将数组进行转置,使用np.transpose函数即可实现。
样本中心化
实验要求:
代码实现:
#your code here
# 首先获取X矩阵的每一行的均值
X_rows_mean=np.mean(X,axis=1,keepdims=True)
# 进行中心化,将X的每一行数据减去这一行的均值
X=X-X_rows_mean
实验结果分析:如图所示,在样本数据中心化中,我们首先需要获取X矩阵的每一行的均值,我们使用了np.mean函数来实现,然后我们可以开始实现中心化,直接将X减去前面获得的每一行的均值矩阵即可,因为python中拥有广播机制,所以可以自动补全行和列。
协方差矩阵
实验要求:
代码实现:
#your code here
# 计算协方差矩阵
X_cov=np.dot(X,X.T)
实验结果分析:如图所示,我们需要计算协方差矩阵,从实现要求中就可以得出,协方差矩阵为X.XT,所以我们可以直接使用np.dot函数来实现,或者我们也可以使用@运算符来实现同样的功能。
特征分解
实验要求:
代码实现:
#your code here
# 对协方差矩阵进行特征值分解
vals,vecs=np.linalg.eig(X_cov)
实验结果分析:如图所示,我们在前面已经获得了协方差矩阵,然后我们需要对这一个协方差矩阵进行特征值分解,我们直接调用python的内置函数np.linalg.eig即可实现。
选取降维后的维度k
实验要求:
代码实现:
#your code here
# 首先计算所有特征值的总和
total_vals=np.sum(vals)
# 对特征值和特征向量进行排序(按照降序进行排序)
vals_vecs = [(vals[i],vecs[i]) for i in range(len(vals))]
vals_vecs=sorted(vals_vecs,reverse=True)
# 初始化总贡献率、维度k以及阈值t
cumulative_variance_ratio=0
k=0
t=0.99
# 开始按照排序的顺序进行计算
for i in range(len(vals_vecs)):
k+=1
# 将前k个特征值进行累加
cumulative_variance_ratio+=(vals_vecs[i][0]/total_vals)
# 如果累加的方差的贡献率超过阈值,就结束循环
if cumulative_variance_ratio>=t:
break
# 打印结果
print(k)
实验结果分析:如图所示,我们需要选取降维后的维度k值,我们根据公式,第一步需要计算所有特征值的总和,我们在前面已经求出了特征值的举证,我们直接调用sum函数即可将所有的特征值进行求和。随后我们需要对特征值进行排序,而且是按照降序进行排序,由于后面的实验中需要用到特征向量,所以在这里我们直接将特征值与特征向量绑定进行排序,我们首先将特征值和特征向量进行绑定,然后调用函数sorted将它们进行降序排序,注意的是,sorted默认为升序排序,我们需要添加参数reverse=True才可以实现降序排序。随后我们需要初始化总贡献率,维度k以及阈值。然后我们便可以按照排序的顺序依次对特征值进行处理,依次叠加,直到所累积的特征值超过阈值,这个时候便可以退出循环,然后返回此时的维度k。
获取投影矩阵
实验要求:
代码实现:
#your code here
# 初始化W列表
W=[]
# 开始for循环进行取前k个对应特征值最大的特征向量
for i in range(k):
W.append(vals_vecs[i][1])
# 将列表W转换为矩阵
W=np.array(W)
实验结果分析:如图所示,我们需要获取前k大个特征值所对应的特征向量,由于我们在前面进行排序时已经将特征值和特征向量进行绑定排序,所以我们可以直接将前k大的特征向量添加到W列表即可。我们首先需要初始化W列表,用于存放前k大的特征值对应的特征向量。然后我们开始循环k次,获取前k个特征向量,然后依次将它append进W列表中。最后我们还需要将列表转换为矩阵,因为我们需要获取的是一个投影矩阵。
获取降维后的数据集
实验要求:
代码实现:
#your code here
# 直接根据公式代入即可得到Y
Y=np.dot(W,X)
实验结果分析:如图所示,我们可以直接根据公式Y=P.X计算降维后的数据集Y即可。我们可以使用np.dot函数或者运算符@来实现。
绘制图像
实验要求:
代码实现:
#your code here
# 描绘点
plt.scatter(Y[0],Y[1])
# 为图像设置标题以及坐标轴
plt.title("dimension0—dimension1")
plt.xlabel("dimension 0")
plt.ylabel("dimension 1")
# 显示图像
plt.show()
实验结果分析:如图所示,我们需要绘制图像来显示我们降维后的点的聚类情况。由于降维后的维度k为2,所以我们直接利用这两个维度来进行画图即可。我们首先使用scatter函数来绘制点,然后给图像设置标题以及坐标轴。最后调用函数show来显示图像即可。
观察图像,我们可以发现,降维后的点的两个维度之间还是拥有着明显的线性关系的,然后每一个点也都有明显的聚类关系。观察比较可以得知,我们绘制出来的图像是比较符合题意的,可以得知我们前面所编写的代码是没有什么问题的。
实验总结
降维:
- 降维的基本概念:降维是指通过某种数学变换或算法将高维数据映射到低维空间的过程。在现实世界的许多问题中,数据往往具有高维性,这给数据分析和处理带来了挑战。降维的目的是减少数据的维度,同时尽可能地保留原始数据的关键信息。
- 降维的主要目的和好处包括:
- 数据压缩:高维数据需要大量的存储空间,而降维可以减少数据的存储需求
- 特征选择:降维可以帮助找到对问题重要的特征,去除对问题不重要的特征,提高模型的效率和泛化能力。
- 可视化:通过将数据映射到二维或三维空间,降维可以帮助可视化高维数据,揭示数据之间的结构和关系。
- 消除噪声和冗余:降维可以过滤掉数据中的噪声和冗余信息,提高数据的质量和可靠性。
- 加速学习和计算:在机器学习和数据挖掘任务中,降维可以减少计算复杂度,加快算法的训练和预测速度。
- 常见的降维方法包括:
- 主成分分析(Principal Component Analysis,PCA):通过线性变换将数据映射到新的正交坐标系,使得新坐标系下数据的方差最大化。
- 线性判别分析(Linear Discriminant Analysis,LDA):通过考虑类别信息,将数据映射到一个低维空间,使得类别之间的差异最大化。
- t-SNE:一种非线性的降维方法,通过优化数据点之间的相似性来进行降维,适用于可视化高维数据。
- 自编码器(Autoencoder):一种神经网络模型,通过学习数据的低维表示和重构,实现降维和特征提取。
主成分分析:
- 主成分分析的基本概念:主成分分析是一种通过线性变换将原始数据转换为一组新的变量,称为主成分,从而实现数据降维的方法。主成分是原始数据的线性组合,其选择是以最大化数据方差为目标。
- 主成分分析的算法流程如下:
- 标准化数据:对原始数据进行标准化,使得每个特征具有零均值和单位方差
- 计算协方差矩阵:计算标准化后的数据的协方差矩阵。
- 特征值分解:对协方差矩阵进行特征值分解,得到特征值和对应的特征向量。
- 特征值排序:按照特征值的大小进行降序排序。
- 选择主成分:选择前k个特征值对应的特征向量作为主成分。
- 数据转换:将原始数据投影到选定的主成分上,得到降维后的数据。
- 主成分分析的特点:
- 降维:主成分分析通过去除原始数据中的冗余信息,将高维数据映射到低维空间,从而降低数据的维度。降维有助于减少数据的存储空间和计算复杂度。
- 最大化方差:主成分分析的目标是找到能够最大化解释原始数据方差的主成分。这意味着主成分能够保留原始数据中的大部分信息。
- 无关性:主成分之间应该是相互无关的。这意味着主成分分析可以去除原始数据之间的相关性。
- 主成分分析的使用:
- 特征提取:通过提取主成分,主成分分析可以用于图像处理、模式识别和计算机视觉等任务中的特征提取。
- 数据压缩:主成分分析可用于将高维数据压缩到较低维度,以减少存储空间和计算成本。
- 数据可视化:通过将数据映射到二维或三维空间,主成分分析可以帮助可视化高维数据,并揭示数据中的结构和模式。
- 选取降维后的维度k的方法特征,选取降维后的维度k的方法有多种,常用的主要包括:
- 交叉验证:使用交叉验证的方式评估降维后的维度k对模型性能的影响。选择在最佳性能点上的k值。
- 拐点法(Elbow Method):绘制主成分的方差解释比随维度k的变化曲线图。选择拐点处对应的k值作为降维后的维度。
- 累计方差解释比:计算每个主成分的方差解释比,并累加至达到预设阈值。选择使得累计方差解释比达到预设阈值的最小k值。
- 方差解释比:计算每个主成分的方差解释比,即特征值与总特征值之比。选择使得方差解释比达到预设阈值的最小k值。
- 主成分分析与其他降维方法的比较:
- 主成分分析是一种无监督学习方法,不需要依赖类别信息。
- 主成分分析通过最大化方差来选择主成分,而线性判别分析则考虑了类别信息,旨在实现类别间的最大可分性。
- 主成分分析假设数据是线性可分的,对于非线性数据,其他方法(如核主成分分析)可能更合适。