进入城乡建设网站怎么竣工备案,企业年金保险是一种什么保险,公司网站建设合作协议,中国门户网站有哪些今天看了用主成分分析简化数据#xff0c;就顺便用MNIST数据集做了下实验#xff0c;想直观地看一下效果#xff0c;并通过完成这个小demo深入理解下原理。我发现“是什么、能做什么、怎么用、效果是什么、原理是什么、优缺点是什么”这样的思路能让我更好地接受一个新知识就顺便用MNIST数据集做了下实验想直观地看一下效果并通过完成这个小demo深入理解下原理。我发现“是什么、能做什么、怎么用、效果是什么、原理是什么、优缺点是什么”这样的思路能让我更好地接受一个新知识之所以把原理放在效果后面是因为我比较喜欢先看看它的作用可视化意义之后能提起我对一个知识的兴趣加深对它意义的理解后面看数学原理会容易所以整篇文章就以这样的思路组织整理。主成分分析是什么主成分分析(Principal Component AnalysisPCA)一种降维方法在PCA中数据从原来的坐标系转换到了新的坐标系新坐标系由数据本身决定在新坐标系中第一个坐标轴选择的是原始数据中方差最大的方向第二个坐标轴选择的是和第一个坐标轴正交且具有最大方差的方向。该过程一直重复重复次数为原始数据中特征的数目。我们会发现大部分方差都包含在最前面的几个新坐标轴中。因此我们可以忽略余下的坐标轴即对数据进行了降维处理。初看这段话感觉是抽象的。方差大意味着什么方差是衡量源数据和期望值相差的度量值方差越大数据差别越大。选择方差最大的方向就是选择数据差别最大的方向。重复特征数目次就是说找第一个特征(第一维)方差最大的方向(即覆盖数据点最多的一条直线)做第一个轴正交且最大方差方向做第二个轴在此基础上再看第二个特征(第二维)找方差最大方向做第一个轴正交且最大方差方向做第二个轴依次类推。这样执行后会发现前几个坐标轴已经差不多囊括所有大差异了剩下的就不要了所以实现了降维。上面从理论上讲了主成分分析和它是如何一步一步实现降维的有一个感性认识。主成分分析能做什么降维在多个指标中只取重要的几个指标能使复杂问题简单化就像说话说重点一样。主成分分析怎么用要做的事就是使用tensorflow里的MNIST数据集取前100张图片中所有的手写数字7图片对他们进行主成分分析输出经过降维反变换回去的图片对比差异看看降维后的效果。引入MNIST数据集、numpy和PIL的Imageimport tensorflow.examples.tutorials.mnist.input_data as input_dataimport numpy as npfrom PIL import Image获得MNIST数据集的所有图片和标签mnist input_data.read_data_sets(MNIST_data/, one_hotFalse)imgs mnist.train.imageslabels mnist.train.labels这里可以看看imgs和labels的type和shape对于一个python初学者来说总是想搞清楚各个变量的类型和长相。print(type(imgs)) # print(type(labels)) # print(imgs.shape) # (55000, 784)print(labels.shape) # (55000,)取前1000张图片里的100个数字7origin_7_imgs []for i in range(1000):if labels[i] 7 and len(origin_7_imgs) 100:origin_7_imgs.append(imgs[i])看看shapeprint(np.array(origin_7_imgs).shape) # (100, 784)把10张图片排成2x5的表格由于一张图片是一个784维的一维数组变成我们想看的图片就需要把它reshape成28x28的二维数组然后再用Image里的方法把它拼成一张2x5的大图。由于tensorflow中MNIST都是灰度图(L)所以shape是(55000784)每张图的dtype是float32如果是彩色图(RGB)shape可能是(550007843)图的dtype是uint8从array转到Image需要用下面的方法def array_to_img(array):arrayarray*255new_imgImage.fromarray(array.astype(np.uint8))return new_img拼图def comb_imgs(origin_imgs, col, row, each_width, each_height, new_type):new_img Image.new(new_type, (col* each_width, row* each_height))for i in range(len(origin_imgs)):each_img array_to_img(np.array(origin_imgs[i]).reshape(each_width, each_width))# 第二个参数为每次粘贴起始点的横纵坐标。在本例中分别为(00)(280)(28*20)依次类推第二行是(028)(2828)(28*228)类推new_img.paste(each_img, ((i % col) * each_width, (i / col) * each_width))return new_img- 效果图Pythonten_origin_7_imgscomb_imgs(origin_7_imgs, 10, 10, 28, 28, L)ten_origin_7_imgs.show()数字7原图实现主成分分析算法(详细代码解析在文章后面的原理部分)def pca(data_mat, top_n_feat99999999):主成分分析输入矩阵data_mat 其中该矩阵中存储训练数据每一行为一条训练数据保留前n个特征top_n_feat默认全保留返回降维后的数据集和原始数据被重构后的矩阵(即降维后反变换回矩阵)# 获取数据条数和每条的维数num_data,dim data_mat.shapeprint(num_data) # 100print(dim) # 784# 数据中心化即指变量减去它的均值mean_vals data_mat.mean(axis0) #shape:(784,)mean_removed data_mat - mean_vals # shape:(100, 784)# 计算协方差矩阵(Find covariance matrix)cov_mat np.cov(mean_removed, rowvar0) # shape(784, 784)# 计算特征值(Find eigenvalues and eigenvectors)eig_vals, eig_vects linalg.eig(mat(cov_mat)) # 计算特征值和特征向量shape分别为(784)和(784, 784)eig_val_index argsort(eig_vals) # 对特征值进行从小到大排序argsort返回的是索引即下标eig_val_index eig_val_index[:-(top_n_feat 1) : -1] # 最大的前top_n_feat个特征的索引# 取前top_n_feat个特征后重构的特征向量矩阵reorganize eig vects,# shape为(784, top_n_feat)top_n_feat最大为特征总数reg_eig_vects eig_vects[:, eig_val_index]# 将数据转到新空间low_d_data_mat mean_removed * reg_eig_vects # shape: (100, top_n_feat), top_n_feat最大为特征总数recon_mat (low_d_data_mat * reg_eig_vects.T) mean_vals # 根据前几个特征向量重构回去的矩阵shape:(100, 784)return low_d_data_mat, recon_mat调用PCA进行降维low_d_feat_for_7_imgs, recon_mat_for_7_imgs pca(np.array(origin_7_imgs), 1) # 只取最重要的1个特征print(low_d_feat_for_7_imgs.shape) # (100, 1)print(recon_mat_for_7_imgs.shape) # (100, 784)看降维后只用1个特征向量重构的效果图low_d_img comb_imgs(recon_mat_for_7_imgs, 10, 10, 28, 28, L)low_d_img.show()数字7降维后的图主成分分析效果是什么降维前后对比图不难发现降维后数字7长得规则多了或许降维后再用tensorflow入门教程的softmax进行分类accuracy会更高。主成分析的原理是什么前面转坐标轴从理论上考虑这里主要从数学的角度考虑。第一个主成分是数据差异最大(方差最大)的方向第二个主成分是数据差异次大且与第一个主成分正交的方向。通过数据集的协方差矩阵及其特征值分析就能求得这些主成分的值。统计学中的几个概念平均值这个最为熟悉最不容易忘记描述样本集合的中间点。标准差描述样本集合中各个点到平均值的距离。方差标准差的平方。方差协方差方差是用来描述一维数据的协方差用来描述二维数据用来描述两个随机变量之间的关系如果是正值则说明两变量正相关负值说明负相关0说明不相关即相互独立。协方差从公式可以看出协方差的一些性质1、cov(X, X) var(X)2、cov(X,Y) cov(Y, X)协方差矩阵协方差可以描述二维数据但是对于多维数据来说我们只能两个点两个点地计算多次协方差一个n维数据我们需要计算C(n, 2)A(n,2)/2n!/((n-2)!*2)个协方差自然就需要用矩阵来组织这些数据。所以协方差矩阵的定义为协方差矩阵比如数据集有三个维度XYZ则协方差矩阵为三维协方差矩阵可见矩阵的对角线为方差由于cov(X,Y) cov(Y, X)所以是一个对称矩阵。注意协方差矩阵计算的是不同维度之间的协方差不是不同样本之间的协方差。结合代码分析原理目的就是找出差异最大的方向也就是影响最大的几个特征数学上通过协方差矩阵来找差异最大的特征排序最后找到降维后的特征矩阵。# 数据中心化即指变量减去它的均值mean_vals data_mat.mean(axis0) #shape:(784,)mean_removed data_mat - mean_vals # shape:(100, 784)# 计算协方差矩阵(Find covariance matrix)cov_mat np.cov(mean_removed, rowvar0)协方差矩阵需要计算平均值上面强调了计算的是不同维度的协方差数据每行是一个样本每列是一个维度因此计算的是列的平均值即axis0因此shape为(784)。使用np的cov函数计算协方差矩阵api入下numpy.cov(m, yNone, rowvarTrue, biasFalse, ddofNone, fweightsNone, aweightsNone)[source]详细的API请点这里**rowvar代表是否转置。在API里默认rowvar是True也就是行是variable列是observation我们这里列是observation行是variable。**eig_vals, eig_vects linalg.eig(mat(cov_mat)) # 计算特征值和特征向量mat(cov_mat)将输入转成矩阵。和matrixasmatrix不同如果输入已经是举着嗯或者ndarray它不会制作副本。相当于matrix(data, copyFalse)详细API请点这里linalg.eig(a)计算特征值和特征向量详细API请点这里矩阵乘法对应了一个变换在这个变换的过程中原向量主要发生旋转、伸缩的变化。如果矩阵对某一个向量或某些向量只发生伸缩变换不对这些向量产生旋转的效果那么这些向量就称为这个矩阵的特征向量伸缩的比例就是特征值。eig_val_index argsort(eig_vals) # 对特征值进行从小到大排序argsort返回的是索引即下标numpy.argsort(a, axis-1, kindquicksort, orderNone)详细API请点这里eig_val_index eig_val_index[:-(top_n_feat 1) : -1] # 最大的前top_n_feat个特征的索引reg_eig_vects eig_vects[:, eig_val_index]这里有一个语法问题[::]代表切片[开始结束步长]负号代表从后往前每隔步长个取一次比如有一个array[1, 2, 3, 4, 5]取[:-4:-2]0是第一个-1是最后一个(在这里是5的下标)从最后一个往前数一直数到-4(在这里是2的下标)每两个取1个数最后得到的array是[5, 3]。[:, eig_val_index]代表第一维不变第二维要eig_val_index个所以它的shape是(784top_n_feat)# 将数据转到新空间low_d_data_mat mean_removed * reg_eig_vects # shape: (100, top_n_feat), top_n_feat最大为特征总数recon_mat (low_d_data_mat * reg_eig_vects.T) mean_vals # 根据前几个特征向量重构回去的矩阵shape:(100, 784)一个shape是(100784)的矩阵乘以一个shape是(784top_n_feat)的矩阵最后得到降维的矩阵(100 top_n_feat)recon_mat再将矩阵变回(100784)得到降维后再重构的矩阵。主成分分析的优缺点是什么优点降低数据的复杂性识别最重要的特征缺点不一定需要且可能损失有用信息适用数据类型数值型数据