美文网首页
IncrementalPCA的学习

IncrementalPCA的学习

作者: 妖皇裂天 | 来源:发表于2018-12-28 22:44 被阅读0次

  sklearn中的IncrementalPCA,主要是为了解决单机内存限制的。有时候样本数量过大,直接去拟合数据会让内存爆炸的,此时可用IncrementalPCA来解决这个问题。IncrementalPCA先将数据分成多个batch,然后对每个batch依次调用partial_fit,这样一步步得到最终的样本最优降维。那么IncrementalPCA的工作原理是什么呢?看sklearn中的源码是最好的方式了!

  1. 判断参数n_components的输入是否规范:n_components要满足两个要求,一是在区间[1, n_features]之间,二是要小于输入样本数量n_samples。
  2. 对重要的中间变量的更新,包括col_mean、col_var和n_total_samples。其中,col_mean、col_var是将当前batch的样本的mean迭代到之前已经训练的总样本的mean和variance上,而n_total_samples则是记录了加上这一batch后参与训练的总样本数量。具体代码可以看这一部分源码
  3. 接下来就是IncrementalPCA的核心代码了,主要是对当前输入的batch数据X进行“修改”,使得新得到的训练样本X还包含之前已经参与训练的样本数据的信息。代码如下图: IncrementalPCA核心代码.png 参数self.n_samples_seen_保存的是参与训练的样本总数。如果是0,代表是第一次训练,那么就只是对X进行简单的白化(减去均值);如果不是0,那就需要创造一个新的矩阵\hat{X}\hat{X}不仅包括新的输入信息,还包括过去的训练数据信息。源码中的做法是在当前输入样本X的基础上堆叠上两部分新的矩阵。一个是self.n_singular_values_.reshape((-1, 1)) * self.components_,其中n_singular_values_保存的是部分奇异值,维度是[n_components],components_保存的是分解后的V矩阵的部分,维度是[n_components, n_features](其实components_就是样本矩阵的主成分,将components_与样本矩阵进行矩阵乘法就可以得到降维后的矩阵,所以PCA降维的实现是可以基于SVD实现的。事实上,几乎所有PCA都是利用SVD求主成分的,而不是利用样本协方差矩阵求主成分);另一部分是mean_correction,由名字可以看出是对矩阵均值的修正。也就是说,第一部分self.n_singular_values_.reshape((-1, 1)) * self.components_的加入带来之前的样本信息,第二部分mean_correction只是为了平衡第一部分加入后给矩阵均值带来的偏移。
  4. 然后就是对新的训练矩阵\hat{X}的主成分提取,源代码如下:
U, S, V = linalg.svd(X, full_matrices=False)
U, V = svd_flip(U, V, u_based_decision=False)

 这里svd_flip函数的作用我还不太清楚,源代码中的解释是

"Sign correction to ensure deterministic output from SVD. Adjusts the columns of u and the rows of v such that the loadings in the columns in u that are largest in absolute value are always positive."

 其具体代码如下图: svd_flip实现代码.png

 说实话,这里我还不是很理解。先挖个坑,以后再填。

  1. 最后就是IncrementalPCA的属性更新了,包括n_samples_seen_、components_、singular_value_、mean_、var_等。

  虽然在.transform()函数中只判断了components_和mean_是否为空,但是由上面对partial_fit()函数源码的分析可知,n_samples_seen_、components_、singular_value_、mean_、var_这几个参数是很重要的。所以如果要保存一个训练好的IncrementalPCA模型,就需要保存n_samples_seen_、components_、singular_value_、mean_、var_这5种属性。
  所以,我们可以利用IncrementalPCA对大规模数据集进行间断式训练。保存n_samples_seen_、components_、singular_value_、mean_、var_这5种属性,然后直接赋给新的IncrementalPCA模型就相当于已经训练好的PCA模型

2019年1月15号补充:今天跑代码时发现只存上述5种属性是不够的,在IncrementalPCA.transform()中尽管没有判断PCA模型是否有属性explained_variance_,但是在这里却直接用到了,所以这个属性也是要保存的。为了避免后面使用训练好的PCA模型的过程中出现问题,还是将fit过程中更新的所有属性都保存下来,也就是下图中这些属性。

IncrementalPCA需要保存的属性.png
  1. n_samples_seen_,已经参与训练的数据量
  2. components_,主成分
  3. singular_values_,奇异值
  4. mean_,待降维矩阵的均值
  5. var_,待降维矩阵的方差
  6. explained_variance_
  7. explained_variance_ratio_
  8. noise_variance_

相关文章

  • IncrementalPCA的学习

      sklearn中的IncrementalPCA,主要是为了解决单机内存限制的。有时候样本数量过大,直接去拟合数...

  • 学习的学习

    “三分钟的热情相信大家都有,但是能够重复思考一个概念,一个知识点,并把它吃透掌握才是大部分人稀缺的能力。”李笑来老...

  • 学习的学习

    不只是学习,听完是不够的。 还要把学到的东西变成方法论、清单式的条目出来去刻意练习。去用,去不断的实践。 有个词 ...

  • 学习的真相|学习「学习」再学习

    不知不觉间,笑来老师在“好的家庭教育”讲的新课《学习的真相》,已经更新到了第12课,关于“学习的真相”这门课,我认...

  • 元学习——关于学习的学习

    元学习是一门关于如何学习的课程。 首先理清几个概念 1、学习是拼图 学习并不是线性的,相反学习是一张信息拼图,类似...

  • 学习,就是学习学习的态度!

    学习,从来都需要态度! 没有了态度,你来了,也不过是躯体入场,思想游荡! 那就学习学习的态度喽!

  • 学习学习再学习的成长

    女儿快要中考了,随着时间的临近,中考紧张气氛越来越浓。成绩一直不太理想的她,也有了紧迫感,不时表露出来“书到用时方...

  • 学习,学习的方法

    学习一门学科首先掌握这个领域的一些基础理论和概念 然后学习一些高级的组合框架,这些框架是一些能够解决这个领域通用问...

  • 08 学习的学习

    1 现代人,基本都是读书人,我们从小学,甚至是幼儿园就开始读书写字一直到大学毕业,少说也有16年,但是很多人都不知...

  • 学习学习的方法

    1.效率的本质 很多人常常拒绝学习,拒绝学习的理由和痴迷于学习的理由一样——不知道它有什么用。 学习是投资回报率最...

网友评论

      本文标题:IncrementalPCA的学习

      本文链接:https://www.haomeiwen.com/subject/jrzelqtx.html