Professional Documents
Culture Documents
Machine Learning
and the Intelligent Music Application
關於我
Fukuball / 林林志傑
幕僚僚⼯工程師
2006 年年的契機
為何要發展智慧系統?
如果不在 90 秒內抓
住使⽤用者的注意⼒力力,
可能就會失去這名
使⽤用者了了!
我也想做智慧⾳音樂系統!
會員數從 2 萬增加⾄至 50 萬
Fukuball Lin @ 資策會資訊處
簡介
iNDIEVOX 是什什麼?
iNDIEVOX 簡介
獨立⾳音樂⼈人 歌迷
50 餘萬會員
100 萬⽉月瀏覽次數
7000 餘組⾳音樂⼈人 平均停留留時間 17 分
12000 餘⾸首原創歌曲
20 餘家 Live House
⾼高⾳音質 DRM Free 線上⾳音樂商店
各⼤大⾳音樂祭
全台 Live House ⾨門票販售
⾳音樂社群平台
⽣生態系統的完整藍藍圖
Pack
Talent Network
Promotion
Distribution
Song Placement
Media Partners
iNDIEVOX 只是完整獨立⾳音樂
⽣生態系統中的⼀一⼩小塊
進入正題,iNDIEVOX 智慧⾳音樂三寶
Fukuball Lin @ 資策會資訊處
火⼒力力展⽰示
購買關聯聯推薦
Fukuball Lin @ 資策會資訊處
火⼒力力展⽰示
⼼心情電台
Fukuball Lin @ 資策會資訊處
火⼒力力展⽰示
VA ⼼心情 DJ 電台
Fukuball Lin @ 資策會資訊處
I HAVE NO IDEA
那要怎麼做呢?
智慧
⾳音樂
Apriori 演算法簡介(1)
• 快速計算關聯聯規則的著名演算法
• 關聯聯規則:符合「⽀支持度」、「信任度」的交
易易品項集合
• ⽀支持度:品項 A 與 品項 B 同時出現在交易易中
的機率
• 信任度:交易易中有品項 A 然後也會有品項 B 的
機率
Fukuball Lin @ 資策會資訊處
購買關聯聯
Apriori 演算法簡介(2)
購買關聯聯簡易易範例例(1)
require_once('library/Apriori/lib/Apriori.class.php');
$minSupp = 5;
$minConf = 75;
$type = Apriori::SRC_PLAIN;
$recomFor = 'beer';
$data = 'lesson1_dataset.txt';
購買關聯聯簡易易範例例(2)
執⾏行行
$ php lesson1_apriori.php
結果
購買關聯聯實務上的問題
• 使⽤用 iNDIEVOX 開源的 Buy
Together Discs Dataset 或 Buy
Together Songs Dataset
• 實務上⽀支持度及信任度都要設很低
才跑得出結果(因為交易易品項多,
關聯聯規則較為稀疏)
Fukuball Lin @ 資策會資訊處
⼼心情電台技術解析
分類問題
• 將⾳音樂分成輕鬆、快樂、
興奮、憂鬱、悲傷、憤怒,
其實就是⼀一種分類問題
• 分類在數學物理理意義上,
就是在空間中找到⼀一個可
以正確分開訓練資料的超
平⾯面
Fukuball Lin @ 資策會資訊處
⼼心情電台
SVM 分類模型簡介(1)
• 分類模型很多,我們這邊使⽤用的是
Soft Gaussian SVM
SVM 分類模型簡介(2)
SVM 分類模型簡介(3)
機器學習過程
• 特徵萃取
• 產⽣生資料集
• 訓練
• Cross Validation
• 預測
Fukuball Lin @ 資策會資訊處
⼼心情電台
特徵萃取(1)
• ⾳音樂⾳音訊特徵萃取:使⽤用 PyAudio
特徵萃取(2)
• 透過 iNDIEVOX Open API 取得特徵值
• Ex. https://www.indievox.com/api/mir/song/feature/1?
app_id=P300000045&app_secret=9bdecdb004682865260
c9d2a5cc71f0d
特徵萃取(3)
產⽣生資料集
• 為資料上標籤,這邊就是為歌曲標上分類
• 將多筆資料組成資料集
訓練
• 使⽤用 fuku-ml 訓練⼼心情分類模型
import os
import FukuML.Utility as utility
import FukuML.SupportVectorMachine as svm
input_train_data_file = os.path.join(os.path.join(os.getcwd(),
os.path.dirname(__file__)), 'library/iNDIEVOX-Dataset/dataset/
emotion_combine_song_train.dataset')
svm_mc = svm.MultiClassifier()
svm_mc.load_train_data(input_train_data_file)
// 載入資料集
svm_mc.set_param(svm_kernel='soft_gaussian_kernel', C=1)
// 設定參參數
svm_mc.init_W()
svm_mc.train()
// 訓練
Fukuball Lin @ 資策會資訊處
⼼心情電台
Cross Validation
• 使⽤用 Cross Validation 挑選參參數
cross_validator = utility.CrossValidator()
svm_mc1 = svm.MultiClassifier()
svm_mc1.load_train_data(input_train_data_file)
svm_mc1.set_param(svm_kernel='soft_gaussian_kernel', C=1)
svm_mc2 = svm.MultiClassifier()
svm_mc2.load_train_data(input_train_data_file)
svm_mc2.set_param(svm_kernel='soft_gaussian_kernel', C=10)
svm_mc3 = svm.MultiClassifier()
svm_mc3.load_train_data(input_train_data_file)
svm_mc3.set_param(svm_kernel='soft_gaussian_kernel', C=100)
cross_validator.add_model(svm_mc1)
cross_validator.add_model(svm_mc2)
cross_validator.add_model(svm_mc3)
avg_errors = cross_validator.excute()
best_model = cross_validator.get_best_model()
預測
• 模型訓練好之後,就可以拿來來做分類預測
best_model.init_W()
best_model.train()
prediction = best_model.prediction(future_data,
mode='future_data')
⼼心情電台範例例
執⾏行行
$ python lesson2_svm_classification.py
結果
迴歸問題
• 將⾳音樂對應到 Valence
Arousal ⼆二維平⾯面,Valence
跟 Arousal 各⾃自是⼀一個實
數,其實就是迴歸問題
feature transform
• 迴歸在數學物理理意義上,就
是在空間中找到⼀一個與所有
資料點平⽅方距離最⼩小的超平
⾯面
Fukuball Lin @ 資策會資訊處
VA 電台
機器學習過程
• 特徵萃取
• 產⽣生資料集
• 訓練
• Cross Validation
• 預測
Fukuball Lin @ 資策會資訊處
VA 電台
特徵萃取
• ⽅方法跟之前的⽅方法⼀一樣!
產⽣生資料集
• 為資料上標籤,這邊就是為歌曲標上 Valence 值
• 將多筆資料組成資料集
訓練
• 使⽤用 fuku-ml 訓練 Valence 迴歸模型
import os
import FukuML.Utility as utility
import FukuML.RidgeRegression as ridge_regression
input_train_data_file = os.path.join(os.path.join(os.getcwd(),
os.path.dirname(__file__)), 'library/iNDIEVOX-Dataset/dataset/
valence_train.dataset')
ridge = ridge_regression.RidgeRegression()
ridge.load_train_data(input_train_data_file)
// 載入資料集
ridge.set_feature_transform('legendre', 2)
ridge.set_param(lambda_p=0.01)
// 設定參參數
ridge.init_W()
ridge.train()
// 訓練
Fukuball Lin @ 資策會資訊處
VA 電台
Cross Validation
• 使⽤用 Cross Validation 挑選參參數
cross_validator = utility.CrossValidator()
ridge_regression1 = ridge_regression.RidgeRegression()
ridge_regression1.load_train_data(input_train_data_file)
ridge_regression1.set_feature_transform('legendre', 2)
ridge_regression1.set_param(lambda_p=0)
ridge_regression2 = ridge_regression.RidgeRegression()
ridge_regression2.load_train_data(input_train_data_file)
ridge_regression2.set_feature_transform('legendre', 2)
ridge_regression2.set_param(lambda_p=0.01)
cross_validator.add_model(ridge_regression1)
cross_validator.add_model(ridge_regression2)
avg_errors = cross_validator.excute()
best_model = cross_validator.get_best_model()
預測
• 模型訓練好之後,就可以拿來來做迴歸預測
best_model.init_W()
best_model.train()
prediction = best_model.prediction(future_data,
mode='future_data')
VA ⼼心情電台範例例
執⾏行行
$ python lesson3_ridge_regression.py
結果
啊~~~
智慧⾳音樂
離開 iNDIEVOX 之後
中⽂文歌詞相似推薦系統 (1)
• Step 1:中⽂文斷詞,集合成資料集
• Step 2:去掉停⽤用字
• Step 3:將每⾸首歌詞轉成向量量表⽰示(doc2vec)
中⽂文歌詞相似推薦系統 (2)
Demo
中⽂文歌詞相似推薦系統 (3)
• 輸入:楊培安 我的驕傲 歌詞
• 輸出:
• 楊培安 我的驕傲
• 五⽉月天 倔強
• 張雨⽣生 我的未來來不是夢
• 五⽉月天 憨⼈人
• 五⽉月天 ⼀一顆蘋果
中⽂文歌詞相似推薦系統 (4)
《 我的驕傲》節錄 《 倔強》節錄
LSA 潛在語意分析(1)
LSA 潛在語意分析(2)
row 1 有關愛情的字詞值都較⾼高,所以Topic1應代表愛情
row 2 有關夢想的字詞值都較⾼高,所以Topic2應代表夢想
原本要⽤用12個詞來來描述歌詞,現在只要⽤用兩兩個Topic就可以描述
表⽰示歌詞如何⽤用兩兩種Topic來來呈現,可明顯看出有兩兩類歌詞
Fukuball Lin @ iThome TechTalk 、
補充說明
LSA 潛在語意分析(3)
能夠完整呈現歌詞情意
中⽂文歌詞相似推薦系統 (5)
• 輸入:周杰倫倫 安靜 歌詞
• 輸出:
• 周杰倫倫 安靜
• 黃品源 那麼愛你為什什麼
• 孫燕姿 我不難過
• 陳奕迅 婚禮的祝福
• 周杰倫倫 斷了了的弦
那就去做做看!
在我⼯工作之餘
完成的!
Twitter @fukuball
Github @fukuball
Facebook @fukuball