Java實現經過日語元音ae的發音曲線分類9個發音者

  1. 業務理解(Business Understanding)
    該業務是分類問題。須要對9我的的日語元音ae的發音分析,而後根據分析肯定9名發音者。ae.train文件是訓練數據集,ae.test文件是用來測試訓練效果的,size_ae.test記錄了每一個發音者對應的ae.test數據文件中包含數據的對應塊,同理size_ae.train記錄了實際結果每一個塊對應的發音者。
  2. 數據理解(Data Understanding):
    (1) 概述:數據是驗證多維時間序列曲線分類的。九個發音者發出兩個日本元音/ae/前後。對於每一個發音分析參數,採用12度線性預測分析,以它來取得的LPC倒譜系數(LPCC)12離散時間序列。這意味着,一個接一個發音者話語造成一個時間序列,其長度的範圍是7-29,每個時間序列是12個特徵值。
    在時間序列數共分640塊。270塊用作訓練,用370塊進行測試。270塊對應着ae.train文件,370塊數據對應着ae.test文件。
    (2)訓練集數據理解:size_ae.train中的數據是30 30 30 30 30 30 30 30 30,表示9個發音者對應的數據塊數(1-30塊對應着第一個說話者,31-60對應第二個說話者,以此類推),這是 ae.train中的數據發音者對應發音的狀況;在ae.train中有270塊數據,塊與塊之間有一個空行做爲分割的標誌。其中每塊數據中包含的行數爲7到29不等,每行表明着發音者的一個時間幀。每行包含了12屬性列,由於使用的是12LPCC。
    (3) 測試集數據有兩種方式理解:
    在ae.test中有370塊數據,塊與塊之間有一個空行做爲分割的標誌。其中每塊數據中包含的行數爲7到29不等,每行表明着發音者的一個時間幀。每行包含了12屬性列。
    方式A:size_ae.test中的數據是31 35 88 44 29 24 40 50 29,表示9個發音者對應的數據塊數(1-31對應着第一個說話者,以此類推)。則樣本集是以分塊爲單位,即對應9個待估計樣本,預測這9我的對應的發音者。
    方式B:ae.test對應的370塊對應不一樣人的發音測試樣本,如此就須要對370個樣本判斷對應的發音者(1-9類發音者)。
    預測:我採用了B鍾方式的理解作的,因爲B中方式的樣本太少,預測正確率必定比A低。(因爲時間有限,沒有去實現A方式的的預測,B正確率90.5%)
    (4) 數據預處理:因爲從ae.train和ae.test數據文件看,沒有缺失值,一共12維,每維數據範圍差距以及不一樣數據維差距都不大,因此不須要對數據進行歸一化處理。暫且認定數據質量是完整的,沒有出錯的。
  3. 數據準備(Data Preparation)
    (1)數據選擇:12維的數據都要選擇,都是重要屬性組成
    (2)數據清潔:由觀察可忽略數據源可能在測試或人爲記錄中的錯誤,忽略噪音,沒有缺失值,不須要人爲對缺失值處理等;
    (3)數據建立:在原有數據的基礎上根據塊的劃分,將270塊按照size_ae.train文件要求以30一份劃分爲9類,分別對應9我的不一樣發音類,在12維數據以前加上tagClass做爲類的標誌(tagClass:1-9),創建13維;
    (4)數據合併:沒有須要合併的數據,在數據準備階段,中間處理過程有須要合併的;
    (5)數據格式化:由訓練集文件得12維的數據格式都是數字類型,double型,並且都是保留6位小數,若是保留小數位不統一,則須要進行處理,使數據格式一致,但文檔中數據格式已經比較規範,並且不一樣數據維之間都是用空格間隔。
  4. 創建模型(Modeling)
    (1) 模型設計,設計方案:
    A. 在訓練集中,有270個塊,對於每一塊,取每列(維)的平均值做爲該塊維度的一個評估,這樣可保證每一個塊每維數據獨立於其餘塊的維度數據,以塊做爲單位進行數據處理。即把每一塊的數據,至關於一個(7-29)行12列的矩陣,轉化爲一個12維的list或數組,轉化過程以每塊每維的平均值做爲list值組成。
    B. 由上一步能夠獲得一個270行12列的大矩陣(或者簡單說是270個list),而後對270個進行類劃分,根據size_ae.train文件要求以30一份劃分爲9類,分別對應9我的不一樣發音類,即對應9人,每一個人有一個矩陣30*12,添加一個屬性tagClass(1-9),標誌不一樣的類,即不一樣矩陣屬於對應的類(1-9);
    C. 把測試樣本(以370個爲單位),把每一個樣本代入到以上9類(9個矩陣)計算歐幾里德距離,取最小距離所在的類爲樣本歸屬類。
  5. 模型評估(Evaluation)
    (1)預測結果:運行結果以下圖 ,包括文件讀取和生成之類的,在最後一個main函數裏面調用,用了1.407秒。
    圖片描述

(2) 結果評估:因爲選取了每一個塊中的每維平均值作爲該塊該維的平均值,在數值上沒問題,但忽略了該維中時間序列(7-29)間的順序值特徵,因此此問題是致使算法估計沒有獲得更高準確率的緣由。
(3)算法改進:
第一步: 對每一個分塊,每一維分別創建時間序列(7-29)和對應的具體值的線性迴歸方程(y=kx+b),由於直線的斜率能反應分塊時間序列變化對應的具體值的變化趨勢,同時加了b後整個值能反映某維值範圍。而後抽取整個塊的每維值(k,b),則每一個塊能轉換爲list,list裏面有1行,24列的矩陣,Eg:(k1,b1,k2,b2,k3,b3,k4,b4……….k12,b12)
第二步:把測試集370個樣本也轉換爲370個list,而後算歐幾里德距離。
例如:對應測試集(k1’,b1’,…………………….k12’,b12’)
計算距離:Distance = Math.sqrt(Math.pow((k1-k1’),2)+ Math.pow((b1-b1’),2))+….. +Math.sqrt(Math.pow((k12-k12’),2)+ Math.pow((b12-b12’),2));
而後取距離最小所在的類做爲該測試集樣本類,這個估計算法機率能夠達到95%及以上。java

(2) 算法實現:
A.項目框架
圖片描述算法

B.各種函數及做用分析
(本人以爲沒有特別複雜的函數實現,故沒複製代碼解釋 ,具體實現看項目代碼)
 ReadWriteTest.java: 讀取處理文件格式,把270塊->270「行」->9個矩陣(加上類標,但獨立保存每一個矩陣對應的30行)
①writerTxt函數:
input:內容,路徑 (把內容寫到指定文件)
output:多個文件D://bigdata//test-270.txt,D://bigdata//train-9-30.txt,
②readTxt函數:
對原數據進行格式處理->1把270塊轉換爲270行;2. 把270行分爲9類,加上類標
intput:讀的路徑,flag 0,1分別對train,test作不一樣處理
output:多出2個txt文件 內容,test-270.txt,train-9-30
 SampleClassify.java: 測試樣本,輸出預測值
①mapSpeakers變量:
存儲全部發音者類對應其行(每行是一個塊的轉換), key是發音者類,value是對應30個行(用二維數組存儲)
②getSpeakerMatrix函數:初始化矩陣,30
13
③readTxtTrain函數:取train文件值,存儲到mapSpeakers中
④readTxtTest函數:
讀取test中370個sample,每一個sample進行和9個類的距離計算,而後存在數組中,而後比較獲得最小的,最小所在類便是該sample所屬類(發音者)
⑤ getClassifyTag函數:
返回距離最近的那個類的標號:1-9之間 sample 是1-370塊中的樣本,是一個一維數組,長度13,第一位表示下標
 CheckoutCorrect.java: 驗證正確率數組

①blockArr數組: 定義劃分塊,使方便能根據塊輸出samplId tagClass,
方便本身預測值於實際預測文件中值進行比較
②outputCompareTest:ae.train的結果經過size_ae.train劃分,存儲到文件compare.txt中,格式:sampleId tagClass
③predictionCorrect:比較兩個文件內容,輸出正確預測值的機率框架

具體代碼參考bitbucket地址:bitbucket 原代碼函數

相關文章
相關標籤/搜索