1200字范文,内容丰富有趣,写作的好帮手!
1200字范文 > 【高维数据降维】主成分分析PCA

【高维数据降维】主成分分析PCA

时间:2023-01-30 17:36:08

相关推荐

【高维数据降维】主成分分析PCA

高维数据降维之主成分分析 PCA

高维数据降维是指采用某种映射方法,降低随机变量的数量,例如将数据点从高维空间映射到低维空间中,从而实现维度减少。

降维分为:特征选择 和 特征提取

特征选择:是从含有冗余信息以及噪声信息的数据中找出主要变量;

特征提取:是去掉原来的数据,生成新的变量,可以寻找数据内部的本质结构特征。

降维的过程是通过对输入的原始数据特征进行学习,得到一个映射函数,实现将输入样本映射后到低维空间中之后,原始数据特征并没有明显的损失,通常情况下新空间的维度要小于原空间的维度。目前大部分降维算法是处理向量形式的数据。

主成分分析 PCA

主成分分析 PCA 是最常用的线性降维方法,它的目标是通过某种线性投影,将高维的数据映射到低维的空间中,并期望在所投影的维度上数据的方差最大,以此使用较少的维度,同时保留较多原数据的维度。

主成分分析的降维是指经过正交变换后,形成新的特征集合,然后从中选择比较重要的一部分子特征集合,从而实现降维。这种方式并非是在原始特征中选择,所以 PCA 这种线性降维方式最大程度上保留了原有的样本特征。

设有 m 条 n 维的数据, PCA一般步骤为:

(1) 将原始数据按列组成 n 行 m 列矩阵 X;

(2) 计算矩阵 X 中每个特征属性 (n 维) 的平均向量 M (平均值);

(3) 将 X 的每一行(代表一个属性字段)进行零均值化,即减去 M ;

(4) 按照公式 C=1mXXTC = \frac{1}{m} XX^TC=m1​XXT 求出协方差矩阵;

(5) 求出协方差矩阵的特征值及对应的特征向量;

(6) 将特征向量按照对应特征值从大到小按行排列成矩阵,取前 k(k<n) 行组成基向量 P;

(7) 通过 Y=PXY = PXY=PX 计算降维到 k 维后的样本特征。

例子:

# 例:基于sklearn和numpy随机生成2个类别共40个三维空间的样本点import numpy as npimport matplotlib.pyplot as plt# multivariate_normal 生成多元正态分布需要参数:期望和方差# 第一个类别mu_vec1 = np.array([0,0,0]) # 样本均值cov_mat1 = np.array([[1,0,0],[0,1,0],[0,0,1]]) # 协方差矩阵class1_sample = np.random.multivariate_normal(mu_vec1, cov_mat1, 20).T# 第二个类别mu_vec2 = np.array([1,1,1])cov_mat2 = np.array([[1,0,0],[0,1,0],[0,0,1]])class2_sample = np.random.multivariate_normal(mu_vec2, cov_mat2, 20).Tax = plt.subplot(projection = '3d')ax.scatter(class1_sample[0],class1_sample[1],class1_sample[2],c = 'b')ax.scatter(class2_sample[0],class2_sample[1],class2_sample[2],c = 'r')

现在用 PAC 降维到二维空间

# 计算平均向量all_samples = np.concatenate((class1_sample, class2_sample), axis=1)mean_x = np.mean(all_samples[0,:])mean_y = np.mean(all_samples[1,:])mean_z = np.mean(all_samples[2,:])print(mean_x,mean_y,mean_z)mean_vector = np.array([mean_x,mean_y,mean_z])print(mean_vector)scatter_matrix = np.zeros((3,3))for i in range(all_samples.shape[1]):scatter_matrix += (all_samples[:,i].reshape(3,1) - mean_vector).dot((all_samples[:,i].reshape(3,1) - mean_vector).T)# 散布矩阵 S 和协方差矩阵是不一样的,但是都是 PCA 里可用于求解特征向量和特征值print(scatter_matrix)# 计算特征值 和 特征向量eig_val_sc,eig_vec_sc = np.linalg.eig(scatter_matrix)print(eig_val_sc)print(eig_vec_sc)

最后按照特征值和特征向量进行配对,并按照特征值的大小从高到低进行排序,由于需要将三维空间投射到二维空间中,选择前两个特征值 - 特征向量对作为坐标,并构建 2 ×\times× 3 的特征向量矩阵 W ,原来空间的样本通过与此矩阵相乘,使用公式 y=WTxy=W^Txy=WTx 的方法将所有样本转换到新的空间中。

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。