我在音頻頻譜圖上用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 的問題是,我無法找到原始數據集中的所有維度中的那兩個向量我做錯了什麼或者我誤解了整個事情?
你有兩個組件。您有一個15x2矩陣,可將原來的15個輸入轉換爲2個輸出。您可以通過檢查矢量係數的大小來查看哪些數據貢獻最大。例如,輸入#8對最終#1的貢獻很大,是第二位因子的6倍。最終#2主要由輸入5,11和8驅動。 這是否有助於清除事情? – Prune
這就是我不明白的地方。在文檔中,它表示「components_:array,[n_components,n_features]具有最大方差的組件」。 (http://scikit-learn.org/stable/modules/generated/sklearn.decomposition.PCA.html)這聽起來像我這些組件也應該出現在原始數據中。 我知道PCA一般沒有這些值作爲它的輸出。 – Jamona
他們指的是稱爲主成分的線性不相關變量 – user2867432