행과 열을 반복하여 행렬에 대한 계산을 수행하는 코드 조각이 있습니다. 수행 된 미적분은 코사인 거리 측정 값이며 인터넷에서 찾은 코드가 있습니다 (지금 링크를 검색 할 수 없음).이 코드의 속도를 높이는 방법은 무엇입니까? 행렬의 행과 열을 반복하는 미적분
10,000 개의 행과 열이있을 수 있습니다. 행렬은 대칭이므로 절반 만 반복하면됩니다. 값은 실수입니다.
문제 : 매우 느립니다 (3-6 시간 소요). 누구든지 개선 사항을 가르쳐 줄 수 있습니까? 고마워!
코드에 대한 참고 사항 : 유연성을 위해 추상 클래스를 사용합니다. 이렇게하면 별도 클래스에 정의 된 코사인 계산을 다른 클래스로 쉽게 대체 할 수 있습니다.
코드 :
이import Jama.Matrix;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.concurrent.ExecutionException;
public abstract class AbstractSimilarity {
HashSet<Triple<Double, Integer, Integer>> set = new HashSet();
public ArrayList<Thread> listThreads = new ArrayList();
public void transform(Matrix matrixToBeTransformed) throws InterruptedException,
ExecutionException {
int numDocs = termDocumentMatrix.getColumnDimension();
Main.similarityMatrix = new Matrix(numDocs, numDocs);
System.out.println("size of the matrix: " + numDocs + "x " + numDocs);
//1. iteration through all rows of the matrixToBeTransformed
for (int i = numDocs - 1; i >0 ; i--) {
System.out.println("matrix treatment... " + ((float) i/(float) numDocs * 100) + "%");
//2. isolates the row i of this matrixToBeTransformed
Matrix sourceDocMatrix = matrixToBeTransformed.getMatrix(
0, matrixToBeTransformed.getRowDimension() - 1, i, i);
// 3. Iterates through all columns of the matrixToBeTransformed
// for (int j = 0; j < numDocs; j++) {
// if (j < i) {
//
// //4. isolates the column j of this matrixToBeTransformed
// Matrix targetDocMatrix = matrixToBeTransformed.getMatrix(
// 0, matrixToBeTransformed.getRowDimension() - 1, j, j);
//5. computes the similarity between this given row and this given column and writes it in a resultMatrix
// Main.resultMatrix.set(i, j, computeSimilarity(sourceDocMatrix, targetDocMatrix));
// } else {
// Main.resultMatrix.set(i, j, 0);
// }
//
// }
}
가 계산을 정의하는 클래스가 수행 할이 :
import Jama.Matrix;
public class CosineSimilarity extends AbstractSimilarity{
@Override
protected double computeSimilarity(Matrix sourceDoc, Matrix targetDoc) {
double dotProduct = sourceDoc.arrayTimes(targetDoc).norm1();
double eucledianDist = sourceDoc.normF() * targetDoc.normF();
return dotProduct/eucledianDist;
}
}
숙제 프로젝트입니까? MatLab과 같은 수학 소프트웨어를 사용할 수 없습니까? –
이것은 학계에서 전문적인 프로젝트이며 자바를 사용해야합니다. 자신의 제한에 대한 저의 두려움이 두렵습니다! – seinecle
알고리즘의 어느 부분이 가장 오래 걸리는지 프로파일 링 해 보셨습니까? 연산의 시작/끝 부분에'new Date(). getTime();'을 추가하면 빼기 만하면 좋은 통찰력을 얻을 수 있습니다. – Marcelo