使用了自己定义的PCA算法,结果restore后形成了一个不一样的结果

来源:7-5 高维数据映射为低维数据

慕雪9375274

2022-03-18

我用您的类加载后也一样,应该红色线在蓝色点的中间,结果在下面图片描述

写回答

1回答

liuyubobobo

2022-03-19

这个图像是有问题的。


我测试了一下,在最新版本下,课程的代码没有这个问题。请你尝试先下载课程的完整代码(包括 Jupyter Notebook),在你的环境下运行,看是否有同样的问题。这一小节的相关代码传送门:https://git.imooc.com/coding-169/coding-169/src/master/07-PCA-and-Gradient-Ascent/05-Data-Projection


如果没有问题,请在确定你的 Jupyter Nodebook 的代码没有问题的基础上,再试一下把你的 playML 替换成课程代码,但要注意,替换以后,加载相关 py 文件的单元格必须重新运行,才能让新的 py 文件生效(如果你修改过 py 文件,同样如此,必须重新运行 Jupyter Notebook 加载 py 文件的单元格,对 py 文件的修改才生效。)如果没有问题,说明错误在 py 文件上;否则可以再看一下 Jupyter Notebook 是否有问题。一点一点缩小错误范围。


继续加油!:)

0
2
liuyubobobo
回复
慕雪9375274
这就 make sense 了,从这个角度看,我在课程中封装的 PCA 的低维恢复高维数据是有问题的。这个问题是:我们自己封装的 PCA,初始对数据进行了 demean 操作,也就是对原始数据做了修改,减了一个均值。而从低维恢复到高维数据的过程中,其实只是恢复到了 demean 后的高维数据。他和原始数据之间还差一个“均值”。这是一个 bug,我写代码的时候没有意识到。其实主要是因为,我们很少降维后再把数据恢复到高维。PCA 的核心是在原始的高维空间找到保留信息最大的那个低维空间,进行降维。所以我没有测试到。抱歉! P.S. 同时,是的,我们课程中实现的 PCA 算法,和 sklearn 内的实现是不一样的。sklearn 的实现是使用数学方法求解,而我们自己的封装是搜索求解,这会导致对于一些更复杂的数据,直接使用我们现在的代码,会很容易产生精度问题。可能需要做大量的调参工作(搜索的学习率或者迭代次数),才能得到可以接收的结果。(但是你图示的问题,不是这个问题。)
2022-03-20
共2条回复

Python3入门机器学习 经典算法与应用  

Python3+sklearn,兼顾原理、算法底层实现和框架使用。

5893 学习 · 2455 问题

查看课程