成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

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

Joonas / 979人閱讀

摘要:像這樣使用稱為潛在語(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

相關(guān)文章

  • 構(gòu)建基于Spark推薦引擎(Python

    摘要:協(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) 在這里我...

    nanfeiyan 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<