【问题标题】:Don't understand the output of Principal Component Analysis (PCA) in Python不理解 Python 中主成分分析 (PCA) 的输出
【发布时间】:2016-01-18 11:19:02
【问题描述】:

我在 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_

...最后两个组件如下: Final components - two dimensions from 15 wav-files 问题是,我无法在所有维度的原始数据集中找到这两个向量我做错了什么还是我误解了整个事情?

【问题讨论】:

    标签: python audio machine-learning pca principal-components


    【解决方案1】:

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

    【讨论】:

    • 你有两个组件。您有一个 15x2 矩阵,可将原来的 15 个输入转换为 2 个输出。您可以通过检查向量系数的大小来查看哪些贡献最大。例如,输入 #8 对最终 #1 的贡献很大,是第二名的 6 倍。 final #2 主要由输入 5、11 和 8 驱动。这是否有助于理清思路?
    • 那是我不明白的。在文档中它说“组件_:数组,[n_components,n_features]具有最大方差的组件。” (scikit-learn.org/stable/modules/generated/…) 这听起来像我,这些组件也应该出现在原始数据中。我知道 PCA 通常不会将这些值作为其输出。
    • 他们指的是称为主成分的线性不相关变量
    • 现在有意义吗?
    • 由于我们花时间回答您的问题,如果您能以简单的礼貌方式跟进,您会很高兴
    【解决方案2】:

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

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

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

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

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

    【讨论】:

      猜你喜欢
      • 2012-10-24
      • 2013-03-31
      • 1970-01-01
      • 2013-04-07
      • 2015-07-29
      • 1970-01-01
      • 2013-03-28
      • 2013-03-28
      • 2013-03-28
      相关资源
      最近更新 更多