So sánh và đánh giá các mô hình

Một phần của tài liệu THUẬT TOÁN xếp HẠNG địa điểm TRONG các ỨNG DỤNG DỊCH vụ dựa TRÊN địa điểm (LBS) có CHÚ ý tới đặc điểm RIÊNG NGƯỜI DÙNG (Trang 64 - 74)

Từ bảng kết quả phía trên sau khi thử nghiệm các mô hình xếp hạng, tôi có một vài nhận xét về các mô hình như sau:

 Mô hình Rating Inference tốt hơn mô hình ICF và Mô hình TCF trong bộ dữ liệu mà tôi sử dụng.

 Mô hình FP-Growth đã không đánh giá được kết quả khi sử dụng với bộ dữ liệu này. Có thể do tập dữ liệu sử dụng chưa có đủ mẫu cần thiết để đưa ra các cặp item thường xuyên đi cùng với nhau.

65

Ngoài kết qua đạt được từ các mô hình trên, tôi sẽ trình bày những ưu điểm và nhược điểm của các mô hình trên, cũng như cách khắc phục vấn đề hay gặp phải.

Ưu điểm:

 Xếp hạng các địa điểm theo đúng sở thích của người dùng (sử dụng các thông tin về cây sở thích của người dùng).

 Mô hình Rating Inference có tính tới sở thích của người dùng và tính tới các thông tin toàn thể (thông tin về thể loại địa điểm, thông tin về các chuyên gia địa phương).

 Có khả năng thực hiện trực tuyến.

 Kết quả tốt trên tập dữ liệu thử nghiệm (Trừ mô hình FP-Growth Model).

Nhược điểm:

Ở những phương pháp trên đều gặp phải hiện tương cold-start. Đây là một hiện tượng xảy ra khi có một người dùng mới tham gia vào hệ thống. Từ đó các hệ thống xếp hạng khó có thể đưa ra được gợi ý các địa điểm cho những người dùng mới này. Để khắc phục vấn đề cold-start chúng ta có thể sử dụng một số mô hình khác như mô hình dựa trên địa lý. Người dùng thường có xu hướng đi tới những vị trí gần nơi họ sống, làm việc vì thế chiến lược gợi ý cho những người dùng mới có thể đưa ra nhưng vị trí gần với người dùng.

Trên thực tế, các hệ thống địa điểm có thể đưa ra một số chiến lược xếp hạng các địa điểm theo một số chiến lược sau: tỷ lệ xem nhiều, tỷ lệ người check-in nhiều… Từ đó dựa trên phản hồi từ phía người dùng, các hệ thống xếp hạng sẽ huấn luyện và đưa ra các gợi ý phù hợp hơn dựa trên những đặc điểm của người dùng.

66

Chương 5: Kết luận và hướng phát triển

5.1Kết luận

Trong luận văn này, các kết quả đã đạt được những mục tiêu đề ra của đề tài:  Luận văn đã tìm hiểu chung được các dịch vụ mạng xã hội dựa trên địa điểm  Luận văn đã tìm hiểu được một số hệ thống xếp hạng của các hệ thống thực trên

thế giới

 Luân văn có giới thiệu kỹ thuật khai phá sở thích của người dùng

 Trong luận văn này có tìm hiểu một số mô hình xếp hạng đại điểm cho từng cá nhân người dùng.

 Luận văn cũng đã cài đặt và đánh giá một số mô hình được đề xuất trong báo cáo

5.2Hướng phát triển tiếp theo

Trong quá trình tìm hiểu, tôi nhận thấy với các bài toán gợi ý thì chúng ta thường xuyên phải gặp vẫn đề cold-start. Đó là vấn đề xếp hạng và gợi ý địa điểm cho một người dùng hoàn toàn mới.

Để khắc phục được những vấn đề đó, tiếp theo tôi đưa ra hướng phát triển để cải thiện được các vấn đề này, cũng như cải thiện độ chính xác cho các mô hình xếp hạng các địa điểm tốt hơn.

 Sử dụng mô hình về địa lý

 Kết hợp phân tích nội dung tips cho từng địa điểm: Phân tích quan điểm của người dùng tới địa điểm (tốt, xấu).

 Nghiên cứu và kết hợp các mô hình lại với nhau. Đánh giá các mô hình khi sử dụng cùng nhau

67

Tài liệu tham khảo

[1] Jie Bao, Yu Zheng and Mohamed F. Mokbel. "Location-based and Preference-Aware Recommendation Using Sparse Geo-Social Networking Data". In ACM SIGSPATIAL (GIS 2012), Redondo Beach, CA, US, 2012

[2] Ling-Yin Wei,Yu Zheng, Wen-Chih Peng. "Constructing Popular Routes from Uncertain Trajectories". In 18th SIGKDD conference on Knowledge Discovery and Data Mining (KDD 2012).

[3] Entropy thông tin https://vi.wikipedia.org/wiki/Entropy_th%C3%B4ng_tin

[4] J. Cranshaw, E. Toch, J. Hong, A. Kittur, and N. Sadeh. Bridging the gap between physical location and online social networks. In Ubicomp, pages 119–128. ACM, 2010. [5] Yiying Cheng, Yangru Fang, Yongqing Yuan. Recommendation System for Location-Based Social Network CS224W Project Report

[6] A Twitter Analog to PageRank http://thenoisychannel.com/2009/01/13/a-twitter- analog-to-pag

[7] HITS Algorithm – Hubs and Authorities on the Internet

http://www.math.cornell.edu/~mec/Winter2009/RalucaRemus/Lecture4/lecture4.html [8] Mining Frequent Patterns without Candidate Generation: A Frequent-Pattern Tree Approach∗. JIAWEI HAN, JIAN PEI†

[9] Y. Zheng, L. Zhang, X. Xie, and W.Y. Ma. Mining interesting locations and travel sequences from gps trajectories. In WWW, pages 791–800. ACM, 2009.

[10] Hoàng Ngọc Sinh – Hệ thống gợi ý bản nhạc, đồ án tốt nghiệp 2012 [11] Jei Bao – Microsoft http://research.microsoft.com/en-us/people/jiebao/ [12] Tháp nhu cầu của Maslow

https://vi.wikipedia.org/wiki/Th%C3%A1p_nhu_c%E1%BA%A7u_c%E1%BB%A7a_ Maslow

[13] Facebook news feed algorithm guide http://sproutsocial.com/insights/facebook- news-feed-algorithm-guide/

68

[15] Mạng xã hội dựa trên địa điểm Foursquare http://foursquare.com/ [16] Mạng xã hội tiểu blog Twitter http://twitter.com/

[17] Mạng xã hội Facebook http://facebook.com/ [18] Thư viện MLLib http://spark.apache.org/mllib/

69

Phụ Lục

Trong phần này, tôi sẽ giới thiệu mã nguồn cài đặt các mô hình mà tôi sử dụng. Do mã nguồn rất lớn, nên trong phần này tôi sẽ trình bày mã nguồn của phương thức chính trong các mô hình.

Mã nguồn mô hình ICF

Phương thức bên dưới sẽ dựa trên dữ liệu đã được tiền xử lý và tính toán trước đó để đưa ra danh sách k vị trí có điểm cao nhất đối với người dùng.

/**

* Get top k venueid for userid * @param userid * @param listOfUsers * @param listOfVenues * @param k * @param mapOfVenueUser * @param mapOfSimilarityScore * @return top k venues and score

*/

public List<Map.Entry<String, Double>> topKVenuesICFModel(int userid, List<Integer> listOfUsers,

List<String> listOfVenues, int k, Map<Integer, Map<String, Integer>> mapOfVenueUser,

Map<String, Double> mapOfSimilarityScore) { Map<String, Double> rankVenues = new HashMap<>();

for (String venueid : listOfVenues) {

double totalVisitScore = 0;

double totalSimilarityScore = 0;

for (Integer other_userid : listOfUsers) {

if (other_userid != userid) {

Map<String, Integer> freqVenuesOther = mapOfVenueUser.get(other_userid);

int c = 0;

if (freqVenuesOther.containsKey(venueid)) { c = 1;

}

String key = userid + "\t" + other_userid; totalVisitScore = totalVisitScore + mapOfSimilarityScore.get(key) * c; totalSimilarityScore = totalSimilarityScore + mapOfSimilarityScore.get(key); } } double final_score = 0;

70

if (totalSimilarityScore != 0) {

final_score = totalVisitScore / totalSimilarityScore; }

rankVenues.put(venueid, final_score); }

List<Map.Entry<String, Double>> list = SortUtils.sortByComparator(rankVenues);

List<Map.Entry<String, Double>> topItems = FluentIterable.from(list).limit(k).toList();

return topItems; }

Mã nguồn mô hình TCF

Phương thức bên dưới sẽ dựa trên dữ liệu đã được tiền xử lý và tính toán trước đó để đưa ra danh sách k vị trí có điểm cao nhất đối với người dùng.

/**

* top K venues of userid in TCF Model * @param userid * @param k * @param listUnVisit * @param invertedUserOfVenues * @param friendsOfUser * @param venuesVisitOfUser * @return top k venues and score

*/

public List<Map.Entry<String, Double>> topKVenuesTCFModel(int userid, int k, List<String> listUnVisit,

Map<String, Set<Integer>> invertedUserOfVenues, Map<Integer, List<Integer>> friendsOfUser,

Map<Integer, List<String>> venuesVisitOfUser) { Map<String, Double> scoreOfVenues = new HashMap<>(); // get list friends of user

List<Integer> listFriends = friendsOfUser.get(userid); // calculating score of userid for each venueid

for (String venueid : listUnVisit) {

double totalClosenessScore = 0;

double totalVisitScore = 0;

Set<Integer> listVisitor = invertedUserOfVenues.get(venueid);

if (listVisitor != null) {

for (Integer friendid : listFriends) { // closeness

71

double score =

ClosenessScore.getClosenessScore(userid, friendid, friendsOfUser, venuesVisitOfUser);

totalClosenessScore = totalClosenessScore + score;

int c = 0; if (listVisitor != null) { if (listVisitor.contains(friendid)) { c = 1; } }

double visit_score = score * c;

totalVisitScore = totalVisitScore + visit_score; } } if (totalClosenessScore != 0) { scoreOfVenues.put(venueid, totalVisitScore / totalClosenessScore); } }

// get k venues by score

List<Map.Entry<String, Double>> list = SortUtils.sortByComparator(scoreOfVenues);

List<Map.Entry<String, Double>> topItems = FluentIterable.from(list).limit(k).toList();

return topItems; }

Mã nguồn hình Rating Inference

Trong phần này, tôi sẽ giới thiệu hai mã nguồn về tính điểm sở thích của người dùng trên cây phân cấp thể loại và suy diễn đánh giá của người dùng đối với các địa điểm tiềm năng.

 Xây dựng cây phân cấp sở thích của người dùng

/**

* khai phá sở thích của người dùng *

* @param userid * @return

72

public Map<String, Double> calculateWCHScore(int userid) { Map<String, Double> wch = new HashMap<String, Double>();

Map<String, Integer> totalVisitsOfUC = totalVisitOfUserForCategory .get(userid);

for (String categoryid : totalVisitsOfUC.keySet()) { // tỉnh số lượng thăm category này của userid

int freq_visit = totalVisitsOfUC.get(categoryid); // tính tổng số visit của category

int total_visit = mapOfTips.get(userid).size();

double tf = freq_visit * 1.0 / total_visit;

int totalUser = mapOfTips.keySet().size();

int totalVisitorOfCategory = totalUniqueVisitorOfCategory.get( categoryid).size();

double df = totalUser / totalVisitorOfCategory;

double tfidf = tf * Math.log(df); wch.put(categoryid, tfidf); }

return wch; }

 Suy diễn đánh giá của người dùng với các địa điểm tiềm năng

/**

* Suy diễn đánh giá các địa điểm cho người dùng * @param userid

* @param listLocalExperts * @param listCandidateVenues * @return

*/

public Map<String, Double> inferRating(int userid, List<Integer> listLocalExperts, List<String> listCandidateVenues) {

Map<String, Double> listRankings = new HashMap<>();

for (String venueid : listCandidateVenues) { double rating = 0;

for (Integer localExpertId : listLocalExperts) {

double sim = cosineSimilarity.similarityWch(userid, localExpertId);

73

Map<String, Integer> venuesOfUsers = mapOfVenueUser.get(localExpertId);

if (venuesOfUsers.containsKey(venueid)) { freq = venuesOfUsers.get(venueid);

}

rating += (sim * freq); }

listRankings.put(venueid, rating); }

return listRankings; }

Mã nguồn Mô hình FP-Growth

Khi thực hiện mô hình này, tôi đã thực hiện việc chuẩn hóa dữ liệu theo đúng chuẩn để có thể sử dụng được thuật toán FP-Growth trong thư viện MLLib.

SparkConf sparkConf = new SparkConf().setAppName("FP Growth"); String master = args[0];

String hdfs_path = args[1];

double minSupport = Double.parseDouble(args[2]);

// list path from text

JavaSparkContext sc = new JavaSparkContext(master, "FPGrowth",sparkConf); JavaRDD<String> trans = sc.textFile(hdfs_path);

JavaRDD<List<String>> transactions = trans.map(new Function<String, List<String>>() {

public List<String> call(String s) throws Exception {

// TODO Auto-generated method stub

String[] splits = s.split("\t");

String[] sarray = splits[1].split(" ");

return Arrays.asList(sarray); }

});

// calculating frequency items

FPGrowth fpg = new FPGrowth().setMinSupport(minSupport).setNumPartitions(10); FPGrowthModel<String> model = fpg.run(transactions);

for (FPGrowth.FreqItemset<String> s : model.freqItemsets().toJavaRDD().collect()) {

if (s.freq() >= 2) {

74

System.out.println("[" + Joiner.on(",").join(s.javaItems()) + "], " + s.freq());

} }

Một phần của tài liệu THUẬT TOÁN xếp HẠNG địa điểm TRONG các ỨNG DỤNG DỊCH vụ dựa TRÊN địa điểm (LBS) có CHÚ ý tới đặc điểm RIÊNG NGƯỜI DÙNG (Trang 64 - 74)

Tải bản đầy đủ (PDF)

(74 trang)