문제 설정
2D로 시각화하려고하는 높은 차원 (4096)의 데이터 포인트 (이미지)가 있습니다. 이를 위해 Karpathy의 다음 예제 코드 와 비슷한 방식으로 t-sne을 사용하고 있습니다.
scikit 배우기 문서는 먼저 데이터의 차원을 낮추기 위해 PCA를 사용하는 것이 좋습니다 :
피처 수가 매우 많은 경우 차원 수를 적당한 양 (예 : 50)으로 줄이려면 다른 차원 축소 방법 (예 : 밀도가 높은 데이터의 경우 PCA 또는 TruncatedSVD)을 사용하는 것이 좋습니다.
Javas에서 PCA를 수행하기 위해 Darks.Liu 의이 코드를 사용하고 있습니다.
//C=X*X^t / m
DoubleMatrix covMatrix = source.mmul(source.transpose()).div(source.columns);
ComplexDoubleMatrix eigVal = Eigen.eigenvalues(covMatrix);
ComplexDoubleMatrix[] eigVectorsVal = Eigen.eigenvectors(covMatrix);
ComplexDoubleMatrix eigVectors = eigVectorsVal[0];
//Sort sigen vector from big to small by eigen values
List<PCABean> beans = new ArrayList<PCA.PCABean>();
for (int i = 0; i < eigVectors.columns; i++) {
beans.add(new PCABean(eigVal.get(i).real(), eigVectors.getColumn(i)));
}
Collections.sort(beans);
DoubleMatrix newVec = new DoubleMatrix(dimension, beans.get(0).vector.rows);
for (int i = 0; i < dimension; i++) {
ComplexDoubleMatrix dm = beans.get(i).vector;
DoubleMatrix real = dm.getReal();
newVec.putRow(i, real);
}
return newVec.mmul(source);
선형 대수 연산에 jblas 를 사용 하는데 , 내가 읽은 것 중 가장 빠른 옵션이 될 것입니다. 그러나 고유 벡터와 고유 값 (3,4 행)을 계산하면 병목 현상이 발생합니다 (~ 10 분,이 단계에서 감당할 수있는 시간보다 훨씬 깁니다).
Kernel PCA에 대해 읽었습니다. 커널 PCA는 차원이 매우 큰 경우에 적합하지만 런타임은 차원 과 예제 수가 많은 경우를 다루고 싶기 때문에 문제가 될 수 있습니다 .
내가 알듯이 내 옵션은 PCA를 "최적화"하거나 본질적으로 더 빠른 다른 차원 축소 방법을 선택하는 것입니다.
내 질문
- PCA가 "오프라인"방식으로 사용될 수 있다는 희망이 있습니까? 즉, 큰 데이터 세트의 이미지를 사용하여 이미지에 대해 PCA를 수행 한 다음 계산 된 주요 구성 요소를 사용하여 다른 (새로운!) 데이터 포인트 의 차원을 줄 입니까?
- 예를 들어 상위 100 대 구성 요소에만 관심이 있다는 것을 미리 알고 있다고 가정하면 고유 벡터 계산 속도를 높일 수 있습니까?
- 내 경우에 (즉, t-sne을 적용하기 전에) PCA보다 더 빠른 대안적인 차원 축소 방법이 있습니까? Java로 쉽게 구현할 수있는 것을 찾고 있습니다.