1. 程式人生 > >推薦系統應用---音樂類

推薦系統應用---音樂類

音樂,人類的靈魂,只有懂得音樂的人才懂得生活。 
每個人都離不開音樂這個東西,你可能不喜歡唱歌,但一定不會不喜歡聽歌,尤其是那些美妙的音樂。
如今,有非常非常多的音樂流派和音樂人,不同音樂流派的音樂風格自然很不相同,而同一種音樂流派中不同的音樂人因為對音樂的理解不同也會有不同的音樂風格。
那麼,如何準確地找到你所喜歡的音樂,準確地挖掘你可能會喜歡的音樂呢?
答曰:推薦系統。
在這裡,可能會用到下面的幾種思路:
  • 協同過濾。

如果我們只是提供音樂服務,而不是像社交網路那樣提供交友服務的話,用item-based cf是個明智的方法。

對於聽歌,用1-5分來評價感覺不如用“喜歡”或者“不喜歡”這種方式的使用者體驗好。儘管喜歡或者不喜歡有點非黑即白的意思,但對於使用者來說操作將會非常的簡單。當然這是一種顯式地反饋方式,往往我們得不到太多的這方面的反饋。那麼要做好推薦,必須好好地挖掘使用者的隱式反饋,比如,使用者收聽了這首歌的百分之多少之後點選了下一首,使用者是否將歌曲進行分享等等。

通過將分析使用者行為得到的資訊轉換為對評分矩陣的一種填充,當然這種填充是在一定的confidence level上進行的。

將使用者的行為轉換成具體的分數是一個比較主觀的事情,需要用使用者的顯式反饋不斷地修正轉換成分數時的引數值。而且對於不同的人來說,他們的引數可能是不同的,比如,有的人喜歡在聽了一首的前10%來表達他不喜歡這首歌,而有的人可能聽了50%才會表達出這種意思。

所以要做到真正的個性化,必須注意每個人而不是所有人的使用習慣。

  • 基於音樂的屬性(或者說是tag)

音樂的屬性,或者是音樂帶的tag資訊,比如:歌手,風格,專輯,格式,時長。現在很多的個性化音樂服務提供商總是喜歡將這些tag資訊稱作是音樂的DNA。我個人覺得這種叫法有些不妥,因為這些tag資訊只是一些概括,並沒有真正的深入到音樂本身的屬性中,所以最多隻能稱作音樂細胞。(當然我也理解,這麼叫聽起來遠不如音樂DNA那麼有技術含量)

利用音樂的tag資訊,我們在提供服務前,就可以聚類,然後再在各聚類中進行音樂的相似度計算,以達到“一勞永逸“的效果。這時候,音樂其實就變成了一個向量,由這些tag以及它們所佔的權重組成的一個音樂向量,然後可以用各種方法計算它們的相似度。當然有新的音樂入庫的時候,我們只需要先找到它屬於的那個聚類中,然後再計算相似度。

這裡,需要注意的一件事是各種tag的權重問題,我覺得權重的排序是:風格、歌手、專輯、時長、格式。因為大家喜歡一首歌,是因為這首歌的風格讓你感覺舒服,當然也有很多的追星一族他們會喜歡一類人,比如周某某的歌,不管是能聽清的還是聽不清楚的他們都會喜歡。對於這類問題,只有慢慢地分析使用者的收聽習慣來個性化地決定權值。

  • 基於音樂的DNA

上面說到的tag我認為是一種比較淺層次的音樂屬性,而到底什麼是音樂的DNA呢?

大家聽到的歌曲本質上是一種機械波,具有所有波的屬性,包括頻率,振幅,週期。

一種比較極端的方法,就是將庫裡的所有歌曲都轉換成波的形式,然後對波進行相似度分析。

當然這種方法聽起來會很荒謬,但是可以考慮分析波的主成分。

也可以先利用tag資訊將音樂聚類分組,然後並行地用波形分析的方法對音樂進行相似度計算,這樣可以省掉確定各個tag之間的權重的麻煩。

(這種思路,比較YY,哈哈,大家看著玩就可以哈)

  • 混合推薦

混合推薦的話,需要利用音樂的tag資訊、使用者的行為分析以及使用者的評分矩陣來完成。

用現在比較流行的matrix factor models將各種使用者相關的資訊包含到模型,然後迭代求解。

  • 利用天氣進行推薦

大家都有這麼一種感覺,晴朗的天氣我們更傾向於聽一些歡快的歌曲,而陰雨的天氣我們會比較傾向於聽一些悲傷的歌曲。當然,也有的使用者會在陰雨天收聽一些歡快的歌曲來讓自己happy起來。

anyway,考慮天氣因素是一種簡單的方法來提高系統的智慧程度的方法(這個簡單是相對於分析使用者的心情)。

那麼如何知道哪些歌曲屬於歡快的歌曲還是比較悲傷的?

做個分類器,先對一些你聽過的歌曲人工分為歡快和悲傷,然後學習這兩類歌曲的特徵,然後對未分類的歌曲進行分析來決定他們到底屬於哪個類別。當然這是一種二分的情況,實際的歌曲不可能不是歡快就是悲傷,有許多的分類。

那麼如何分析歌曲是歡快還是別的感覺呢?

(a)一種基於分類的方法

可以考慮用音樂的DNA來分析,當然這個工作量也是非常大的。但完全可以離線做好一勞永逸。

其實,有一種比較好的方法,就是讓使用者自己來對每首歌曲進行分類。

具體的方法是在使用者收聽每個歌曲的時候讓使用者為這首歌新增一個表情。(我們會提供幾個表情,不同的表情代表不同的分類,當然這個難度比讓使用者表達喜歡不喜歡更加困難)

拿到使用者為每首歌新增的表情,我們可以以兩種方式來用這個資料。

  • 將所有表情資料集中到一起,提供一種大眾化的分類推薦。
  • 針對每個使用者的表情資料,提供一種個性化的分類推薦。因為畢竟不同的使用者對同一首歌曲的理解都不相同。

這樣,我們就可以實現,當下雨天的時候,我們會將推薦給使用者的列表中的比較悲傷的歌曲提前到列表的topN的位置。

(b)一種基於統計的方法

我們在為使用者提供音樂的服務,會記錄一些靜態的資訊,比如音樂的tag,收聽了多久,點選了哪些按鈕等等。其實,我們可以也記錄下使用者在收聽這些歌曲當時的天氣資訊。這樣我們可能會得到下面的資料:

身邊 2011.12.10 14:00-14:05 晴天

情非得已 2011.12.10 14:05-14:10 晴天

。。。 。。。 。。。。 。。。

機器學習中有一個最最經典的例子就是天氣和去不去游泳的關係案例。

同樣的思路,我們可以統計使用者在聽歌時的天氣來做一些統計和學習,來預測使用者在給定的天氣條件下,他更可能喜歡的歌曲是什麼,相當於對協同過濾或者混合推薦演算法中給出的推薦列表的一種個性化智慧化過濾。

音樂這個東西很神奇,可以治癒心中的一些傷口。

非常期待能夠誕生一個非常智慧非常人性化的音樂推薦系統。