摘要:像這樣使用稱為潛在語(yǔ)義分析。第一個(gè)挑戰(zhàn)是有效地進(jìn)行這種因式分解通過將未知數(shù)視為負(fù)數(shù),天真的實(shí)現(xiàn)將查看輸入矩陣中的每個(gè)條目。
這篇文章是如何使用幾種不同的矩陣分解算法計(jì)算相關(guān)藝術(shù)家的分步指南。代碼用Python編寫,使用 Pandas 和SciPy進(jìn)行計(jì)算,D3.js以交互方式可視化結(jié)果。
加載數(shù)據(jù)對(duì)于這里的帖子,我使用與 我的第一篇文章中相同的Last.fm數(shù)據(jù)集。這可以使用Pandas加載到稀疏矩陣中,只有幾行代碼:
# read in triples of user/artist/playcount from the input datasetdata = pandas.read_table("usersha1-artmbid-artname-plays.tsv", usecols=[0, 2, 3], names=["user", "artist", "plays"])# map each artist and user to a unique numeric valuedata["user"] = data["user"].astype("category")data["artist"] = data["artist"].astype("category")# create a sparse matrix of all the artist/user/play triplesplays = coo_matrix((data["plays"].astype(float), (data["artist"].cat.codes, data["user"].cat.codes)))
這里返回的矩陣有300,000名藝術(shù)家和360,000名用戶,總共有大約1700萬條目。每個(gè)條目都是用戶播放藝術(shù)家的次數(shù),其中的數(shù)據(jù)是從2008年的Last.fm API收集的。
矩陣分解通常用于此問題的一種技術(shù)是將用戶 - 藝術(shù)家 - 戲劇的矩陣投影到低等級(jí)近似中,然后計(jì)算該空間中的距離。
我們的想法是采用原始的播放計(jì)數(shù)矩陣,然后將其減少到兩個(gè)小得多的矩陣,這些矩陣在乘以時(shí)接近原始矩陣:
![clipboard.png](/img/bVbc6R1) Artist/User/Play CountsArtist FactorsUser Factors=×
代替將每個(gè)藝術(shù)家表示為所有360,000個(gè)可能用戶的游戲計(jì)數(shù)的稀疏向量,在對(duì)矩陣進(jìn)行因式分解之后,每個(gè)藝術(shù)家將由50維密集向量表示。
通過減少這樣的數(shù)據(jù)的維數(shù),我們實(shí)際上將輸入矩陣壓縮為兩個(gè)小得多的矩陣。這種壓縮會(huì)強(qiáng)制輸入數(shù)據(jù)的泛化,而這種推廣可以更好地理解數(shù)據(jù)。
潛在語(yǔ)義分析分解輸入矩陣的一種簡(jiǎn)單方法是在適當(dāng)加權(quán)的矩陣上計(jì)算奇異值分解
SVD是那些非常有用的技術(shù)之一,也可以用于 主成分分析或 多維縮放等。我的目的包括它是如何工作的總結(jié),但是Jeremy Kun最近寫了一篇關(guān)于SVD的精彩概述 ,我甚至不打算嘗試這樣做。出于本文的目的,我們只需要知道SVD生成輸入矩陣的低秩近似,并且我們可以使用該低秩表示來生成見解。
像這樣使用SVD稱為潛在語(yǔ)義分析(LSA)。所有真正涉及的是在這個(gè)分解空間中通過余弦距離獲得最相關(guān)的藝術(shù)家,這可以通過以下方式完成:
class TopRelated(object): def __init__(self, artist_factors): # fully normalize artist_factors, so can compare with only the dot product norms = numpy.linalg.norm(artist_factors, axis=-1) self.factors = artist_factors / norms[:, numpy.newaxis] def get_related(self, artistid, N=10): scores = self.factors.dot(self.factors[artistid]) best = numpy.argpartition(scores, -N)[-N:] return sorted(zip(best, scores[best]), key=lambda x: -x[1])
潛在語(yǔ)義分析之所以得名,是因?yàn)樵趯?duì)矩陣進(jìn)行分解之后,可以暴露輸入數(shù)據(jù)中潛在的隱藏結(jié)構(gòu) - 這可以被認(rèn)為是揭示輸入數(shù)據(jù)的語(yǔ)義。
例如,"Arcade Fire"和"The Arcade Fire"在我正在使用的數(shù)據(jù)集中沒有共同的監(jiān)聽器:它是由Last.fm歷史生成的,人們?cè)谒麄兊囊魳穾?kù)中使用了一個(gè)標(biāo)簽或另一個(gè)標(biāo)簽。
這意味著所有比較藝術(shù)家的直接方法都認(rèn)為這兩個(gè)樂隊(duì)完全不同。然而,這兩個(gè)標(biāo)簽都指的是同一個(gè)頻段 - 這是LSA設(shè)法接受的事實(shí),因?yàn)樗鼈儽慌琶麨楸舜俗钕嗨疲?/p>
LSA類似于LSA的"Arcade Fire":
你也可以看到與 “槍炮玫瑰”和“槍炮玫瑰”, “尼克洞穴和壞種子”與“尼克洞穴和壞種子”相同的效果。隨意進(jìn)入其他藝術(shù)家,但請(qǐng)記住,這個(gè)數(shù)據(jù)集是從2008年開始的,因此這里沒有更多的現(xiàn)代藝術(shù)家。
雖然LSA成功地概括了我們數(shù)據(jù)的某些方面,但這里的結(jié)果并不是那么好??纯碆ob Dylan的結(jié)果就是一個(gè)例子。
為了在保持這種概括能力的同時(shí)做得更好,我們需要提出一個(gè)更好的模型。
隱含的交替最小二乘法
推薦系統(tǒng)經(jīng)常使用矩陣分解模型來 為用戶生成個(gè)性化推薦。 已發(fā)現(xiàn)這些模型在推薦項(xiàng)目時(shí)效果很好,并且可以很容易地重復(fù)用于計(jì)算相關(guān)藝術(shù)家。
推薦系統(tǒng)中使用的許多MF模型都采用了明確的數(shù)據(jù),用戶使用類似5星級(jí)評(píng)定標(biāo)準(zhǔn)評(píng)估了他們喜歡和不喜歡的內(nèi)容。它們通常通過將丟失的數(shù)據(jù)視為未知數(shù),然后使用SGD最小化重建錯(cuò)誤來工作。
這里的數(shù)據(jù)是隱含的 - 我們可以假設(shè)聽用藝術(shù)家的用戶意味著他們喜歡它,但是我們沒有用戶不喜歡藝術(shù)家的相應(yīng)信號(hào)。隱式數(shù)據(jù)通常比顯式數(shù)據(jù)更豐富,更容易收集 - 即使您讓用戶給出5星評(píng)級(jí),絕大多數(shù)評(píng)級(jí)都只是積極的,因此您無論如何都需要考慮隱含行為。
這意味著我們不能僅僅將丟失的數(shù)據(jù)視為未知數(shù),而是將不聽藝術(shù)家的用戶視為用戶可能不喜歡該藝術(shù)家的信號(hào)。
這對(duì)學(xué)習(xí)分解表示提出了一些挑戰(zhàn)。
第一個(gè)挑戰(zhàn)是有效地進(jìn)行這種因式分解:通過將未知數(shù)視為負(fù)數(shù),天真的實(shí)現(xiàn)將查看輸入矩陣中的每個(gè)條目。由于此處的維度大約為360K乘300K - 總共有超過1000億條目要考慮,而只有1700萬非零條目。
第二個(gè)問題是我們不能確定沒有聽藝術(shù)家的用戶實(shí)際上意味著他們不喜歡它??赡苓€有其他原因?qū)е滤囆g(shù)家沒有被收聽,特別是考慮到我們?cè)跀?shù)據(jù)集中每個(gè)用戶只有最多50位藝術(shù)家。
隱式反饋數(shù)據(jù)集的協(xié)作過濾以優(yōu)雅的方式解釋了這兩個(gè)挑戰(zhàn)。
為了處理我們對(duì)負(fù)面數(shù)據(jù)沒有信心的情況,這種方法使用二元偏好的不同置信水平來學(xué)習(xí)分解矩陣表示:看不見的項(xiàng)目被視為負(fù)面且置信度低,其中當(dāng)前項(xiàng)目被視為正面更高的信心。
那么目標(biāo)是通過最小化平方誤差損失函數(shù)的置信加權(quán)和來學(xué)習(xí)用戶因子X u和藝術(shù)家因子Y i:
def alternating_least_squares(Cui, factors, regularization, iterations=20): users, items = Cui.shape X = np.random.rand(users, factors) * 0.01 Y = np.random.rand(items, factors) * 0.01 Ciu = Cui.T.tocsr() for iteration in range(iterations): least_squares(Cui, X, Y, regularization) least_squares(Ciu, Y, X, regularization) return X, Ydef least_squares(Cui, X, Y, regularization): users, factors = X.shape YtY = Y.T.dot(Y) for u in range(users): # accumulate YtCuY + regularization * I in A A = YtY + regularization * np.eye(factors) # accumulate YtCuPu in b b = np.zeros(factors) for i, confidence in nonzeros(Cui, u): factor = Y[i] A += (confidence - 1) * np.outer(factor, factor) b += confidence * factor # Xu = (YtCuY + regularization * I)^-1 (YtCuPu) X[u] = np.linalg.solve(A, b)
為了調(diào)用它,我使用與LSA中使用的置信矩陣相同的權(quán)重,然后以相同的方式計(jì)算相關(guān)的藝術(shù)家:
artist_factors ,user_factors = alternating_least_squares (bm25_weight (plays ),50 )
與僅使用LSA相比,該方法可以產(chǎn)生明顯更好的結(jié)果??匆幌?斜率圖,比較Bob Dylan的結(jié)果作為一個(gè)例子:
這里L(fēng)SA返回的無關(guān)結(jié)果被推出列表的頭部,并被相關(guān)結(jié)果取代。
Implicit ALS的優(yōu)點(diǎn)在于它仍然成功地推廣了輸入。舉個(gè)例子,無論是Guns N"Roses還是Nick Cave和The Bad Seeds都會(huì)提出他們的同義詞,只是沒有LSA返回的一些邊際結(jié)果。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/41933.html
摘要:協(xié)同過濾提出了一種支持不完整評(píng)分矩陣的矩陣分解方法不用對(duì)評(píng)分矩陣進(jìn)行估值填充。使用的是交叉最小二乘法來最優(yōu)化損失函數(shù)。 構(gòu)建基于Spark的推薦引擎(Python) 推薦引擎背后的想法是預(yù)測(cè)人們可能喜好的物品并通過探尋物品之間的聯(lián)系來輔助這個(gè)過程 在學(xué)習(xí)Spark機(jī)器學(xué)習(xí)這本書時(shí),書上用scala完成,自己不熟悉遂用pyshark完成,更深入的理解了spark對(duì)協(xié)同過濾的實(shí)現(xiàn) 在這里我...
閱讀 2536·2021-10-11 10:59
閱讀 2715·2021-09-22 15:49
閱讀 2650·2021-08-13 13:25
閱讀 1293·2019-08-30 13:14
閱讀 2396·2019-08-29 18:45
閱讀 3003·2019-08-29 18:36
閱讀 1495·2019-08-29 13:21
閱讀 1166·2019-08-26 11:44