Mahout의 사전 컴파일 된 항목 항목 유사성에 성능 문제가 있습니다.Mahout precomputed 항목 유사성 - 권장 사항이 낮음
약 400 만 명의 사용자가 거의 같은 양의 항목을 가지고 있으며 약 100M 개의 사용자 항목 환경 설정이 있습니다. 나는 문서의 TF-IDF 벡터의 코사인 유사성을 기반으로 콘텐츠 기반 추천을하고 싶다.
- 내가 TF-IDF 벡터를 생성
seq2sparse
사용 : 즉시이를 계산하면 느리므로 다음 는, I는 최고 50 가장 유사한 문서의 페어 유사도를 미리 계산. - 는 I 내가이 모든 사전 계산 하둡 사용 상위 50 가장 유사한 문서
생산 부리는 rowSimilarity -i INPUT/matrix -o OUTPUT -r 4587604 --similarityClassname SIMILARITY_COSINE -m 50 -ess
사용 부리는 행렬을
mahout rowId
사용. 4 백만 품목의 경우 출력은 2.5GB에 불과했습니다. 그런 다음 문서의 ID를 디코딩하기 위해 docIndex
을 사용하여 축소판에서 생성 한 파일의 내용을 Collection<GenericItemSimilarity.ItemItemSimilarity> corrMatrix = ...
에로드했습니다. 그것들은 이미 정수 였지만, rowId는 1부터 시작하여 디코드했습니다. 그래서 그것을 되 찾아야합니다.
는 추천을 위해 나는 다음 코드를 사용합니다
ItemSimilarity similarity = new GenericItemSimilarity(correlationMatrix);
CandidateItemsStrategy candidateItemsStrategy = new SamplingCandidateItemsStrategy(1, 1, 1, model.getNumUsers(), model.getNumItems());
MostSimilarItemsCandidateItemsStrategy mostSimilarItemsCandidateItemsStrategy = new SamplingCandidateItemsStrategy(1, 1, 1, model.getNumUsers(), model.getNumItems());
Recommender recommender = new GenericItemBasedRecommender(model, similarity, candidateItemsStrategy, mostSimilarItemsCandidateItemsStrategy);
내가 제한된 데이터 모델 (1.6M 항목)와 함께 노력하고 있어요,하지만 나는 메모리에있는 모든 항목을 항목 페어의 유사성을로드. 필자는 40GB를 사용하여 메인 메모리에 모든 것을로드 할 수 있습니다.
내가 추천 과정에 대한 하나의 사용자
Recommender cachingRecommender = new CachingRecommender(recommender);
List<RecommendedItem> recommendations = cachingRecommender.recommend(userID, howMany);
경과 시간을 위해 추천하고 싶은
는554.938583083
초이며, 어떤 권고를 생성하지 않았다 이외. 지금 나는 권고의 수행에 정말로 관심이있다. 내가 CandidateItemsStrategy
과 MostSimilarItemsCandidateItemsStrategy
의 숫자로 연주했지만 성능이 향상되지 않았습니다. 모든 것을 사전 계산한다는 생각은 권장 프로세스를 가속화한다고 생각하지 않습니까? 누군가 나를 도우 려하고 내가 잘못하고있는 부분과 잘못된 부분을 말해 줄 수 있습니까? 또한 주 메모리에서 병렬 적 유사성을로드하는 것이 기하 급수적으로 폭발하는 이유는 무엇입니까? Collection<GenericItemSimilarity.ItemItemSimilarity>
매트릭스에 40GB의 주 메모리에 2.5GB의 파일이로드되었습니다. 파일이 IntWritable
, VectorWritable
hashMap 키 - 값을 사용하여 일련 번호가 지정되어 있고 키가 ItemItemSimilarity
행렬의 모든 벡터 값에 대해 반복되어야한다는 것을 알고 있습니다. 그러나 이것은 너무 많지 않습니까?
미리 감사드립니다.