基於KNN的相關內容推薦

2021-07-08 13:00:33 字數 1647 閱讀 3742

書籍

書名、作者、出版時間、出版社、分類、標籤

****名、歌手、發行時間、發行方、風格流派、標籤

電影電影名稱、導演、演員、上映時間、製片方、型別、標籤

豆瓣很多地方都使用了「標籤」這個詞,用貼標籤的形式來完成內容的分類和標識,但其實標籤又分為很多種,有些標籤是在內容生成時就被貼上的,有些可能是後續使用者貼上去的,而且豆瓣一般為內容和標籤定義了原始分類,如書籍分為文學、流行、文化……既然分類和標籤內容源生就帶有,那同樣可以作為內容的固有屬性。

knn(k-nearest neighbor algorithm),k最近鄰演算法,通過計算樣本個體間的距離或者相似度尋找與每個樣本個體最相近的k個個體,演算法的時間複雜度跟樣本的個數直接相關,需要完成一次兩兩比較的過程。knn一般被用於分類演算法,在給定分類規則的訓練集的基礎上對總體的樣本進行分類,是一種監督學習(supervised learning)方法。

這裡我們不用knn來實現分類,我們使用knn最原始的演算法思路,即為每個內容尋找k個與其最相似的內容,並推薦給使用者。相當於每個內容之間都會完成一次兩兩比較的過程,如果你的**有n個內容,那麼演算法的時間複雜度為cn

2,即n(n-1)/2。但是用內容固有屬性有乙個好處就是因為固有屬性一旦建立後基本保持不變,因此演算法輸出的資料一旦計算好之後不需要重複計算去重新整理,也就是對於**內容而言,原有內容的資料在首次初始化之後可以不斷重複使用,只要更新新增內容的資料就可以,資料的統計計算可以使用增量更新的形式,這樣可以有效地減少伺服器的計算壓力。

有了基礎資料和演算法的支援,我們就可以建立資料模型了。先看下基礎資料的型別,作者、分類、**和標籤都是字元型,其中作者、分類、**基本可以當做是單個值的屬性,標籤一般包含多個值。首先由於都是字元可以確定屬性之間相似性的判定只能通過「是否相同」,無法體現數值上的差異,所以對於作者、分類、**這幾個單值屬性而言,比較的結果就是乙個布林型的度量,相同或者不相同;對於標籤這個多值屬性可以考慮使用jaccard相關係數,但因為每個內容標籤的個數存在較大差異,使用驗證後的結果並不理想,所以不考慮使用(當然,如果內容的標籤個數比較固定,jaccard相關係數是有效的)。因此,直接建立加權相似度模型如下,首先是標籤的相似度分值設定:

相同標籤數

圖書比例

相似度分值

070%01

20%126%

233%4

>=41%5

再結合作者、分類和**,通過加權設定總體的相似度分值:

屬性相同時分值

不同時分值

權重加權分值分布作者1

025[0,25]分類1

010[0,10]**1

015[0,15]

標籤[1,5]010

[0,50]

將所有屬性加權相似度分值的結果相加應該分布在[0,100],分值越高說明內容間的相似度越高。對於這種簡單的加權相似度評分模型,估計又有很多人要問權重是怎麼確定的,確實,這裡的權重並沒有通過任何定量分析模型的方法去計算,只是簡單的經驗估計,但估計的過程經過反覆地調整和優化,也就是不斷地嘗試調整各屬性的權重係數並輸出結果,抽樣檢驗結果是否符合預期、是否有提公升優化的空間。

ORACLE相關內容

1 em,dbca,netca,netmgr出現亂碼方案 cd oracle home jre lib mv font.properties font.properties.bak mv font.properties.zh font.properties em,dbca,netca,netmgr詳...

JVM相關內容

本地 native code 每個因素對記憶體占用的影響又會隨著應用程式 執行環境和系統平台的不同而變化,那怎樣計算總的記憶體佔用量?是的,想得到乙個準確的數字不是那麼容易,因為 你很難控制本地 native 部分。你能控制的部分只有堆大小 xmx,類占用的記憶體 xx maxpermsize,還有...

指標相關內容

1.指標是變數,佔4位元組,存放的是位址 2.指標型別與零值比較 if n null 或者if n null 3.野指標 int p 空指標 int p null 避免野指標 以char型別為例 char p char mallloc sizeof char 10 要包含標頭檔案 include 使...