달력

12

« 2018/12 »

  •  
  •  
  •  
  •  
  •  
  •  
  • 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
  • 31
  •  
  •  
  •  
  •  
  •  
User-based Recommender와 테스트는 같으며, 단지 사용한 ItemSimilarity, GenericItemBasedRecommender 메서드만 다르다.
Fixture Code
	@Before
	public void fixture() throws IOException {
		// row data 100,000
		dataModel = new FileDataModel(new File("C:/Users/yunsunghan/Desktop/data_ml.txt"));
		userId = 303L;
	}

Test Code
	@Test
	public void item() throws IOException, TasteException{
		
		// 1) 원시 데이터를 읽음
		// fixture
		
		// 2) 유사성 상관관계 분석
		ItemSimilarity itemSimilarity = new PearsonCorrelationSimilarity(dataModel); // 너무 느리다.
		// 야생에서는 유사성을 미리 계산해 놓은 형태를 많이 쓴다. 그것이 GenericItemSimilarity 이다.
		// 미리 계산하는 구조는 아래와 같다.
//		List similarities = new ArrayList(4);
//		similarities.add(new GenericItemSimilarity.ItemItemSimilarity(1417, 440, 0.9));
//		similarities.add(new GenericItemSimilarity.ItemItemSimilarity(440, 1128, 0.7));
//		similarities.add(new GenericItemSimilarity.ItemItemSimilarity(1128, 1351, 0.5));
//		similarities.add(new GenericItemSimilarity.ItemItemSimilarity(1351, 1413, 0.3));
//		ItemSimilarity itemSimilarity = new GenericItemSimilarity(similarities);
//		// 유사도 출력!!!
//		System.out.println("===========================================");
//		System.out.println("Similarity");
//		System.out.println("-------------------------------------------");
//		System.out.println(itemSimilarity.itemSimilarity(1417, 440));
//		System.out.println(itemSimilarity.itemSimilarity(440, 1128));
//		System.out.println(itemSimilarity.itemSimilarity(1128, 1351));
//		System.out.println(itemSimilarity.itemSimilarity(1351, 1413));
//		System.out.println("-------------------------------------------");
//		System.out.println();

		// 3) 사용자 기준의 추천
		Recommender recommender = new GenericItemBasedRecommender(dataModel, itemSimilarity);
		// 3.1) 캐시에 넣고
		Recommender cachingRecommender = new CachingRecommender(recommender);
		// 3.2) 특정 사용자 기준의 추천 아이템 추출
		List recommendations = cachingRecommender.recommend(userId, 7);
		
		// 추천 아이템 출력!!!
		System.out.println("==========================================");
		System.out.println(userId + "님이 추천하는 상품 베스트 7 [Item-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());
	}

테스트 결과
==========================================
303님이 추천하는 상품 베스트 7 [Item-based]
-------------------------------------------
1) 추천 상품 : 1417   추천 지수 : 2.70215978E16
2) 추천 상품 : 440   추천 지수 : 53.677456
3) 추천 상품 : 1128   추천 지수 : 29.359428
4) 추천 상품 : 1351   추천 지수 : 17.797129
5) 추천 상품 : 1413   추천 지수 : 14.551755
6) 추천 상품 : 863   추천 지수 : 14.285224
7) 추천 상품 : 1170   추천 지수 : 12.785092
-------------------------------------------

==========================================
303님이 추천하는 상품 베스트 7 [Slope-One]
-------------------------------------------
1) 추천 상품 : 1500   추천 지수 : 5.8740354
2) 추천 상품 : 1449   추천 지수 : 5.4110007
3) 추천 상품 : 1398   추천 지수 : 5.388581
4) 추천 상품 : 1467   추천 지수 : 5.356462
5) 추천 상품 : 1642   추천 지수 : 5.2709184
6) 추천 상품 : 1367   추천 지수 : 5.123192
7) 추천 상품 : 1064   추천 지수 : 5.115589
-------------------------------------------

Slope-One Recommender도 크게 다르지 않다.

이쯤되면, 어떻게 User-baesed와 Item-based는 각각 Item에 대해서 또 User에 대해서, 위와 같은 추천지수와 유사지수를 구해 냈을까 궁금하지 않을수 없다. 도대체 무슨 근거로..., 단순히 산술평균은 아니다. 그럼 어떤 보이지 않은 것이 안에 숨어 있을까? 이것이 다음에 정리할 알고리즘을 봐야 할 이유다.
Posted by summerwars