-
Notifications
You must be signed in to change notification settings - Fork 104
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
使用 SPU 优化 PCA 算法 #259
Comments
tarantula-leo give it to me. |
感谢你的认领~为避免走弯路,请先提交你的设计思路,经确认后再进入开发阶段
|
使用QR分解实现 |
Hi,可以稍微详细一点么? 明确一下,我们希望这次的要求是PCA算法能不需要先计算cov matrix,您可以对照一下看自己的idea是否满足要求哈~ Thanks |
考虑不计算协方差的出发点是什么?之前是准备用QR分解+QR迭代 |
因为计算协方差在n比较大的时候cost也比较大,如果再做特征值分解可能性能不一定能比当前的power iteration效率高~本期的任务会相对更注重性能,所以做了这样的要求。 当前,重点还是性能,如果QR迭代性能确实更高也是ok的~欢迎尝试 Thanks |
|
|
|
hello,我运行了一下,不会自动退出(虽然结果是错误的,估计是精度不够了) |
那估计是oom了? |
能完整执行完transform么?我这边这步是没执行到的: |
这看起来不是误差导致的,应该是算法逻辑问题,这里是会出现除0的: |
类似这样的数据应该也会出错 |
sorry,这个我没理解,是指输入数据用这个,最后也会出错么? |
理论上,如果这里就除0的话,那说明cov matrix是半正定的,而且提取的主成分个数也太多了,我觉得这个就已经是属于input的问题~ |
我简单尝试了一下,应该是power iteration本身的算法精度问题,在特征维度p比较大的时候,可能需要非常大的迭代次数。 我测试到p=800左右,在默认配置下就有点飞了~ So,这样看来,如果您实现的算法能在收敛速度上优于power iteration,我感觉也是很有价值的~ |
用迭代的应该都会有精度问题吧 比如皮尔逊里newton_inverse的实现方案 会有类似问题么?是不是迭代的实现方案都无法支持大一些的数据量 |
也是类似的,随着矩阵维度和条件数的增大,newton_inverse的精确性也会变差,此时就需要增大迭代次数,所以这也算是一个magic number; so,您也可以快速尝试一下QR,不过我也不太确定qr迭代的收敛速度比power iteration的收敛速度是否有优势; |
单纯的qr迭代效率应该是不够的
|
确实,光看迭代部分,首先qr分解的cost就不小,然后还有两次矩阵乘;如果收敛速度没有决定性优势的话,感觉应该不如现在的power iteration |
对于迭代计算方面有什么设计思路么?像PCA、Newton_inverse还有NMF都会涉及到迭代,目前基本是用固定迭代次数,spu没法用control_flow来实现,而且在数据高维的时候准确性会下降很多。 |
对大矩阵而言,很多迭代算法都有这种问题,当前只能通过手动调整迭代次数来达到更高的精度。但是这里我理解有两个精度问题:
话说回来,对PCA,原本是希望能实现svd算法,一方面能避免计算conv matric,另一方面也能给其他算法提供重要的基础算子。 |
用gram_schmidt来做qr应该会缓解溢出情况,不过还是需要去处理下scale。 |
|
btw,你说的迭代次数具体是指哪里? |
迭代次数指的是eigh_power里的,simple_pca里的power_iteration迭代轮数和n_feature相关,这里的和n_component相关;iteration里的迭代次数一般就4或者7即可,根据n_component/n_feature比例来。 |
个人觉得,您可以在utils文件夹下建一个extmath.py,把我们这次讨论的一些内容放到util里,后续可以作为统一的工具函数,其中可以包括:
然后,我觉得您也可以在原来的pca里增加一个method=rsvd 不过也需要麻烦您描述一下我们当前这个方案的一些问题,如需要FM128,可能需要调整scale,以及迭代轮数要随着n_component增大而增大等信息(这些可以直接加在PCA那个类的注释doc里~) |
大概这么整合:
|
嗯,,我觉得ok
|
|
|
去均值用SVD的话fit需要,transform不用 |
先提交了extmath的PR,PCA的后面要抽空补充下原理 |
另外,从定义出发,pca本质可以认为找方差最大的投影方向,如果没有去均值化,那么感觉应该容易被scale影响~ |
fit_transform是因为fit和transform一起做,在fit的时候本身就是去均值的,所以后面就不需要这步了; anyway,一个最简单的方式就是检查一下结果,不管用svd还是power iter,transform的结果都是一样的~ |
之前是用下面的fit_transform来验证结果的,看结果不太一样,如果分开用fit和transform结果是一致的
|
想问下用emul报错的原因是什么?另外,simulation时需要修改config,在emul里需要怎么进行设置?
|
|
emulation的config.json文件里没看到这个参数,只有调整field的:
可以直接在config.json里添加这个参数么? |
runtime_config 里加上 "fxp_fraction_bits": 30 |
util那个pr已经merge,pca麻烦重新发一个pr |
配置问题是要新建一个config.json的吗? |
你在 PCA 子目录下先建一个吧 |
已经提交,需要看下emul部分是否会报错。 |
# Pull Request ## What problem does this PR solve? 使用 SPU 优化 PCA 算法 Issue Number: Fixed #259 ## Possible side effects? - Performance: 1. 收敛速度更快(体现在能支持更大的特征维度) 2. 不需要显示的计算原数据集的协方差矩阵 - Backward compatibility:
任务介绍
详细要求
能力要求
操作说明
开发须知
以下部分代码请必须增加代码注释,对对应代码模块进行说明,包括:
The text was updated successfully, but these errors were encountered: