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)

ここで song_matrix に PCA を適用すると...

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 ファイルからの 2 つの次元 問題は、元のデータセットでこれらの 2 つのベクトルがすべての次元で見つからないことです。全部?

4

2 に答える 2

1

PCA は、データセット内のベクトルを提供しません。ウィキペディアから: 主成分分析 (PCA) は、直交変換を使用して、相関している可能性のある変数の一連の観測値を、主成分と呼ばれる線形に相関していない変数の一連の値に変換する統計的手順です。主成分の数は、元の変数の数以下です。この変換は、最初の主成分の分散が可能な限り最大になるように定義され (つまり、データの変動を可能な限り多く考慮し)、次の各主成分が制約の下で可能な最大の分散を持つように定義されます。前のコンポーネントに直交すること。

于 2015-10-19T23:54:08.253 に答える
1

1 つの平坦化されたスペクトログラムを含む列ベクトル V があるとします。PCA は、列が直交ベクトルである行列 M を見つけます (それらは、M の他のすべての列に対して直角であると考えてください)。

M と T を乗算すると、「スコア」のベクトルが得られます。これを使用して、M の各列が元のデータからどの程度の分散をキャプチャし、M の各列がデータの分散を徐々に小さくしていくかを判断できます。

行列 M' (M の最初の 2 列) を V で乗算すると、「次元縮小スペクトログラム」を表す 2x1 ベクトル T' が生成されます。T' に M' の逆数を掛けることで、V の近似値を再構築できます。これは、スペクトログラムのマトリックスもある場合に機能します。主成分を 2 つだけ保持すると、データの損失が非常に大きくなります。

しかし、データセットに新しい曲を追加したい場合はどうすればよいでしょうか? 元の曲に非常によく似ていない限り (元のデータ セットにほとんど差異が生じないことを意味します)、M のベクトルが新しい曲を適切に説明すると考える理由はありません。さらに言えば、V のすべての要素に定数を掛けても、M は役に立たなくなります。PCA はかなりデータ固有です。これが、画像/音声圧縮で使用されない理由です。

良いニュース?離散コサイン変換を使用して、トレーニング データを圧縮できます。線の代わりに、記述的な基礎を形成する余弦を見つけ、データ固有の制限に悩まされません。DCT は、jpeg、mp3、およびその他の圧縮方式で使用されます。

于 2016-05-05T18:09:22.560 に答える