2012-10-08 5 views
3

나는 c, C++ 또는 java에서 빠른 svd 라이브러리를 찾고 있습니다. 궁극적으로 저는 Java를 사용하고 있지만, C++을 감싸기 위해 jna를 사용하는 것이 매우 편합니다. 예 : http://github.com/hughperkins/jeigen빠른 정확한 스파 스 svd 라이브러리?

저는 희소 행렬을 처리 할 빠른 svd 라이브러리를 찾고 있습니다. 질문이 너무 주관적으로 표시되지 않도록,이 목표를 유지하기 위해,이 가정 해 봅시다 :

나는 몇 도서관에서 주위를 둘러 보았다 발견 :

  • MATLAB : 슈퍼 빠른, 약 10 초 만, 정말 같은 '라이브러리'이 아니다. 평균 제곱 투영 오류 : 0.93
  • redsvd : 6 개의 피쳐에 대해 초고속, 약 1 초 실행 가능하지만 평균 제곱 투영 오류는 0.97이며 매우 높습니다.
  • Eigen의 svd는 매우 느리고 조밀 한 모체
  • svdlibc : 멈추기 전에 28 분 동안 뛰었습니다. 나는 처음 6 개의 특징이 아닌 전체 S를 계산하고 있다고 생각한다.

기본적으로, 나는 대략 동일한 속도와 평균 제곱근 오차를 제공하는 라이브러리를 찾고있다. 다소 비교할 만하다.

+0

어떤 알고리즘을 찾고 계십니까? [무작위 PCA] (http://scikit-learn.org/stable/modules/decomposition.html) (C++/java가 아니지만 올바른 알고리즘이라고 생각합니다.) 20 개의 뉴스 그룹 x 10k 기능, 6 PC ->'7.0 초 pca explain_variance_ratio_79.062 .044 .039 .031 .03'. – denis

+0

나는 Eigen의 SVD가 너무 느리다는 것에 놀랐다. 나는 이것을 위해 Eigen을 사용한 적이 없다. 마지막으로이 질문을 한 이후로 개선 되었습니까? –

+0

BTW, [언제 JEigen의 스파 스 솔버를 구현할 예정입니까?] (https://stackoverflow.com/questions/17046585/cholmod-in-java/30526005#30526005)? –

답변

2

내 경험에 비추어 볼 때 svdlibc는 이러한 옵션 중 최고의 라이브러리입니다. 이전에 코드를 조금 훑어 보았습니다. 전체 S 행렬 (즉, 실제 "얇은 svd")을 계산하지 않는다고 생각합니다. 디스크에서 행렬 표현을 제어 할 수있는 경우, svdlibc는 I/O 오버 헤드가 현저하게 낮기 때문에 스파 스 바이너리 입력 형식을 사용할 때 훨씬 빠르게 수행됩니다.

S-Space 패키지는 SVDLIBJ의 SVDLIBJ Java 포트 주위에 executable jar을 제공합니다. 그러나 특정 입력 솔루션에 대해 SVDLIBC와는 다른 결과가 있음을 발견했습니다.

+0

확인. 전체 행렬을 계산하는 대신 처음 6 가지 기능 만 반환하도록 명령 줄 버전을 요청할 수있는 방법을 알고 계십니까? –