2

我正在構建向學生推薦導師的Rails應用程序,反之亦然。我需要根據他們的專業(數學,生物等),經驗(初級等),課程(數學201等),偏好(自我描述的關鍵詞)和評分等多個維度來匹配他們。協作或結構化的推薦?

我檢查了一些Rails協作推薦引擎(推薦,推薦)和Mahout。看來,協作推薦並不是我的最佳選擇,因爲我有更多的結構化數據,這允許更結構化的查詢。例如,我可以有一個推薦邏輯,像個學生:

if student looks for a Math tutor in Math 201: 
    if there's a tutor in Math major offering tutoring in Math 201 then return 
    else if there's a tutor in Math major then sort by experience then return 
    else if there's a tutor in quantitative major then sort by experience then return 
    ... 

我的問題是:

  1. 什麼是考慮到我的推薦系統將優先 - 協同推薦算法的好處根據?

  2. 如果它確實提供了顯着的好處,我如何將它與上面提到的基於偏好的建議結合起來?

  3. 由於我的方法涉及查詢多個表,因此可能效率不高。我應該怎麼做呢?

非常感謝。

回答

4

這聽起來像您的兼容性測量可能有利地重新配置爲metric。你應該做的是嘗試將你的'列'解釋爲數據維度的不同組成部分。這個想法是,你最終應該產生一個二元函數,返回學生和導師(也包括學生/學生和導師/導師)之間的兼容性度量。該指標擴展到所有類型的數據的動機是,你可以使用這個主意,重新制定你的匹配標準作爲近鄰搜索:

http://en.wikipedia.org/wiki/Nearest_neighbor_search

有大量的數據結構和解決方案,這問題,因爲它已被很好地研究。例如,你可以試試下面的庫,經常與點雲數據使用:

http://www.cs.umd.edu/~mount/ANN/

要通過您的數據集運行的主成分分析優化的事情了一下,你也可以嘗試預過濾數據。這可以讓你減少你在其中進行最近鄰搜索的空間的維度,並且通常具有減少一些噪聲量的附加好處。

http://en.wikipedia.org/wiki/Principal_component_analysis

祝你好運!

+0

感謝萬,米科拉! – AdamNYC 2012-04-20 02:29:12

3

就我個人而言,我認爲協同過濾(cf)可以爲你工作。請注意cf的核心思想是偶然性。換句話說,增加太多約束可能會導致對用戶的冷淡建議。 cf的全部意義在於提供基於類似用戶的令人興奮的相關建議。你不需要施加這樣嚴格的限制。

如果您可能決定實施自定義cf算法,我會推薦閱讀由亞馬遜[pdf]發佈的這篇文章,其中討論了亞馬遜的推薦系統。簡而言之,它們使用的算法如下:

for each item I1 
    for each customer C who bought I1 
     for each I2 bought by a customer 
      record purchase C{I1, I2} 
    for each item I2 
     calculate sim(I1, I2) 
     //this could use your own similarity measure, e.g., cosine based 
     //similarity, sim(A, B) = cos(A, B) = (A . B)/(|A| |B|) where A 
     //and B are vectors(items, or courses in your case) and the dimensions 
     //are customers 
return table 

請注意,此表的創建將在離線狀態下完成。在線算法會很快返回建議。顯然,推薦質量非常好。在任何情況下,如果你想對cf總體上有更好的理解(比如,各種cf策略)以及它爲什麼適合你,那麼閱讀那篇文章(不要擔心,它是非常可讀的)。實現簡單的cf推薦器並不困難。優化可以稍後進行。