Clustering
稀疏矩陣上的餘弦相似度
我正在嘗試實現基於項目的過濾,具有代表購買(1)或未購買(0)特定產品的消費者的大特徵空間。
我有一個長尾分佈,所以矩陣非常稀疏。R 處理得不好。我可以做些什麼來簡化餘弦相似度的測量?
R 通常不能很好地擴展到大數據。您可能需要轉向更高效的實施。周圍有很多選擇。但是,當然,可能還有各種 R 包可以幫助您更進一步。
此外,停止思考矩陣也是值得的。您正在使用的是一個圖表。1 是邊,0 不是。在這裡加速計算相似性的一種簡單方法是巧妙地利用相似性。這個順便說一句。例如,通過在 Hadoop 中以“列形式”處理數據所獲得的好處幾乎是一樣的。
當你意識到餘弦相似度由三個分量組成:A 和 B 的乘積、A 的長度和 B 的長度時,你會注意到兩部分獨立於另一個向量,而第三部分具有平方稀疏性,這將大大減少餘弦相似度“矩陣”所需的計算(再次,不要將其視為矩陣)
那麼精簡是:
- 計算每個單個向量的長度,用於歸一化(即計算)
- 對於每個屬性 (!) 向每對非零條目發送一條消息。如果你有每個中的非零值列,這將只是消息。
- 計算每對收到的消息數量,這是, 被除以和.
或者:
- 將每個向量標準化為長度(您的矩陣將不再是二進制的!)
- 對於每個屬性 (!),將帶有兩個值的乘積的消息發送到每對非零條目。如果你有每個中的非零值列,這將只是消息。
- 對每對收到的消息求和,這就是餘弦相似度。(不需要除法,因為)
並且一定要考慮如何在內存中存儲和組織數據。在這裡,快速數據訪問和操作是成本的 90%,實際計算是微不足道的。不要讓 R 自動執行它,因為這可能意味著它做錯了……