Skip to content
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

[sml] add PCA in jax #240

Merged
merged 4 commits into from
Jul 14, 2023
Merged

[sml] add PCA in jax #240

merged 4 commits into from
Jul 14, 2023

Conversation

hacker-jerry
Copy link
Contributor

@hacker-jerry hacker-jerry commented Jul 13, 2023

[Solve] 使用 SPU 实现主成分分析基础功能

  1. 完成了fit, transform的基础功能;
  2. 实现了设置主成分和查看方差的功能;
  3. 通过了在 spsim 和 emulator 的 unittest。

@hacker-jerry
Copy link
Contributor Author

@anakinxc

@anakinxc anakinxc requested a review from deadlywing July 14, 2023 02:47
@deadlywing
Copy link
Contributor

[Solve] 使用 SPU 实现主成分分析基础功能

  1. 完成了fit, transform的基础功能;
  2. 实现了设置主成分和查看方差的功能;
  3. 通过了在 spsim 和 emulator 的 unittest。

sorry,我跑了一下你的单元测试,差别有点过于大了。我看了一下您的实现,似乎fit有点问题,需要修改一下哈。

@deadlywing
Copy link
Contributor

[Solve] 使用 SPU 实现主成分分析基础功能

  1. 完成了fit, transform的基础功能;
  2. 实现了设置主成分和查看方差的功能;
  3. 通过了在 spsim 和 emulator 的 unittest。

另外,抱歉之前写要求的时候遗漏了,inverse_transform应该也是pca的必要api,麻烦您也补充一下,这个就是transform的逆变换~

Thanks

@hacker-jerry
Copy link
Contributor Author

[Solve] 使用 SPU 实现主成分分析基础功能

  1. 完成了fit, transform的基础功能;
  2. 实现了设置主成分和查看方差的功能;
  3. 通过了在 spsim 和 emulator 的 unittest。

sorry,我跑了一下你的单元测试,差别有点过于大了。我看了一下您的实现,似乎fit有点问题,需要修改一下哈。

您好,可以给出具体的精度标准吗?最好能有实例对比,这样我可以在本地测试好在提交,谢谢!

@deadlywing
Copy link
Contributor

[Solve] 使用 SPU 实现主成分分析基础功能

  1. 完成了fit, transform的基础功能;
  2. 实现了设置主成分和查看方差的功能;
  3. 通过了在 spsim 和 emulator 的 unittest。

sorry,我跑了一下你的单元测试,差别有点过于大了。我看了一下您的实现,似乎fit有点问题,需要修改一下哈。

您好,可以给出具体的精度标准吗?最好能有实例对比,这样我可以在本地测试好在提交,谢谢!

  1. 首先,我理解您这里是实现方式有问题;您fit里计算的并不是特征值和特征向量。
  2. 精度方面,我感觉起码得保证有小数点后2位的准确。示例对比我不是很清楚是什么意思,我们内部现在并没有PCA的实现哈,所以没法提供对比。

Thanks

@hacker-jerry
Copy link
Contributor Author

[Solve] 使用 SPU 实现主成分分析基础功能

  1. 完成了fit, transform的基础功能;
  2. 实现了设置主成分和查看方差的功能;
  3. 通过了在 spsim 和 emulator 的 unittest。

sorry,我跑了一下你的单元测试,差别有点过于大了。我看了一下您的实现,似乎fit有点问题,需要修改一下哈。

您好,可以给出具体的精度标准吗?最好能有实例对比,这样我可以在本地测试好在提交,谢谢!

  1. 首先,我理解您这里是实现方式有问题;您fit里计算的并不是特征值和特征向量。
  2. 精度方面,我感觉起码得保证有小数点后2位的准确。示例对比我不是很清楚是什么意思,我们内部现在并没有PCA的实现哈,所以没法提供对比。

Thanks

ok, 我用迭代法修改了一下 PCA 类,现在做到精度在1e-4以内了,请您看一下。

@hacker-jerry
Copy link
Contributor Author

在高维数据上测了一下,应该可以达到1e-3的精度,麻烦您确认一下。

@deadlywing
Copy link
Contributor

算法实现应该是ok的,个人感觉应该没啥大问题了,我稍后在开发机上跑一下emulation。

提几个小建议:

  1. max iter次数可以作为一个超参数放在__init__函数里
  2. method可以换一下,sklearn的full是因为其使用full-svd算法实现;而您是本质上是基于power iteration求解特征值分解,您可以想一想换一个更贴切的名字?
  3. power iteration不是一个广为人知的算法,您能在代码里直接增加一些doc,简单描述一下算法的原理么?或者share一下参考文献?(btw, power iteration正常来说只能计算主特征值和特征向量,个人感觉您 # Remove the component 这里可以说明一下您做这样的变换后的矩阵满足了除最大特征值外的特征值和特征向量和原矩阵是一致的)

Thanks

@hacker-jerry
Copy link
Contributor Author

算法实现应该是ok的,个人感觉应该没啥大问题了,我稍后在开发机上跑一下emulation。

提几个小建议:

  1. max iter次数可以作为一个超参数放在__init__函数里
  2. method可以换一下,sklearn的full是因为其使用full-svd算法实现;而您是本质上是基于power iteration求解特征值分解,您可以想一想换一个更贴切的名字?
  3. power iteration不是一个广为人知的算法,您能在代码里直接增加一些doc,简单描述一下算法的原理么?或者share一下参考文献?(btw, power iteration正常来说只能计算主特征值和特征向量,个人感觉您 # Remove the component 这里可以说明一下您做这样的变换后的矩阵满足了除最大特征值外的特征值和特征向量和原矩阵是一致的)

Thanks

您好,感谢您的建议,我已经在代码中做出相应修改,麻烦您再看一下,谢谢!

Copy link

@rivertalk rivertalk left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM

@rivertalk rivertalk merged commit ce318f0 into secretflow:main Jul 14, 2023
@github-actions github-actions bot locked and limited conversation to collaborators Jul 14, 2023
@Candicepan Candicepan linked an issue Jul 16, 2023 that may be closed by this pull request
@deadlywing
Copy link
Contributor

[Solve] 使用 SPU 实现主成分分析基础功能

  1. 完成了fit, transform的基础功能;
  2. 实现了设置主成分和查看方差的功能;
  3. 通过了在 spsim 和 emulator 的 unittest。

@hacker-jerry

您好,我最近发现之前emul部分的代码有点问题,即在运行emul程序之前,是需要先将数据load到PYU上的,但之前emulation并没有提供相应的api;所以如果使用了自定义数据,实际上emul部分都是在明文下运行的,辛苦您再发起一次PR,修复一下这个问题,具体可以参考:(其实主要就是调用一下emulator.seal哈)

https://github.com/secretflow/spu/blob/main/sml/linear_model/simple_sgd_emul.py

Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

使用 SPU 实现主成分分析基础功能
3 participants