前提・実現したいこと
音声認識の前処理として25次元の特徴量をベクトル量子化したい
が、LBGアルゴリズム中のk-meansでtrue_divideが発生して値がnanになってしまう。
発生している問題・エラーメッセージ
./data/VOICEACTRESS/VOICEACTRESS100_092.wav.csv clustering.py:33: RuntimeWarning: invalid value encountered in true_divide newCodeVector = np.insert(newCodeVector,0,arr[i]/c[i],axis=0) codebook: [[-1.83411343 -1.49376443 -1.4567248 ... -0.21656539 -0.01772903 -1.48200676] [-1.4706634 -1.04853537 -1.46017812 ... -0.30334002 -0.10616352 -1.21979925] [-1.42753371 -1.24427787 -1.4479376 ... -0.33225537 -0.10152104 -1.16118956] ... [ nan nan nan ... nan nan nan] [ nan nan nan ... nan nan nan] [ nan nan nan ... nan nan nan]]
該当のソースコード
python
1#coding:utf-8 2import numpy as np 3import math 4import os 5import csv 6 7def kmeans(data,codevector): 8 D0 = 100000000000000 9 delta = 0.001 10 T = float('inf') 11 12 newCodeVector = codevector 13 while T > delta: 14 D = 0.0 15 c = [0.0] * len(codevector) 16 #arr = [[0 for i in range(25)] for j in range(len(codevector))] 17 arr = np.zeros((len(codevector),25)) 18 for i in range(len(data)): 19 minDistance = float('inf') 20 dist = float('inf') 21 newCode = 0 22 for j in range(len(c)): 23 dist = math.sqrt(sum((data[i] - newCodeVector[j]) ** 2)) 24 if(dist < minDistance): 25 minDistance = dist 26 newCode = j 27 c[newCode] += 1; 28 arr[newCode] += data[i] 29 D += minDistance 30 31 newCodeVector = np.empty((0,25),dtype="float64") 32 for i in range(len(c)): 33 newCodeVector = np.insert(newCodeVector,0,arr[i]/c[i],axis=0) 34 T = (D0 - D) / (D0 + D) 35 D0 = D 36 37 return newCodeVector 38 39def LBGclustering2(data,size,code): 40 while size > len(code): 41 codebook = np.empty((0,25),dtype="float64") 42 for i in range(len(code)): 43 delta = math.sqrt(sum(code[i] ** 2) / 100) 44 codebook = np.insert(codebook,0,code[i]+delta,axis=0) 45 codebook = np.insert(codebook,0,code[i]-delta,axis=0) 46 47 code = kmeans(data,codebook) 48 49 return code 50 51 52if __name__ == '__main__': 53 data_dir_path = u"./data/VOICEACTRESS/" 54 file_list = os.listdir(r'./data/VOICEACTRESS/') 55 56 data = np.empty((0,25),dtype="float64") 57 ''' 58 for file_name in file_list: 59 root, ext = os.path.splitext(file_name) 60 if ext == u'.csv': 61 62 abs_name = data_dir_path + file_name 63 f = open(abs_name,mode = 'r') 64 csvf = csv.reader(f) 65 header = next(csvf) 66 for row in csvf: 67 print(row) 68 data = np.append(data,row) 69 print(abs_name) 70 f.close() 71 ''' 72 abs_name = data_dir_path + "VOICEACTRESS100_092.wav.csv" 73 f = open(abs_name,mode = 'r') 74 csvf = csv.reader(f) 75 header = next(csvf) 76 for row in csvf: 77 data = np.insert(data,0,row,axis = 0) 78 print(abs_name) 79 f.close() 80 81 #print(data) 82 ave = np.empty((0,25),dtype="float64") 83 ave = np.insert(ave,0,np.sum(data,axis=0) / len(data),axis=0) 84 delta = np.empty((0,25),dtype="float64") 85 delta = np.insert(delta,0,sum(ave) / len(ave) / 100.0,axis=0) 86 codeBook = LBGclustering2(data,256,ave) 87 print("codebook:",codeBook)
試したこと
c[i]が0なのが原因かと考え場合分けなども試しましたがLBGアルゴリズムとは違うものになってしまうと思い削除しました。
補足情報(FW/ツールのバージョンなど)
・LBGclusteringではコードブックの変更しかしておらず、クラスタリングはすべてk-meansにまかせています。
・入力に使っているdataは長さが711の25次元データで、コードブックのサイズを128以上にするとtruedivideが発生するのを確認しました。また、他のファイルも読み込んでデータ数を増やした場合、コードブックのサイズを256以上にした時にtruedivideが発生するようになりました。
あなたの回答
tips
プレビュー