国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

Python使用矩陣分解法找到類似的音樂

Joonas / 972人閱讀

摘要:像這樣使用稱為潛在語義分析。第一個挑戰是有效地進行這種因式分解通過將未知數視為負數,天真的實現將查看輸入矩陣中的每個條目。

這篇文章是如何使用幾種不同的矩陣分解算法計算相關藝術家的分步指南。代碼用Python編寫,使用 Pandas 和SciPy進行計算,D3.js以交互方式可視化結果。

加載數據

對于這里的帖子,我使用與 我的第一篇文章中相同的Last.fm數據集。這可以使用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名藝術家和360,000名用戶,總共有大約1700萬條目。每個條目都是用戶播放藝術家的次數,其中的數據是從2008年的Last.fm API收集的。

矩陣分解

通常用于此問題的一種技術是將用戶 - 藝術家 - 戲劇的矩陣投影到低等級近似中,然后計算該空間中的距離。

我們的想法是采用原始的播放計數矩陣,然后將其減少到兩個小得多的矩陣,這些矩陣在乘以時接近原始矩陣:

![clipboard.png](/img/bVbc6R1)


Artist/User/Play CountsArtist FactorsUser Factors=×

代替將每個藝術家表示為所有360,000個可能用戶的游戲計數的稀疏向量,在對矩陣進行因式分解之后,每個藝術家將由50維密集向量表示。

通過減少這樣的數據的維數,我們實際上將輸入矩陣壓縮為兩個小得多的矩陣。這種壓縮會強制輸入數據的泛化,而這種推廣可以更好地理解數據。

潛在語義分析

分解輸入矩陣的一種簡單方法是在適當加權的矩陣上計算奇異值分解

SVD是那些非常有用的技術之一,也可以用于 主成分分析或 多維縮放等。我的目的包括它是如何工作的總結,但是Jeremy Kun最近寫了一篇關于SVD的精彩概述 ,我甚至不打算嘗試這樣做。出于本文的目的,我們只需要知道SVD生成輸入矩陣的低秩近似,并且我們可以使用該低秩表示來生成見解。

像這樣使用SVD稱為潛在語義分析(LSA)。所有真正涉及的是在這個分解空間中通過余弦距離獲得最相關的藝術家,這可以通過以下方式完成:

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])

潛在語義分析之所以得名,是因為在對矩陣進行分解之后,可以暴露輸入數據中潛在的隱藏結構 - 這可以被認為是揭示輸入數據的語義。

例如,"Arcade Fire"和"The Arcade Fire"在我正在使用的數據集中沒有共同的監聽器:它是由Last.fm歷史生成的,人們在他們的音樂庫中使用了一個標簽或另一個標簽。

這意味著所有比較藝術家的直接方法都認為這兩個樂隊完全不同。然而,這兩個標簽都指的是同一個頻段 - 這是LSA設法接受的事實,因為它們被排名為彼此最相似:

LSA

類似于LSA的"Arcade Fire":

你也可以看到與 “槍炮玫瑰”和“槍炮玫瑰”, “尼克洞穴和壞種子”與“尼克洞穴和壞種子”相同的效果。隨意進入其他藝術家,但請記住,這個數據集是從2008年開始的,因此這里沒有更多的現代藝術家。

雖然LSA成功地概括了我們數據的某些方面,但這里的結果并不是那么好。看看Bob Dylan的結果就是一個例子。

為了在保持這種概括能力的同時做得更好,我們需要提出一個更好的模型。

隱含的交替最小二乘法
推薦系統經常使用矩陣分解模型來 為用戶生成個性化推薦。 已發現這些模型在推薦項目時效果很好,并且可以很容易地重復用于計算相關藝術家。

推薦系統中使用的許多MF模型都采用了明確的數據,用戶使用類似5星級評定標準評估了他們喜歡和不喜歡的內容。它們通常通過將丟失的數據視為未知數,然后使用SGD最小化重建錯誤來工作。

這里的數據是隱含的 - 我們可以假設聽用藝術家的用戶意味著他們喜歡它,但是我們沒有用戶不喜歡藝術家的相應信號。隱式數據通常比顯式數據更豐富,更容易收集 - 即使您讓用戶給出5星評級,絕大多數評級都只是積極的,因此您無論如何都需要考慮隱含行為。

這意味著我們不能僅僅將丟失的數據視為未知數,而是將不聽藝術家的用戶視為用戶可能不喜歡該藝術家的信號。

這對學習分解表示提出了一些挑戰。

第一個挑戰是有效地進行這種因式分解:通過將未知數視為負數,天真的實現將查看輸入矩陣中的每個條目。由于此處的維度大約為360K乘300K - 總共有超過1000億條目要考慮,而只有1700萬非零條目。

第二個問題是我們不能確定沒有聽藝術家的用戶實際上意味著他們不喜歡它。可能還有其他原因導致藝術家沒有被收聽,特別是考慮到我們在數據集中每個用戶只有最多50位藝術家。

隱式反饋數據集的協作過濾以優雅的方式解釋了這兩個挑戰。

為了處理我們對負面數據沒有信心的情況,這種方法使用二元偏好的不同置信水平來學習分解矩陣表示:看不見的項目被視為負面且置信度低,其中當前項目被視為正面更高的信心。

那么目標是通過最小化平方誤差損失函數的置信加權和來學習用戶因子X u和藝術家因子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)


為了調用它,我使用與LSA中使用的置信矩陣相同的權重,然后以相同的方式計算相關的藝術家:

artist_factors ,user_factors = alternating_least_squares (bm25_weight (plays ),50 )

與僅使用LSA相比,該方法可以產生明顯更好的結果。看一下 斜率圖,比較Bob Dylan的結果作為一個例子:

這里LSA返回的無關結果被推出列表的頭部,并被相關結果取代。

Implicit ALS的優點在于它仍然成功地推廣了輸入。舉個例子,無論是Guns N"Roses還是Nick Cave和The Bad Seeds都會提出他們的同義詞,只是沒有LSA返回的一些邊際結果。

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/41933.html

相關文章

  • 構建基于Spark推薦引擎(Python

    摘要:協同過濾提出了一種支持不完整評分矩陣的矩陣分解方法不用對評分矩陣進行估值填充。使用的是交叉最小二乘法來最優化損失函數。 構建基于Spark的推薦引擎(Python) 推薦引擎背后的想法是預測人們可能喜好的物品并通過探尋物品之間的聯系來輔助這個過程 在學習Spark機器學習這本書時,書上用scala完成,自己不熟悉遂用pyshark完成,更深入的理解了spark對協同過濾的實現 在這里我...

    nanfeiyan 評論0 收藏0

發表評論

0條評論

最新活動
閱讀需要支付1元查看
<