달력

12

« 2017/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는 크게 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
2010.08.18 16:45

Apache Mahout 관련 링크 Mahout2010.08.18 16:45

1) Apache Mahout 홈페이지 : http://mahout.apache.org
2) Apache Mahout 구현 알고리즘 : https://cwiki.apache.org/confluence/display/MAHOUT/Algorithms
3) Apache Mahout - Taste Project : http://mahout.apache.org/taste.html (Document PDF버전 다운로드)
4) PT : http://www.slideshare.net/robinanil/oscon-apache-mahout-mammoth-scale-machine-learning
신고
TAG Mahout, taste
Posted by summerwars
2010.08.13 17:54

Apache Mahout Taste-Web 설치하기 Mahout2010.08.13 17:54


이전글에서 했던 환경을 그대로 이용해서, 가상의 데이터를 넣고 추천 테스트를 해보자. 원문 참조는 https://mahout.apache.org/taste.html 에서 볼수 있다.

1. 먼저 사용할 가상의 데이터가 필요한데, 여기 http://www.grouplens.org/node/73 에서 받는다. 원하는 크기를 받아서 하면되는데, 나는 1M Ratings Data Set (.tar.gz) 를 다운 받았다.

2. 압축을 풀면, movies.dat, ratings.dat, users.dat 파일이 있다. 모두 복사해서, /trunk/examples/src/main/java/org/apache/mahout/cf/taste/example/grouplens 에붙여 넣는다. (아마, java 소스가 이미 있을 것이다.)

3. trunk 폴더로 이동후 'mvn install' 명령을 실행한다. 


4. 빌드가 성공하면, cd taste-web 이동후, cp ../examples/target/grouplens.jar ./lib 으로 복사한다.

5. 설정파일인, recommender.properties에 방금 생성한 Recommender를 마지막 라인에 추가한다.(만약 지난번에 주석을 풀었다면, 그대로 둔다)

recommender.class=org.apache.mahout.cf.taste.example.grouplens.GroupLensRecommender

6. 현재 폴더인 /trunk/taste-web 에서 패키징 한다. 'mvn package' 빌드가 성공되면 war 파일이 생성된다.

7. 현재 디랙토리에서, war 파일을 실행한다. 'mvn jetty:run-war' 또는 'mvn tomcat:run-war' 으로 실행한다. 성공적으로 실행되었다면, 브라우저에서 http://localhost:8080/mahout-taste-webapp/RecommenderServlet?userID=1&debug=true 를 접근해 본다.


userID 값을 바꿔가며, 확인할수 있다.

9. Next?
아마도 여기까지 했으면, Mahout 환경을 설정하고, 예제를 돌리는 정도로 끝났다. 앞으로 봐야 할것은 본 예제에서 사용된 Recommender는 무엇이 있으며(User-based Recommender, Item-based Recommender, Slope-One Recommender), 사용된 알고리즘은 어떤 것이고, 또 그 알고리즘이 얼마나 우수한 것인지, 더 낳은것은 없는지, 또는 다른 알고리즘은 없는지, 어떤 환경에 어떤것이 더 적합한지, 관련 알고리즘엔 무엇이 있는지 등이 궁굼해 질것이다. 그리고 왜 이따위들이 필요한지도...

문서에 나온 소스를 보니, 알고리즘 이해 없이도 쓸수 있겠끔 잘 만들어진것 같다. 어떤 예측이나 통계적 결과는 적절한 Data 와 적합도를 위한 기준변수 산출이 중요한데, 생각보다 잘 작성되어 진것 같다. 물론 실무에 적용하려면, 이런 여러가지 환경적인 변수를 여러번 테스트해야만 하겠지만, 본 소스는 참조가 많이 될듯...:)

신고
Posted by summerwars


티스토리 툴바