代碼:
1 import numpy as np 2 from scipy import fft 3 from scipy.io import wavfile 4 from sklearn.linear_model import LogisticRegression 5 import random 6 """ 7 使用logistic regression處理音樂數據,音樂數據訓練樣本的獲得是使用快速傅里葉變換: 8 1.吧訓練集擴大到每類100首歌二部之前的10首歌 9 2.同時使用logistic回歸和KNN作為分類器 10 3.引入一些評價標準來比較logictic和KNN在測試集上的表現 11 """ 12 """ 13 n = 40 14 # hstack數據拼接 15 # 在模擬X的時候使用了兩個正態分布,分別制定各自的均值,方差,生成40個點 16 X = np.hstack((norm.rvs(loc=2, size=n, scale=2), norm.rvs(loc=8, size=n, scale=3))) 17 # zeros使得數據點生成40個0,ones使得數據點生成40個1 18 y = np.hstack((np.zeros(n), np.ones(n))) 19 20 """ 21 general_list = ["classical", "jazz", "country", "pop", "rock", "metal"] 22 """ 23 # 處理原始數據,轉化為特征文件 24 def create_fft(g, n): 25 read = "d:/xxx/"+g+"/conberted/"+g+"."+str(n).zfill(5)+".au.wav" 26 sample_rate, x = wavfile.read(read) 27 fft_features = abs(fft(x)[:1000]) 28 sad = "d:/trainset/"+g+"."+str(n).zfill(5)+".fft" 29 np.save(sad, fft_features) 30 31 32 for g in gener_list: 33 for n in range(100): 34 create_fft(g, n) 35 """ 36 # 加載訓練集數據,分割訓練集和測試集,進行分類器的訓練 37 # 構造訓練集 38 x = [] 39 y = [] 40 for g in general_list: 41 for n in range(100): 42 read = "D:/AnalyseData學習資源庫/人工智能開發【中】/05_分類器項目案例和神經網絡算法【尚學堂·百戰程序員】/資料/trainset/"+g+"."+str(n).zfill(5)+".fft"+".npy" 43 fft_features = np.load(read) 44 x.append(fft_features) 45 y.append(general_list.index(g)) 46 47 x = np.array(x) 48 y = np.array(y) 49 50 # 拆分數據為訓練集和測試集 51 randomIndex = random.sample(range(len(y)), int(len(y)*8/10)) 52 trainX = [] 53 trainY = [] 54 testX = [] 55 testY = [] 56 57 for i in range(len(y)): 58 if i in randomIndex: 59 trainX.append(x[i]) 60 trainY.append(y[i]) 61 else: 62 testX.append(x[i]) 63 testY.append(y[i]) 64 65 # 使用sklearn來構建和訓練兩種分類器 66 67 # logistic classifier 68 model = LogisticRegression() 69 # train 70 model.fit(trainX, trainY) 71 # test 72 predict = model.predict(testX) 73 print(testY) 74 print("--------------------------------------------------") 75 print(predict) 76 # error 77 import math 78 error = 0.0 79 for i in range(len(testY)): 80 if testY[i] != predict[i]: 81 error = error + 1 82 print(error/len(testY)) 83 84 print("starting read wavfile...") 85 sample_rate, test = wavfile.read("D:/AnalyseData學習資源庫/人工智能開發【中】/05_分類器項目案例和神經網絡算法【尚學堂·百戰程序員】/資料/trainset/sample/heibao-wudizirong-remix.wav") 86 testdata_fft_features = abs(fft(test))[:1000] 87 type_index = model.predict([testdata_fft_features])[0] 88 89 print("預測音樂分類為:"+general_list[type_index])
結果:
?