Як намалювати сюжетний осад у пітоні? [зачинено]


11

Я використовую сингулярне векторне розкладання на матриці та отримую матриці U, S та Vt. На даний момент я намагаюся вибрати поріг для кількості розмірів, які потрібно зберегти. Мені запропонували подивитися сюжет осипу, але мені цікаво, як іти про його побудову в нуметі. В даний час я роблю наступне, використовуючи бібліотеки numpy та scipy в python:

U, S, Vt = svd(A)

Будь-які пропозиції?


1
візьміть діагональ S, якщо вона вже не є діагоналлю, квадратуйте її, сортуйте у порядку зменшення, візьміть сукупну суму, діліть на останнє значення, а потім побудуйте її.
shabbychef

@shabbychef: Ти маєш на увазі, взяти сукупну суму і ділити на суму всіх значень правильно?
Легенда

так. У [U,S,V] = svd(X);S = cumsum(sort(diag(S).^2,1,'descend'));S = S ./ S(end);plot(S);
матлабі

Відповіді:


13

Ось приклад, який можна вставити у підказку IPython та створити зображення, як показано нижче (він використовує випадкові дані):

import numpy as np
import matplotlib
import matplotlib.pyplot as plt

#Make a random array and then make it positive-definite
num_vars = 6
num_obs = 9
A = np.random.randn(num_obs, num_vars)
A = np.asmatrix(A.T) * np.asmatrix(A)
U, S, V = np.linalg.svd(A) 
eigvals = S**2 / np.sum(S**2)  # NOTE (@amoeba): These are not PCA eigenvalues. 
                               # This question is about SVD.

fig = plt.figure(figsize=(8,5))
sing_vals = np.arange(num_vars) + 1
plt.plot(sing_vals, eigvals, 'ro-', linewidth=2)
plt.title('Scree Plot')
plt.xlabel('Principal Component')
plt.ylabel('Eigenvalue')
#I don't like the default legend so I typically make mine like below, e.g.
#with smaller fonts and a bit transparent so I do not cover up data, and make
#it moveable by the viewer in case upper-right is a bad place for it 
leg = plt.legend(['Eigenvalues from SVD'], loc='best', borderpad=0.3, 
                 shadow=False, prop=matplotlib.font_manager.FontProperties(size='small'),
                 markerscale=0.4)
leg.get_frame().set_alpha(0.4)
leg.draggable(state=True)
plt.show()

введіть тут опис зображення


Герман: +1 Дякую за ваш час! Я знаю, що минуло давно, але все-таки це дійсно добре мати :)
Легенда

що таке num_vars? схоже, це не визначено у вашому сценарії.
TheChimera

@TheChymera - Дякую, що це зрозумів, я оновив свою відповідь.
Джош Хеман

@Josh Hemann Так, я теж з'ясував це в середній час - але я думаю, що це може бути краще, щоб обчислити це з форми A
TheChymera

1
@JoshHemann чи можете ви пояснити це: eigvals = S ** 2 / np.cumsum (S) [- 1] ?? Я бачив, виходячи з деяких паперів eigvals = S ** 2 / (n-1), де n - кількість особливостей
seralouk
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.