IncrementalPCA的学习

  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_
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 230,321评论 6 543
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 99,559评论 3 429
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 178,442评论 0 383
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 63,835评论 1 317
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 72,581评论 6 412
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 55,922评论 1 328
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 43,931评论 3 447
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 43,096评论 0 290
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 49,639评论 1 336
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 41,374评论 3 358
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 43,591评论 1 374
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 39,104评论 5 364
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 44,789评论 3 349
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 35,196评论 0 28
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 36,524评论 1 295
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 52,322评论 3 400
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 48,554评论 2 379

推荐阅读更多精彩内容