python实现音乐分类_python音乐分类--knn

该博客介绍了使用Python的KNN算法对音乐进行情绪分类,将音乐分为兴奋、愤怒、悲伤和轻松四类。通过提取MFCC特征,加载音乐数据集,并应用KNN算法进行情感分类。
摘要由CSDN通过智能技术生成

1 #利用knn算法分类音乐,将音乐进行情绪分类2 #将音乐分为兴奋的(excited), 愤怒的(angry),悲伤的(sorrowful),轻松的(relaxed)3

4 #可分离因素5 # mfcc6

7 import numpy asnp8 from matplotlib import pyplot asplt9 from scipy import io asspio10 fromsklearn.decomposition import pca11 fromsklearn.preprocessing import StandardScaler12 import librosa13 import librosa.display14 frommutagen.mp3 import MP315 import numpy asnp16 import os17

18 def getFeature(path):19 y, sr =librosa.load(path)20

21 mfccs = librosa.feature.mfcc(y=y, sr=sr, n_mfcc=40)22 mfccNew = np.ravel(mfccs[:, :1000])23 returnmfccNew24

25 def loadDataSet():26 #歌曲的数量27 dataSet = np.zeros((40, 40000))28 labels =[]29

30 excited = r'./musicF/excited'

31 angry = r'./musicF/angry'

32 sorrowful = r'./musicF/sorrowful'

33 relaxed = r'./musicF/relaxed'

34

35 filenames =os.listdir(excited)36 i = 0

37 for filename infilenames:38 print(filename)39 dataSet[i] = getFeature(excited + '/' +filename)40 labels.append('excited')41 i += 1

42

43 filenames =os.listdir(angry)44 for filename infilenames:45 print(filename)46 dataSet[i] = getFeature(angry + '/' +filename)47 labels.append('angry')48 i += 1

49

50 filenames =os.listdir(sorrowful)51 for filename infilenames:52 print(filename)53 dataSet[i] = getFeature(sorrowful + '/' +filename)54 labels.append('sorrowful')55 i += 1

56

57 filenames =os.listdir(relaxed)58 for filename infilenames:59 print(filename)60 dataSet[i] = getFeature(relaxed + '/' +filename)61 labels.append('relaxed')62 i += 1

63

64

65 returndataSet, labels66

67 #欧几里得距离计算相关度68 def kNNClassify(features, dataSet, k, labels):69 numSamples = dataSet.shape[0]70 t = np.tile(features, (numSamples , 1))71

72

73

74 diffVal = t -dataSet #向量操作75

76 squareDiffVal = diffVal ** 2

77 squareDist = np.sum(squareDiffVal,1)78 distance = squareDist ** 0.5

79

80 #对相关度进行排序,相关度由大到小(数值由小到大)81 sortedDistIndices =np.argsort(distance)82

83 classCount ={}84 for i inrange(k):85

86 voteLabel =labels[sortedDistIndices[i]]87 classCount[voteLabel] = classCount.get(voteLabel, 0) + 1

88

89 maxCount = 0

90 ansKey =None91 for key, value inclassCount.items():92 if value >maxCount:93 ansKey =key94 maxCount =value95 returnansKey96

97 #保存文件98 def saveData(dataSet):99 np.savetxt(r'./musicF/dataSet.txt', dataSet)100

101 #从文件中加载数据集并返回102 def loadDataFromFile():103 return np.loadtxt(r'./musicF/dataSet.txt')104

105 #保存标签到文件106 def saveLabels(labels):107 f = open('./musicF/labels.txt','w', encoding="gbk")108 f.write(' '.join(labels))109 f.close()110

111

112 #读取标签数据113 def loadLabels():114 f = open('./musicF/labels.txt','r', encoding="gbk")115 labelsString =f.read()116 f.close()117 labels = labelsString.split(' ')118 returnlabels119

120

121 def classify(path):122 features =getFeature(path)123 #读取数据124 dataSet =loadDataFromFile()125 labels =loadLabels()126 ans = kNNClassify(features, dataSet, 7, labels)127 returnans128

129 def main():130 path = r'./musicF/test/CMJ - 告白之夜(纯音乐)(Cover:Ayasa绚沙).mp3'

131 audio =MP3(path)132 print('音乐时长为:',audio.info.length)133 features =getFeature(path)134 print(features.shape)135

136 dataSet, labels =loadDataSet()137 #保存数据138 saveData(dataSet)139 saveLabels(labels)140

141 # #读取数据142 # dataSet =loadDataFromFile()143 # labels =loadLabels()144

145 ans = kNNClassify(features, dataSet, 7, labels)146 print('labels =', ans)147

148 def addData():149 dataSet, labels =loadDataSet()150 #保存数据151 saveData(dataSet)152 saveLabels(labels)153

154 if __name__ == '__main__':155 #addData()156 main()

KNN(K-近邻)分类算法的python实现如下: 1. 导入必要的库 ```python from sklearn.neighbors import KNeighborsClassifier from sklearn.datasets import load_iris # 用于测试的鸢尾花数据集 from sklearn.model_selection import train_test_split # 用于将数据集划分为训练集和测试集 from sklearn.metrics import accuracy_score # 用于计算分类准确率 ``` 2. 加载测试数据集 ```python iris = load_iris() # 加载鸢尾花数据集 X, y = iris.data, iris.target # 获取数据和标签 X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42) # 将数据集划分为训练集和测试集,测试集占比为30% ``` 3. 创建KNN分类器 ```python knn = KNeighborsClassifier(n_neighbors=3) # 创建KNN分类器,设置K=3 ``` 4. 训练模型 ```python knn.fit(X_train, y_train) # 使用训练集对KNN分类器进行训练 ``` 5. 进行预测 ```python y_pred = knn.predict(X_test) # 使用测试集进行预测 ``` 6. 计算分类准确率 ```python accuracy = accuracy_score(y_test, y_pred) # 计算分类准确率 print('Accuracy:', accuracy) # 输出分类准确率 ``` 完整代码如下: ```python from sklearn.neighbors import KNeighborsClassifier from sklearn.datasets import load_iris from sklearn.model_selection import train_test_split from sklearn.metrics import accuracy_score iris = load_iris() X, y = iris.data, iris.target X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42) knn = KNeighborsClassifier(n_neighbors=3) knn.fit(X_train, y_train) y_pred = knn.predict(X_test) accuracy = accuracy_score(y_test, y_pred) print('Accuracy:', accuracy) ``` 运行结果如下: ``` Accuracy: 1.0 ``` 说明该KNN分类器在测试集上分类准确率为100%。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值