0

我在 Python 中对音频频谱图进行了 PCA,并面临以下问题:我有一个矩阵,其中每一行都包含扁平化的歌曲特征。应用 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 个组件如下: 最终组件 - 来自 15 个 wav 文件 的两个维度问题是,我无法在原始数据集中找到所有维度的这两个向量我做错了什么还是我误解了整个东西?

4

2 回答 2

1

PCA 不会为您提供数据集中的向量。来自维基百科:主成分分析 (PCA) 是一种统计程序,它使用正交变换将一组可能相关的变量的观察值转换为一组称为主成分的线性不相关变量的值。主成分的数量小于或等于原始变量的数量。这种变换是这样定义的,即第一个主成分具有最大可能的方差(即,尽可能多地解释数据中的可变性),并且每个后续成分在约束下又具有最大可能的方差它与前面的组件正交。

于 2015-10-19T23:54:08.253 回答
1

假设您有一个包含一个扁平频谱图的列向量 V。PCA 将找到一个矩阵 M,其列是正交向量(将它们视为与 M 中的每个其他列成直角)。

将 M 和 T 相乘将为您提供一个“分数”向量,该向量可用于确定 M 的每一列从原始数据中捕获多少方差,而 M 的每一列从数据中捕获的方差逐渐减少。

将矩阵 M'(M 的前 2 列)乘以 V 将产生一个 2x1 向量 T',表示“降维频谱图”。您可以通过将 T' 乘以 M' 的倒数来重构 V 的近似值。如果您也有频谱图矩阵,这将起作用。仅保留两个主要组件会产生极其有损的数据压缩。

但是如果你想在你的数据集中添加一首新歌呢?除非它非常像原始歌曲(意味着它对原始数据集几乎没有变化),否则没有理由认为 M 的向量可以很好地描述新歌曲。就此而言,即使将 V 的所有元素乘以一个常数也会使 M 无用。PCA 是非常特定于数据的。这就是为什么它不用于图像/音频压缩的原因。

好消息?您可以使用离散余弦变换来压缩您的训练数据。它不是线,而是找到形成描述基础的余弦,并且不受数据特定限制的影响。DCT 用于 jpeg、mp3 和其他压缩方案。

于 2016-05-05T18:09:22.560 回答