2015-10-19 78 views
0

我在音頻頻譜圖上用Python做了一個PCA,並面臨以下問題:我有一個矩陣,其中每行包含平坦的歌曲特徵。應用PCA後,我很清楚,尺寸減小了。但我無法在常規數據集中找到這些維數據。不理解Python中主成分分析(PCA)的輸出

import sys 
import glob 

from scipy.io.wavfile import read 
from scipy import signal 
from scipy.fftpack import fft 
import numpy as np 
import matplotlib.pyplot as plt 
import pylab 

# Read file to get samplerate and numpy array containing the signal 

files = glob.glob('../some/*.wav') 

song_list = [] 

for wav in files: 

    (fs, x) = read(wav) 

    channels = [ 
     np.array(x[:, 0]), 
     np.array(x[:, 1]) 
    ] 

    # Combine channels to make a mono signal out of stereo 
    channel = np.mean(channels, axis=0) 
    channel = channel[0:1024,] 
    # Generate spectrogram 
    ## Freqs is the same with different songs, t differs slightly 
    Pxx, freqs, t, plot = pylab.specgram(
     channel, 
     NFFT=128, 
     Fs=44100, 
     detrend=pylab.detrend_none, 
     window=pylab.window_hanning, 
     noverlap=int(128 * 0.5)) 
    # Magnitude Spectrum to use 
    Pxx = Pxx[0:2] 
    X_flat = Pxx.flatten() 
    song_list.append(X_flat) 

song_matrix = np.vstack(song_list) 

如果我現在用PCA對song_matrix ...

import matplotlib 
from matplotlib.mlab import PCA 
from sklearn import decomposition 


#test = matplotlib.mlab.PCA(song_matrix.T) 

pca = decomposition.PCA(n_components=2) 
song_matrix_pca = pca.fit_transform(song_matrix.T) 


pca.components_ #These components should be most helpful to discriminate between the songs due to their high variance 
pca.components_ 

...最後2種成分如下: Final components - two dimensions from 15 wav-files 的問題是,我無法找到原始數據集中的所有維度中的那兩個向量我做錯了什麼或者我誤解了整個事情?

回答

0

PCA不會爲您提供數據集中的向量。主成分分析(PCA)是一個統計過程,它使用正交變換將一組可能相關的變量的觀測數據轉換成一組稱爲主成分的線性不相關變量的值。主成分的數量小於或等於原始變量的數量。這種變換是這樣定義的,即第一主成分具有最大可能方差(即,儘可能多地考慮數據中的可變性),並且在約束條件下每個隨後的成分又可能具有最高的方差它與前面的組件是正交的。

+0

你有兩個組件。您有一個15x2矩陣,可將原來的15個輸入轉換爲2個輸出。您可以通過檢查矢量係數的大小來查看哪些數據貢獻最大。例如,輸入#8對最終#1的貢獻很大,是第二位因子的6倍。最終#2主要由輸入5,11和8驅動。 這是否有助於清除事情? – Prune

+0

這就是我不明白的地方。在文檔中,它表示「components_:array,[n_components,n_features]具有最大方差的組件」。 (http://scikit-learn.org/stable/modules/generated/sklearn.decomposition.PCA.html)這聽起來像我這些組件也應該出現在原始數據中。 我知道PCA一般沒有這些值作爲它的輸出。 – Jamona

+0

他們指的是稱爲主成分的線性不相關變量 – user2867432

0

假設你有一個包含一個扁平譜圖的列矢量V. PCA將找到矩陣M,其列是正交向量(將它們視爲與M中每個其他列成直角)。

乘以M和T會得到一個「分數」向量,它可以用來確定M的每列從原始數據中捕獲的方差有多少,每列M捕獲的數據的逐漸減少的方差。

乘以矩陣M'(M的前2列)乘以V將產生表示「降維譜圖」的2×1向量T'。您可以通過將T'乘以M'的倒數來重建V的近似值。如果你有譜圖的矩陣,這也可以工作。只保留兩個主要組件會對您的數據產生極其有損的壓縮。

但是如果你想添加一首新歌到你的數據集呢?除非它與原始歌曲非常相似(意味着它對原始數據集的變化不大),否則沒有理由認爲M的矢量將很好地描述新歌。就此而言,即使將V的所有元素乘以常數也會使M無用。 PCA是相當具體的數據。這就是爲什麼它不用於圖像/音頻壓縮。

好消息?您可以使用離散餘弦變換來壓縮訓練數據。它不是直線,而是找到形成描述性基礎的餘弦,並且不受數據特定限制的影響。 DCT用於JPEG,MP3和其他壓縮方案。