基于地點(diǎn)相似度的POI推薦以及路徑重組【matlab】

這里設(shè)計(jì)的POI推薦算法是參考于POI推薦算法,簡(jiǎn)單來說,就是利用用戶訪問POI的頻次作為POI之間相似度的測(cè)度。
具體描述以及代碼展示如下:
數(shù)據(jù)預(yù)處理
隨機(jī)抽取若干行數(shù)據(jù)
首先我們要進(jìn)行數(shù)據(jù)清洗,我們將456967行數(shù)據(jù),10000多名用戶參與的Gowalla數(shù)據(jù)進(jìn)行預(yù)處理
為避免數(shù)據(jù)的偶然性對(duì)實(shí)驗(yàn)產(chǎn)生的偏差影響,我們?cè)讷@取數(shù)據(jù)的同時(shí),隨機(jī)抽取10000行數(shù)據(jù)進(jìn)行實(shí)驗(yàn),代碼如下:
生成Excel文件后,按照用戶編號(hào)升序或者降序排列,因?yàn)樵谙旅孢^濾數(shù)據(jù)的操作中,需要利用這樣的排列結(jié)構(gòu)進(jìn)行過濾操作
? ? ?2.數(shù)據(jù)過濾
過濾掉同一個(gè)user_id下,記錄少于10行的數(shù)據(jù),這樣,保留下來的user_id,至少擁有10次訪問Poi的簽到數(shù)據(jù)
代碼如下:
算法設(shè)計(jì)
下面來逐行用代碼解釋算法每一步操作步驟
1)輸入地點(diǎn)a, 用戶集合X,地點(diǎn)集合Y、用戶和地點(diǎn)關(guān)系集合
2)找到對(duì)a感興趣的用戶子集U;
在我們的實(shí)踐中,設(shè)地點(diǎn)a為poi_id是15693的節(jié)點(diǎn),閾值設(shè)為theta=2,即同一個(gè)用戶訪問同一個(gè)Poi的次數(shù)超過theta,我們可以認(rèn)為該用戶對(duì)該poi感興趣
3)分別找到U中用戶感興趣的地點(diǎn),組成地點(diǎn)子集A
4)分別計(jì)算A中元素e和a的相似度
?? ?sim = |U中去過e的人次| / sqrt(|X中去過a的人次| * |X中去過e的人次|)
?? ?這里用了人次,而沒有用人數(shù)
5)按sim對(duì)A中元素從大到小排序,取sim最大的n個(gè)地點(diǎn)作為a的相似地點(diǎn)子集S
6)輸出S
在這里順便值得一提的是,在初始化count_1向量時(shí),之所以設(shè)置為0.1*ones()矩陣,是因?yàn)檫@巧妙的規(guī)避了poi或者是用戶編號(hào)為0的誤差,因?yàn)槲覀冎笆褂妙愃乒δ艿腶ny()函數(shù)保留了非零元,之后再“四舍五入”,round()一下,這樣原本為0.1的數(shù)據(jù)依然是0,我們就可以放心的將此零元“過濾掉”(unique函數(shù)過濾)
進(jìn)行個(gè)性化選擇
考慮到用戶可能有幾日游的習(xí)慣,我們?cè)O(shè)置Day變量,下面是假設(shè),假設(shè)用戶半日游,如下,則給我們推薦3個(gè)景點(diǎn),分別是Sim值較高的前三個(gè)POI節(jié)點(diǎn)。如下所示:
最后進(jìn)行路徑重組
我們使用Ant Colony算法進(jìn)行路徑重組,由于原始Gowalla數(shù)據(jù)格式不包含坐標(biāo)信息,因此我們要將經(jīng)緯度進(jìn)行轉(zhuǎn)化計(jì)算,這里可以參考我寫的程序,啟發(fā)函數(shù)為歐氏距離的倒數(shù),其結(jié)果如下所示:



