99999久久久久久亚洲,欧美人与禽猛交狂配,高清日韩av在线影院,一个人在线高清免费观看,啦啦啦在线视频免费观看www

熱線電話:13121318867

登錄
首頁(yè)精彩閱讀你的歌單無(wú)聊嗎關(guān)于音樂和機(jī)器學(xué)習(xí)的數(shù)據(jù)分析
你的歌單無(wú)聊嗎關(guān)于音樂和機(jī)器學(xué)習(xí)的數(shù)據(jù)分析
2017-06-09
收藏
Spotify 是全球最大的正版流媒體音樂服務(wù)平臺(tái),深受全球用戶的喜愛。那么你的歌單無(wú)聊嗎?一位程序員小哥對(duì)自己的Spotify歌單進(jìn)行了數(shù)據(jù)分析。

幾天前,我正在和一個(gè)朋友聊天,同時(shí)聽著我的 Spotify 歌單里的歌。聽了幾首歌,她說:“你的音樂品味很有意思...你的歌單音樂很多樣,器樂音樂多,還有些無(wú)聊 ”。

聽到這個(gè)評(píng)論,我笑了,因?yàn)檫@不是第一次別人這么說我了。我承認(rèn)我的音樂品味有點(diǎn)奇怪。比如,我會(huì)聽一些 Kendrick Lamar (美國(guó)說唱歌手)的歌,然后會(huì)切換到《盜夢(mèng)空間》配樂,接著又是西班牙薩爾薩舞曲。

不過,她的評(píng)論給了我一個(gè)靈感:讓我們看看數(shù)據(jù)是怎么說的。

所以,我進(jìn)行了一個(gè)實(shí)驗(yàn)。

在實(shí)驗(yàn)中,我分析了我的 Spotify 歌曲,看看它們是否真的很多樣化,器樂音樂多而且無(wú)聊。此外,為了加強(qiáng)趣味性,我把這三個(gè)特征與我朋友的歌單進(jìn)行了比較。最后,我構(gòu)建了一個(gè)機(jī)器學(xué)習(xí)模型,目的是預(yù)測(cè)某首歌更適合我的歌單還是她的。


工具

當(dāng)中使用的主要工具是 Spotify API 服務(wù)的音頻特性組件。這些音頻特征代表了一首歌曲的特點(diǎn)。稍后我將更詳細(xì)地解釋這些特性。

我們用 Python 來獲取數(shù)據(jù),并利用 scikit- learn 來訓(xùn)練機(jī)器學(xué)習(xí)模型。同時(shí)使用 R 語(yǔ)言進(jìn)行數(shù)據(jù)分析。


數(shù)據(jù)

歌曲的數(shù)據(jù)是用我寫的一個(gè) Python 腳本獲取的,該腳本獲取一個(gè)用戶的所有播放列表,以及特定播放列表的所有歌曲。一旦我有了歌曲的基本信息,包括 Spotify ID,我就能使用該腳本獲取音樂的音頻特征

由此產(chǎn)生的數(shù)據(jù)集由 15 列和 1074 首歌曲組成,其中 563 首來自我的歌單,511 首來自她的歌單(從現(xiàn)在起,我將把我的朋友稱為她)。

在數(shù)據(jù)集的 15 列中,只有與音頻特性相關(guān)的部分被使用。在下面的列表中,我將介紹并解釋它們的含義(在某些情況下,我只會(huì)復(fù)制來自 Spotify 的描述)。注意:所有特性的值在 0.0 - 1.0 范圍內(nèi)。

? 器樂性:指歌曲中的器樂量。該值越接近1.0,歌曲就越偏向器樂性。
? 原聲性:指歌曲的原聲性(“不插電”即表示不含電子合成音樂)。該值越接近1.0,歌曲就越具有原聲性。
? 現(xiàn)場(chǎng)性:指歌曲現(xiàn)場(chǎng)錄制的概率。根據(jù)官方描述“ 該值達(dá) 0.8 以上則說明歌曲很可能是現(xiàn)場(chǎng)錄制”。
? 語(yǔ)言性:“ 指歌曲中存在語(yǔ)言 ”。如果一首歌曲該值高于0.66,則由語(yǔ)言組成,在 0.33 和0.66 之間,這首歌既包含音樂也包含語(yǔ)言,低于 0.33 表示該歌曲沒有任何語(yǔ)言。
? 活力性:“指強(qiáng)度和活躍的感知度量。通常,充滿活力的歌曲讓人感覺快速,響亮,嘈雜 “。
? 舞蹈性:“ 指根據(jù)一系列的音樂元素,包括速度,節(jié)奏穩(wěn)定性,拍子強(qiáng)度和整體規(guī)律性,從而判斷歌曲是否適合舞蹈。該值為 0.0 最不適合跳舞,1.0 是最適合跳舞 “。
? 心理效價(jià)性:“ 描述歌曲傳達(dá)的音樂積極性。該值越高的音樂越積極(例如,快樂,開朗,欣快),該值越低音樂則越消極(例如悲傷,沮喪,憤怒) “。


數(shù)據(jù)分析

這個(gè)報(bào)告的前提是,根據(jù)一個(gè)朋友的說法:我的歌單是多樣的、器樂音樂多、無(wú)聊的。因此,我調(diào)查了這三個(gè)屬性,以判斷她的觀點(diǎn)是否正確。

我將展示兩個(gè)歌單所有音頻特性的平均值,從而我們能了解每個(gè)數(shù)據(jù)集的主要特征。


圖1 的數(shù)據(jù)表明,我的歌單的普遍特征是器樂性。圖2 的數(shù)據(jù)表明,她的普遍特征是舞蹈性。然而,這些值之間的差異有多大?

下面的圖表顯示我的歌單特征分別減去她的對(duì)應(yīng)特征


很明顯,我們可以看到器樂性和原聲性(藍(lán)條)是我歌單的顯著特征,相減后值分別為 0.53 和 0.1。她的歌單特征為舞蹈性和心理效價(jià)性,均為 0.19。

結(jié)果
? 我的歌單器樂音樂更多。
? 她的歌單更有活力。

那么,對(duì)于她的第一個(gè)判斷“我歌單器樂音樂多嗎?”答案是肯定的。

多樣性

接著回答的下一個(gè)問題:我歌單是否很多樣?

為了回答這個(gè)問題,我分析了歌單中歌曲的相似性與區(qū)別性。多樣的歌單意味著用戶有許多不同類型的歌曲。與此相反,缺乏變化性的歌單說明所有的歌曲基本屬于同一類型。

為了判斷我歌單的多樣性,在這里我們用到了音頻特性的標(biāo)準(zhǔn)偏差。


通過圖表很難判斷誰(shuí)的歌單更具多樣性。但是如果結(jié)合所有的值并計(jì)算, 可以發(fā)現(xiàn)我歌單的標(biāo)準(zhǔn)差的平均值為 0.244,總和為 1.713。關(guān)于她的歌單,平均值為 0.174,總和為 1.218。

這意味著什么?較高的標(biāo)準(zhǔn)偏說明,我的歌曲音頻特征不是很相似。也就是說,我的歌曲中有的器樂性很高,有的器樂性很低。

結(jié)論: 我的歌單比她的更多樣。

無(wú)聊

關(guān)于第三個(gè)問題“我的歌單有多無(wú)趣?”是這次實(shí)驗(yàn)最有趣的部分之一。什么才是無(wú)聊的歌?對(duì)我來說很無(wú)聊的歌也許對(duì)其他人來說很有意思。

為了解答這個(gè)問題,我想象自己在一個(gè)派對(duì)上,我希望在派對(duì)上聽到什么樣的音樂。所以我想出了一個(gè)簡(jiǎn)單的方程式,涉及到活力性和舞蹈性特性,以及我還沒有介紹的兩個(gè)特性:節(jié)拍和音量。原因在于,在一個(gè)聚會(huì)上我更想聽到吵鬧的音樂,同時(shí)節(jié)拍又好,能激發(fā)人的活力,讓人想隨著舞蹈。

方程式如下:

boringness = loudness + tempo + (energy*100) + (danceability*100)

根據(jù)方程式,得分最低,歌曲越無(wú)聊,得分最高,越有趣。另外需注意,由于節(jié)拍和音量的值不在 0.0-1.0 范圍內(nèi),為了保持?jǐn)?shù)據(jù)的一致性,我把活力性和舞蹈性乘以 100。

結(jié)果如下:


以上為一個(gè)直方圖,它顯示了“無(wú)聊”值在每個(gè)數(shù)據(jù)集間的分布情況。人們可能會(huì)注意到粉色區(qū)域的峰值,即她的歌單,比藍(lán)色的要高。另外,與藍(lán)色區(qū)域相比,右邊的粉色區(qū)域更密集(這叫做左傾斜),這意味著她歌單中無(wú)聊值大多數(shù)都比我的更高。

為了補(bǔ)充這個(gè)直方圖,我們計(jì)算了無(wú)聊的平均值,我的為 201.735,她的為 233.284。


因此,我們可以得出結(jié)論,根據(jù)我自己的方程式,我的歌單比她的更無(wú)聊,我很可能討厭在派對(duì)上聽到自己的音樂。

機(jī)器學(xué)習(xí) 判斷這首歌是她的還是我的?

該實(shí)驗(yàn)的最后一個(gè)目標(biāo)是,看能否通過機(jī)器學(xué)習(xí)來預(yù)測(cè)一首歌屬于誰(shuí)。

我想把機(jī)器學(xué)習(xí)定義為,監(jiān)督學(xué)習(xí)的子域,使用系統(tǒng)學(xué)習(xí)的數(shù)據(jù)集模型的任務(wù)。在這個(gè)學(xué)習(xí)過程中,算法尋找最優(yōu)的數(shù)學(xué)函數(shù)。某種程度上,這可以解釋數(shù)據(jù)特性(如音頻特性)和數(shù)據(jù)標(biāo)簽間的關(guān)系(即歌單所有者,我或她)。因此,當(dāng)系統(tǒng)學(xué)習(xí)數(shù)據(jù)時(shí),它應(yīng)該能夠利用學(xué)習(xí)過程中所學(xué)到的知識(shí)來推斷或預(yù)測(cè)一組新數(shù)據(jù)的類別。

在這個(gè)過程中,這意味著我們需要之前使用的數(shù)據(jù)集的機(jī)器學(xué)習(xí)系統(tǒng)。該系統(tǒng)能夠判斷出一組新的音頻的特征更符合誰(shuí)的歌單。

在現(xiàn)有的所有機(jī)器學(xué)習(xí)模型中,我使用了一個(gè)叫做邏輯回歸的模型。在此不對(duì)邏輯回歸的工作原理做出過多解釋。可以將它理解為一個(gè)數(shù)學(xué)方程,其中的目標(biāo)變量稱為因變量。我們想要預(yù)測(cè)的內(nèi)容(在這個(gè)例子中是歌單的所有者),取決于一個(gè)或幾個(gè)獨(dú)立變量(音頻特征)。具體如下:

dependent_variable = magic(independent_variable_1 + independent_variable_2 + …)

因變量的值是 0 到 1 之間的數(shù)字,在這種情況下,這個(gè)值表示一首歌屬于我的歌單的概率,如果這個(gè)值小于某個(gè)極限 X,這首歌屬于我,否則它屬于她。

在展示結(jié)果之前,我想簡(jiǎn)單介紹一下。通過網(wǎng)格搜索和交叉驗(yàn)證,得到模型參數(shù)α和迭代次數(shù)。

最佳配置如下:
? Penalty:彈性網(wǎng)
? α:0.001
? 迭代次數(shù):50

以下是用于訓(xùn)練模型的 Python 代碼。

parameters = {
‘a(chǎn)lpha’: (0.001, 0.0001, 0.00001, 0.000001),
‘penalty’: (‘l2’, ‘elasticnet’,),
‘n_iter’: (10, 50, 100),
‘loss’: (‘log’,) 
# Perform a grid search with cross validation to search for the best parameters.
grid_search = GridSearchCV(SGDClassifier(), parameters, n_jobs=-1,
                           verbose=1, cv=5, scoring=’accuracy’)
grid_search.fit(data, labels)

結(jié)果出乎意料的好!

根據(jù)一些訓(xùn)練和測(cè)試部,平均準(zhǔn)確度為 82%,換句話說,10 次中有 8 次能夠準(zhǔn)確預(yù)測(cè)歌單的所有者。

一旦這個(gè)模型經(jīng)過訓(xùn)練,它就會(huì)用于測(cè)試兩首在訓(xùn)練中沒有遇到的歌曲。第一首歌曲是來自游戲《質(zhì)量效應(yīng):仙女座》的 “A Better Beginning” ,預(yù)測(cè)屬于我的歌單,而第二首歌 Rihanna 的 “Love On The Brain” 則屬于她的歌單。很準(zhǔn)確。


結(jié)語(yǔ)

在這篇文章中,我展示了如何把對(duì)我歌單的一個(gè)無(wú)聊的觀點(diǎn),變成了一個(gè)實(shí)驗(yàn)。通過使用Spotify 的音頻功能,我能夠發(fā)現(xiàn)就像我的朋友說的,我的歌單具有多樣性,器樂音樂多,而且有些無(wú)聊。為了補(bǔ)充,加上了一個(gè)機(jī)器學(xué)習(xí)模型,邏輯回歸,從而預(yù)測(cè)一首歌更符合誰(shuí)的歌單。該模型的精度為 82%,相當(dāng)不錯(cuò)。

所有使用的代碼均可在以下可以獲取。這包括獲取數(shù)據(jù)分析的Python腳本,R 語(yǔ)言腳本以及訓(xùn)練機(jī)器學(xué)習(xí)模型。
https://github.com/juandes/spotify-audio-features-data-experiment

有關(guān)Spotify的音頻功能的詳細(xì)信息,請(qǐng)查Spotify上的官方文檔。
https://developer.spotify.com/web-api/get-audio-features/

ref:
https://medium.com/towards-data-science/is-my-spotify-music-boring-an-analysis-involving-music-data-and-machine-learning-47550ae931de

數(shù)據(jù)分析咨詢請(qǐng)掃描二維碼

若不方便掃碼,搜微信號(hào):CDAshujufenxi

數(shù)據(jù)分析師資訊
更多

OK
客服在線
立即咨詢
客服在線
立即咨詢
') } function initGt() { var handler = function (captchaObj) { captchaObj.appendTo('#captcha'); captchaObj.onReady(function () { $("#wait").hide(); }).onSuccess(function(){ $('.getcheckcode').removeClass('dis'); $('.getcheckcode').trigger('click'); }); window.captchaObj = captchaObj; }; $('#captcha').show(); $.ajax({ url: "/login/gtstart?t=" + (new Date()).getTime(), // 加隨機(jī)數(shù)防止緩存 type: "get", dataType: "json", success: function (data) { $('#text').hide(); $('#wait').show(); // 調(diào)用 initGeetest 進(jìn)行初始化 // 參數(shù)1:配置參數(shù) // 參數(shù)2:回調(diào),回調(diào)的第一個(gè)參數(shù)驗(yàn)證碼對(duì)象,之后可以使用它調(diào)用相應(yīng)的接口 initGeetest({ // 以下 4 個(gè)配置參數(shù)為必須,不能缺少 gt: data.gt, challenge: data.challenge, offline: !data.success, // 表示用戶后臺(tái)檢測(cè)極驗(yàn)服務(wù)器是否宕機(jī) new_captcha: data.new_captcha, // 用于宕機(jī)時(shí)表示是新驗(yàn)證碼的宕機(jī) product: "float", // 產(chǎn)品形式,包括:float,popup width: "280px", https: true // 更多配置參數(shù)說明請(qǐng)參見:http://docs.geetest.com/install/client/web-front/ }, handler); } }); } function codeCutdown() { if(_wait == 0){ //倒計(jì)時(shí)完成 $(".getcheckcode").removeClass('dis').html("重新獲取"); }else{ $(".getcheckcode").addClass('dis').html("重新獲取("+_wait+"s)"); _wait--; setTimeout(function () { codeCutdown(); },1000); } } function inputValidate(ele,telInput) { var oInput = ele; var inputVal = oInput.val(); var oType = ele.attr('data-type'); var oEtag = $('#etag').val(); var oErr = oInput.closest('.form_box').next('.err_txt'); var empTxt = '請(qǐng)輸入'+oInput.attr('placeholder')+'!'; var errTxt = '請(qǐng)輸入正確的'+oInput.attr('placeholder')+'!'; var pattern; if(inputVal==""){ if(!telInput){ errFun(oErr,empTxt); } return false; }else { switch (oType){ case 'login_mobile': pattern = /^1[3456789]\d{9}$/; if(inputVal.length==11) { $.ajax({ url: '/login/checkmobile', type: "post", dataType: "json", data: { mobile: inputVal, etag: oEtag, page_ur: window.location.href, page_referer: document.referrer }, success: function (data) { } }); } break; case 'login_yzm': pattern = /^\d{6}$/; break; } if(oType=='login_mobile'){ } if(!!validateFun(pattern,inputVal)){ errFun(oErr,'') if(telInput){ $('.getcheckcode').removeClass('dis'); } }else { if(!telInput) { errFun(oErr, errTxt); }else { $('.getcheckcode').addClass('dis'); } return false; } } return true; } function errFun(obj,msg) { obj.html(msg); if(msg==''){ $('.login_submit').removeClass('dis'); }else { $('.login_submit').addClass('dis'); } } function validateFun(pat,val) { return pat.test(val); }