달력

09

« 2018/09 »

  •  
  •  
  •  
  •  
  •  
  •  
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  •  
  •  
  •  
  •  
  •  
  •  

User Based Recommender는 크게 3가지 절차로 이루어진다.  1) 원시 데이터를 읽어 들이고, 2) 데이터로 부터 상관관계(유사성)을 계산하고, 3) 어떤 조건에 맞는 추천을 계산한다. 이때 가장 중요한건 2)번으로 두말할것도 없이 내부적으로 특정 알고리즘이 구현되어 있을 것이다.

아무것도 몰라도 테스트는 할수 있다. 아래와 같이 테스트코드를 작성한다. 데이터 소스는 특별히 구할 길이 없어, GroupLens Research에서 제공하는 데이터를 약간 가공 하였다. 소스코드에 순서별로 주석을 읽어보면 대략 짐작할수 있을 것이다.

	@Test
	public void user() throws  TasteException{
		
		// 1) 원시 데이터를 읽음
		DataModel dataModel = new FileDataModel(new File("C:/Users/yunsunghan/Desktop/data_ml.txt"));
		long userId = 303L;
		
		// 2) 유사성 상관관계 분석
		UserSimilarity userSimilarity = new PearsonCorrelationSimilarity(dataModel);
		// 2.1) 선호도 추론
		userSimilarity.setPreferenceInferrer(new AveragingPreferenceInferrer(dataModel));
		// 2.2) 선호도 기준으로 3명의 이웃 추출
		UserNeighborhood neighberhood = new NearestNUserNeighborhood(3, userSimilarity, dataModel);
		
		// 유사 이웃 출력!!!
		long[] users = neighberhood.getUserNeighborhood(userId);
		System.out.println("===========================================");
		System.out.println(userId + "님과 가까운 이웃 3명은?");
		System.out.println("-------------------------------------------");
		for(int i=0; i < users.length; i++){
			System.out.println("가까운 이웃 :"+users[i]);
		}
		System.out.println("-------------------------------------------");
		System.out.println();
		
		
		// 3) 사용자 기준의 추천
		Recommender recommender = new GenericUserBasedRecommender(dataModel,neighberhood, userSimilarity);
		// 3.1) 캐시에 넣고
		Recommender cachingRecommender = new CachingRecommender(recommender);
		// 3.2) 특정 사용자 기준의 추천 아이템 추출
		List recommendations = cachingRecommender.recommend(userId, 7);
		
		// 추천 아이템 출력!!!
		System.out.println("==========================================");
		System.out.println(userId + "님이 추천하는 상품 베스트 7 [User-based]");
		System.out.println("-------------------------------------------");
		int count = 1;
		for(RecommendedItem item : recommendations){
			System.out.println(count + ") 추천 상품 : " + item.getItemID() +" \t 추천 지수 : "+ item.getValue());
			count++;
		}
		System.out.println("-------------------------------------------");
		Assert.assertEquals(7, recommendations.size());
	}


실행결과는 아래와 같다.

===========================================
35님과 가까운 이웃 3명은?
-------------------------------------------
가까운 이웃 :4
가까운 이웃 :853
가까운 이웃 :510
-------------------------------------------

==========================================
35님이 추천하는 상품 베스트 7 (row data 100,000)
-------------------------------------------
1) 추천 상품 : 292   추천 지수 : 4.0
2) 추천 상품 : 288   추천 지수 : 3.695456
3) 추천 상품 : 299   추천 지수 : 3.528888
4) 추천 상품 : 271   추천 지수 : 3.5083911
5) 추천 상품 : 323   추천 지수 : 3.471112
6) 추천 상품 : 294   추천 지수 : 3.365235
7) 추천 상품 : 324   추천 지수 : 3.148972
-------------------------------------------



사용된 데이터 소스를 첨부한다. 이후, Item-based 와 Slop-One Recommender도 테스트할때 사용할 것이다.


Posted by summerwars


티스토리 툴바