SVD - Python Matrix Conversion

An attempt to compute SVD in Python to find the most significant elements of the spectrum and create a matrix containing only the most significant parts.

In python, I have:

u,s,v = linalg.svd(Pxx, full_matrices=True) 

This returns 3 matrices; where "s" contains the values ​​corresponding to u, v.

To build a new matrix containing all the significant parts of the signal, I need to fix the highest values ​​in "s" and match them with the columns in "u" and "v", and the resulting matrix should give me the most significant part of the data.

The problem is that I don’t know how to do this in Python, for example, how to find the highest numbers in "s" and select the columns in "u" and "v" to create a new matrix?

(I'm new to Python and numpy), so any help would be greatly appreciated

Edit:

 import wave, struct, numpy as np, matplotlib.mlab as mlab, pylab as pl from scipy import linalg, mat, dot; def wavToArr(wavefile): w = wave.open(wavefile,"rb") p = w.getparams() s = w.readframes(p[3]) w.close() sd = np.fromstring(s, np.int16) return sd,p def wavToSpec(wavefile,log=False,norm=False): wavArr,wavParams = wavToArr(wavefile) print wavParams return mlab.specgram(wavArr, NFFT=256,Fs=wavParams[2],detrend=mlab.detrend_mean,window=mlab.window_hanning,noverlap=128,sides='onesided',scale_by_freq=True) wavArr,wavParams = wavToArr("wavBat1.wav") Pxx, freqs, bins = wavToSpec("wavBat1.wav") Pxx += 0.0001 U, s, Vh = linalg.svd(Pxx, full_matrices=True) assert np.allclose(Pxx, np.dot(U, np.dot(np.diag(s), Vh))) s[2:] = 0 new_a = np.dot(U, np.dot(np.diag(s), Vh)) print(new_a) 
+7
python matplotlib matrix svd
source share
1 answer

linalg.svd returns s in descending order. Therefore, to select n the highest numbers in s , you simply form

 s[:n] 

If you set lower s values ​​to zero,

 s[n:] = 0 

then matrix multiplication will take care of the “selection” of the corresponding columns U and V.

For example,

 import numpy as np LA = np.linalg a = np.array([[1, 3, 4], [5, 6, 9], [1, 2, 3], [7, 6, 8]]) print(a) # [[1 3 4] # [5 6 9] # [1 2 3] # [7 6 8]] U, s, Vh = LA.svd(a, full_matrices=False) assert np.allclose(a, np.dot(U, np.dot(np.diag(s), Vh))) s[2:] = 0 new_a = np.dot(U, np.dot(np.diag(s), Vh)) print(new_a) # [[ 1.02206755 2.77276308 4.14651336] # [ 4.9803474 6.20236935 8.86952026] # [ 0.99786077 2.02202837 2.98579698] # [ 7.01104783 5.88623677 8.07335002]] 

Given the data here ,

 import numpy as np import scipy.linalg as SL import matplotlib.pyplot as plt Pxx = np.genfromtxt('mBtasJLD.txt') U, s, Vh = SL.svd(Pxx, full_matrices=False) assert np.allclose(Pxx, np.dot(U, np.dot(np.diag(s), Vh))) s[2:] = 0 new_a = np.dot(U, np.dot(np.diag(s), Vh)) print(new_a) plt.plot(new_a) plt.show() 

produces

enter image description here

+11
source share

All Articles